
s/factorize/Refactor/ On 03/05/2018 12:21 PM, Cédric Bosdonnat wrote:
lxcDomainBlockStats and lxcDomainBlockStatsFlags were both using very similar code. This commit factorizes them into a
s/factorsizes/refactors
lxcDomainBlockStatsInternal. --- src/lxc/lxc_driver.c | 131 ++++++++++++++++++++------------------------------- 1 file changed, 50 insertions(+), 81 deletions(-)
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index fa6fc4643..a16dbcc96 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -2348,28 +2348,22 @@ lxcDomainMergeBlkioDevice(virBlkioDevicePtr *dest_array, return 0; }
Two empty lines between functions
- -static int -lxcDomainBlockStats(virDomainPtr dom, - const char *path, - virDomainBlockStatsPtr stats) +static int lxcDomainBlockStatsInternal(virLXCDriverPtr driver, + virDomainObjPtr vm, + const char *path, + long long *rd_bytes, + long long *wr_bytes, + long long *rd_req, + long long *wr_req)
Preference is static int lxcDomainBlockStatsInternal(args) The downside of passing 4 args is that sometime in the future there's 4 more stats to collect, then 4 more... I think you could just pass the stats pointer here
{ - virLXCDriverPtr driver = dom->conn->privateData; int ret = -1; - virDomainObjPtr vm; virDomainDiskDefPtr disk = NULL; virLXCDomainObjPrivatePtr priv;
- if (!(vm = lxcDomObjFromDomain(dom))) - return ret; - priv = vm->privateData;
- if (virDomainBlockStatsEnsureACL(dom->conn, vm->def) < 0) - goto cleanup; - if (virLXCDomainObjBeginJob(driver, vm, LXC_JOB_QUERY) < 0) - goto cleanup; + return -1;
if (!virDomainObjIsActive(vm)) { virReportError(VIR_ERR_OPERATION_INVALID, @@ -2386,10 +2380,10 @@ lxcDomainBlockStats(virDomainPtr dom, if (!*path) { /* empty path - return entire domain blkstats instead */ ret = virCgroupGetBlkioIoServiced(priv->cgroup, - &stats->rd_bytes, - &stats->wr_bytes, - &stats->rd_req, - &stats->wr_req); + rd_bytes, + wr_bytes, + rd_req, + wr_req);
Existing, but if ret < 0, then we return with a generic failed for some unknown reason. You could add the message from lxcDomainBlockStatsFlags of _("domain stats query failed") if (ret < 0) Probably would make the following goto stand out or you could use the if {} else {} like lxcDomainBlockStatsFlags does. That's your call.
goto endjob; }
@@ -2407,13 +2401,36 @@ lxcDomainBlockStats(virDomainPtr dom,
ret = virCgroupGetBlkioIoDeviceServiced(priv->cgroup, disk->info.alias, - &stats->rd_bytes, - &stats->wr_bytes, - &stats->rd_req, - &stats->wr_req); + rd_bytes, + wr_bytes, + rd_req, + wr_req);
endjob: virLXCDomainObjEndJob(driver, vm); + return ret; +} +
2 empty lines
+static int +lxcDomainBlockStats(virDomainPtr dom, + const char *path, + virDomainBlockStatsPtr stats) +{ + virLXCDriverPtr driver = dom->conn->privateData; + virDomainObjPtr vm; + int ret = -1; + + if (!(vm = lxcDomObjFromDomain(dom))) + return -1; + + if (virDomainBlockStatsEnsureACL(dom->conn, vm->def) < 0) + goto cleanup; + + ret = lxcDomainBlockStatsInternal(driver, vm, path, + &stats->rd_bytes, + &stats->wr_bytes, + &stats->rd_req, + &stats->wr_req);
cleanup: virDomainObjEndAPI(&vm); @@ -2431,8 +2448,6 @@ lxcDomainBlockStatsFlags(virDomainPtr dom,
Could we take the opportunity to "alter" the "const char * path" to be "const char *path"... Same for "int * nparams".
virLXCDriverPtr driver = dom->conn->privateData; int tmp, ret = -1; virDomainObjPtr vm; - virDomainDiskDefPtr disk = NULL; - virLXCDomainObjPrivatePtr priv; long long rd_req, rd_bytes, wr_req, wr_bytes;
Change these to be: virDomainBlockStats stats = { 0 }; and pass &stats to lxcDomainBlockStatsInternal and use the stats.* values results that you want to use in the virTypedParameterAssign calls
virTypedParameterPtr param;
@@ -2449,60 +2464,17 @@ lxcDomainBlockStatsFlags(virDomainPtr dom, if (!(vm = lxcDomObjFromDomain(dom))) return ret;
- priv = vm->privateData; - if (virDomainBlockStatsFlagsEnsureACL(dom->conn, vm->def) < 0) goto cleanup;
- if (virLXCDomainObjBeginJob(driver, vm, LXC_JOB_QUERY) < 0) + if (lxcDomainBlockStatsInternal(driver, vm, path, + &rd_bytes, + &wr_bytes, + &rd_req, + &wr_req) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("domain stats query failed"));
This will overwrite what lxcDomainBlockStatsInternal had and return this message. As noted above, perhaps this message needs to move into the *Internal function and be displayed when virCgroupGetBlkioIoServiced fails. John
goto cleanup; - - if (!virDomainObjIsActive(vm)) { - virReportError(VIR_ERR_OPERATION_INVALID, - "%s", _("domain is not running")); - goto endjob; - } - - if (!virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_BLKIO)) { - virReportError(VIR_ERR_OPERATION_INVALID, "%s", - _("blkio cgroup isn't mounted")); - goto endjob; - } - - if (!*path) { - /* empty path - return entire domain blkstats instead */ - if (virCgroupGetBlkioIoServiced(priv->cgroup, - &rd_bytes, - &wr_bytes, - &rd_req, - &wr_req) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("domain stats query failed")); - goto endjob; - } - } else { - if (!(disk = virDomainDiskByName(vm->def, path, false))) { - virReportError(VIR_ERR_INVALID_ARG, - _("invalid path: %s"), path); - goto endjob; - } - - if (!disk->info.alias) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("missing disk device alias name for %s"), disk->dst); - goto endjob; - } - - if (virCgroupGetBlkioIoDeviceServiced(priv->cgroup, - disk->info.alias, - &rd_bytes, - &wr_bytes, - &rd_req, - &wr_req) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("domain stats query failed")); - goto endjob; - } }
tmp = 0; @@ -2512,7 +2484,7 @@ lxcDomainBlockStatsFlags(virDomainPtr dom, param = ¶ms[tmp]; if (virTypedParameterAssign(param, VIR_DOMAIN_BLOCK_STATS_WRITE_BYTES, VIR_TYPED_PARAM_LLONG, wr_bytes) < 0) - goto endjob; + goto cleanup; tmp++; }
@@ -2520,7 +2492,7 @@ lxcDomainBlockStatsFlags(virDomainPtr dom, param = ¶ms[tmp]; if (virTypedParameterAssign(param, VIR_DOMAIN_BLOCK_STATS_WRITE_REQ, VIR_TYPED_PARAM_LLONG, wr_req) < 0) - goto endjob; + goto cleanup; tmp++; }
@@ -2528,7 +2500,7 @@ lxcDomainBlockStatsFlags(virDomainPtr dom, param = ¶ms[tmp]; if (virTypedParameterAssign(param, VIR_DOMAIN_BLOCK_STATS_READ_BYTES, VIR_TYPED_PARAM_LLONG, rd_bytes) < 0) - goto endjob; + goto cleanup; tmp++; }
@@ -2536,16 +2508,13 @@ lxcDomainBlockStatsFlags(virDomainPtr dom, param = ¶ms[tmp]; if (virTypedParameterAssign(param, VIR_DOMAIN_BLOCK_STATS_READ_REQ, VIR_TYPED_PARAM_LLONG, rd_req) < 0) - goto endjob; + goto cleanup; tmp++; }
ret = 0; *nparams = tmp;
- endjob: - virLXCDomainObjEndJob(driver, vm); - cleanup: virDomainObjEndAPI(&vm); return ret;