|
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