|
24 | 24 | import errno
|
25 | 25 | import time
|
26 | 26 |
|
| 27 | +import lock |
27 | 28 | import util
|
28 | 29 | import xs_errors
|
29 | 30 | import xml.dom.minidom
|
|
69 | 70 | LV_COMMANDS = frozenset({CMD_LVS, CMD_LVDISPLAY, CMD_LVCREATE, CMD_LVREMOVE,
|
70 | 71 | CMD_LVCHANGE, CMD_LVRENAME, CMD_LVRESIZE,
|
71 | 72 | CMD_LVEXTEND})
|
| 73 | +DM_COMMANDS = frozenset({CMD_DMSETUP}) |
72 | 74 |
|
73 |
| -LVM_COMMANDS = VG_COMMANDS.union(PV_COMMANDS, LV_COMMANDS) |
| 75 | +LVM_COMMANDS = VG_COMMANDS.union(PV_COMMANDS, LV_COMMANDS, DM_COMMANDS) |
74 | 76 |
|
75 | 77 | def extract_vgname(str_in):
|
76 | 78 | """Search for and return a VG name
|
@@ -108,6 +110,16 @@ def extract_vgname(str_in):
|
108 | 110 |
|
109 | 111 | return None
|
110 | 112 |
|
| 113 | + |
| 114 | +def get_lvm_lock(): |
| 115 | + """ |
| 116 | + Open and acquire a system wide lock to wrap LVM calls |
| 117 | + :return: the created lock |
| 118 | + """ |
| 119 | + new_lock = lock.Lock('lvm') |
| 120 | + new_lock.acquire() |
| 121 | + return new_lock |
| 122 | + |
111 | 123 | def cmd_lvm(cmd, pread_func=util.pread2, *args):
|
112 | 124 | """ Construct and run the appropriate lvm command.
|
113 | 125 |
|
@@ -150,9 +162,14 @@ def cmd_lvm(cmd, pread_func=util.pread2, *args):
|
150 | 162 | util.SMlog("CMD_LVM: Not all lvm arguments are of type 'str'")
|
151 | 163 | return None
|
152 | 164 |
|
153 |
| - start_time = time.time() |
154 |
| - stdout = pread_func([os.path.join(LVM_BIN, lvm_cmd)] + lvm_args, *args) |
155 |
| - end_time = time.time() |
| 165 | + lvm_lock = get_lvm_lock() |
| 166 | + |
| 167 | + try: |
| 168 | + start_time = time.time() |
| 169 | + stdout = pread_func([os.path.join(LVM_BIN, lvm_cmd)] + lvm_args, *args) |
| 170 | + end_time = time.time() |
| 171 | + finally: |
| 172 | + lvm_lock.release() |
156 | 173 |
|
157 | 174 | if (end_time - start_time > MAX_OPERATION_DURATION):
|
158 | 175 | util.SMlog("***** Long LVM call of '%s' took %s" % (lvm_cmd, (end_time - start_time)))
|
@@ -705,7 +722,7 @@ def removeDevMapperEntry(path, strict=True):
|
705 | 722 | try:
|
706 | 723 | # remove devmapper entry using dmsetup
|
707 | 724 | cmd = [CMD_DMSETUP, "remove", path]
|
708 |
| - util.pread2(cmd) |
| 725 | + cmd_lvm(cmd) |
709 | 726 | return True
|
710 | 727 | except Exception, e:
|
711 | 728 | if not strict:
|
|
0 commit comments