提交 985f035f 编写于 作者: M Michal Privoznik

storage: Drop and reacquire pool obj lock in some backends

https://bugzilla.redhat.com/show_bug.cgi?id=1711789

Starting up or building some types of pools may take a very long
time (e.g. a misconfigured NFS). Holding the pool object locked
throughout the whole time hurts concurrency, e.g. if there's
another thread that is listing all the pools.
Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 13284a6b
...@@ -461,7 +461,10 @@ virStorageBackendDiskStartPool(virStoragePoolObjPtr pool) ...@@ -461,7 +461,10 @@ virStorageBackendDiskStartPool(virStoragePoolObjPtr pool)
const char *format; const char *format;
const char *path = def->source.devices[0].path; const char *path = def->source.devices[0].path;
/* This can take a significant amount of time. */
virObjectUnlock(pool);
virWaitForDevices(); virWaitForDevices();
virObjectLock(pool);
if (!virFileExists(path)) { if (!virFileExists(path)) {
virReportError(VIR_ERR_INVALID_ARG, virReportError(VIR_ERR_INVALID_ARG,
...@@ -490,6 +493,7 @@ virStorageBackendDiskBuildPool(virStoragePoolObjPtr pool, ...@@ -490,6 +493,7 @@ virStorageBackendDiskBuildPool(virStoragePoolObjPtr pool,
int format = def->source.format; int format = def->source.format;
const char *fmt; const char *fmt;
VIR_AUTOPTR(virCommand) cmd = NULL; VIR_AUTOPTR(virCommand) cmd = NULL;
int ret = -1;
virCheckFlags(VIR_STORAGE_POOL_BUILD_OVERWRITE | virCheckFlags(VIR_STORAGE_POOL_BUILD_OVERWRITE |
VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, -1); VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, -1);
...@@ -523,7 +527,12 @@ virStorageBackendDiskBuildPool(virStoragePoolObjPtr pool, ...@@ -523,7 +527,12 @@ virStorageBackendDiskBuildPool(virStoragePoolObjPtr pool,
"--script", "--script",
fmt, fmt,
NULL); NULL);
return virCommandRun(cmd, NULL);
virObjectUnlock(pool);
ret = virCommandRun(cmd, NULL);
virObjectLock(pool);
return ret;
} }
......
...@@ -317,7 +317,14 @@ virStorageBackendFileSystemMount(virStoragePoolObjPtr pool) ...@@ -317,7 +317,14 @@ virStorageBackendFileSystemMount(virStoragePoolObjPtr pool)
return -1; return -1;
cmd = virStorageBackendFileSystemMountCmd(MOUNT, def, src); cmd = virStorageBackendFileSystemMountCmd(MOUNT, def, src);
return virCommandRun(cmd, NULL);
/* Mounting a shared FS might take a long time. Don't hold
* the pool locked meanwhile. */
virObjectUnlock(pool);
rc = virCommandRun(cmd, NULL);
virObjectLock(pool);
return rc;
} }
...@@ -456,13 +463,14 @@ virStorageBackendMakeFileSystem(virStoragePoolObjPtr pool, ...@@ -456,13 +463,14 @@ virStorageBackendMakeFileSystem(virStoragePoolObjPtr pool,
virReportError(VIR_ERR_OPERATION_INVALID, virReportError(VIR_ERR_OPERATION_INVALID,
_("No source device specified when formatting pool '%s'"), _("No source device specified when formatting pool '%s'"),
def->name); def->name);
goto error; return -1;
} }
device = def->source.devices[0].path; device = def->source.devices[0].path;
format = virStoragePoolFormatFileSystemTypeToString(def->source.format); format = virStoragePoolFormatFileSystemTypeToString(def->source.format);
VIR_DEBUG("source device: '%s' format: '%s'", device, format); VIR_DEBUG("source device: '%s' format: '%s'", device, format);
virObjectUnlock(pool);
if (!virFileExists(device)) { if (!virFileExists(device)) {
virReportError(VIR_ERR_OPERATION_INVALID, virReportError(VIR_ERR_OPERATION_INVALID,
_("Source device does not exist when formatting pool '%s'"), _("Source device does not exist when formatting pool '%s'"),
...@@ -481,6 +489,7 @@ virStorageBackendMakeFileSystem(virStoragePoolObjPtr pool, ...@@ -481,6 +489,7 @@ virStorageBackendMakeFileSystem(virStoragePoolObjPtr pool,
ret = virStorageBackendExecuteMKFS(device, format); ret = virStorageBackendExecuteMKFS(device, format);
error: error:
virObjectLock(pool);
return ret; return ret;
} }
......
...@@ -50,9 +50,15 @@ virStorageBackendLogicalSetActive(virStoragePoolObjPtr pool, ...@@ -50,9 +50,15 @@ virStorageBackendLogicalSetActive(virStoragePoolObjPtr pool,
{ {
virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool); virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
VIR_AUTOPTR(virCommand) cmd = NULL; VIR_AUTOPTR(virCommand) cmd = NULL;
int ret;
cmd = virStorageBackendLogicalChangeCmd(VGCHANGE, def, on); cmd = virStorageBackendLogicalChangeCmd(VGCHANGE, def, on);
return virCommandRun(cmd, NULL);
virObjectUnlock(pool);
ret = virCommandRun(cmd, NULL);
virObjectLock(pool);
return ret;
} }
...@@ -723,11 +729,10 @@ virStorageBackendLogicalBuildPool(virStoragePoolObjPtr pool, ...@@ -723,11 +729,10 @@ virStorageBackendLogicalBuildPool(virStoragePoolObjPtr pool,
virCommandAddArg(vgcmd, path); virCommandAddArg(vgcmd, path);
} }
virObjectUnlock(pool);
/* Now create the volume group itself */ /* Now create the volume group itself */
if (virCommandRun(vgcmd, NULL) < 0) ret = virCommandRun(vgcmd, NULL);
goto cleanup; virObjectLock(pool);
ret = 0;
cleanup: cleanup:
/* On any failure, run through the devices that had pvcreate run in /* On any failure, run through the devices that had pvcreate run in
......
...@@ -42,6 +42,7 @@ virStorageBackendVzPoolStart(virStoragePoolObjPtr pool) ...@@ -42,6 +42,7 @@ virStorageBackendVzPoolStart(virStoragePoolObjPtr pool)
VIR_AUTOFREE(char *) usr_name = NULL; VIR_AUTOFREE(char *) usr_name = NULL;
VIR_AUTOFREE(char *) mode = NULL; VIR_AUTOFREE(char *) mode = NULL;
VIR_AUTOPTR(virCommand) cmd = NULL; VIR_AUTOPTR(virCommand) cmd = NULL;
int ret;
/* Check the permissions */ /* Check the permissions */
if (def->target.perms.mode == (mode_t)-1) if (def->target.perms.mode == (mode_t)-1)
...@@ -69,7 +70,13 @@ virStorageBackendVzPoolStart(virStoragePoolObjPtr pool) ...@@ -69,7 +70,13 @@ virStorageBackendVzPoolStart(virStoragePoolObjPtr pool)
"-g", grp_name, "-u", usr_name, "-g", grp_name, "-u", usr_name,
NULL); NULL);
return virCommandRun(cmd, NULL); /* Mounting a shared FS might take a long time. Don't hold
* the pool locked meanwhile. */
virObjectUnlock(pool);
ret = virCommandRun(cmd, NULL);
virObjectLock(pool);
return ret;
} }
......
...@@ -385,6 +385,7 @@ virStorageBackendZFSBuildPool(virStoragePoolObjPtr pool, ...@@ -385,6 +385,7 @@ virStorageBackendZFSBuildPool(virStoragePoolObjPtr pool,
virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool); virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
size_t i; size_t i;
VIR_AUTOPTR(virCommand) cmd = NULL; VIR_AUTOPTR(virCommand) cmd = NULL;
int ret = -1;
virCheckFlags(0, -1); virCheckFlags(0, -1);
...@@ -400,7 +401,11 @@ virStorageBackendZFSBuildPool(virStoragePoolObjPtr pool, ...@@ -400,7 +401,11 @@ virStorageBackendZFSBuildPool(virStoragePoolObjPtr pool,
for (i = 0; i < def->source.ndevice; i++) for (i = 0; i < def->source.ndevice; i++)
virCommandAddArg(cmd, def->source.devices[i].path); virCommandAddArg(cmd, def->source.devices[i].path);
return virCommandRun(cmd, NULL); virObjectUnlock(pool);
ret = virCommandRun(cmd, NULL);
virObjectLock(pool);
return ret;
} }
static int static int
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册