Revision 96acbc09 lib/bdev.py
b/lib/bdev.py | ||
---|---|---|
31 | 31 |
from ganeti import utils |
32 | 32 |
from ganeti import errors |
33 | 33 |
from ganeti import constants |
34 |
from ganeti import objects |
|
34 | 35 |
|
35 | 36 |
|
36 | 37 |
def _IgnoreError(fn, *args, **kwargs): |
... | ... | |
228 | 229 |
data. This is only valid for some devices, the rest will always |
229 | 230 |
return False (not degraded). |
230 | 231 |
|
231 |
@rtype: tuple |
|
232 |
@return: (sync_percent, estimated_time, is_degraded, ldisk) |
|
232 |
@rtype: objects.BlockDevStatus |
|
233 | 233 |
|
234 | 234 |
""" |
235 |
return None, None, False, False |
|
236 |
|
|
235 |
return objects.BlockDevStatus(dev_path=self.dev_path, |
|
236 |
major=self.major, |
|
237 |
minor=self.minor, |
|
238 |
sync_percent=None, |
|
239 |
estimated_time=None, |
|
240 |
is_degraded=False, |
|
241 |
ldisk_degraded=False) |
|
237 | 242 |
|
238 | 243 |
def CombinedSyncStatus(self): |
239 | 244 |
"""Calculate the mirror status recursively for our children. |
... | ... | |
242 | 247 |
minimum percent and maximum time are calculated across our |
243 | 248 |
children. |
244 | 249 |
|
250 |
@rtype: objects.BlockDevStatus |
|
251 |
|
|
245 | 252 |
""" |
246 |
min_percent, max_time, is_degraded, ldisk = self.GetSyncStatus() |
|
253 |
status = self.GetSyncStatus() |
|
254 |
|
|
255 |
min_percent = status.sync_percent |
|
256 |
max_time = status.estimated_time |
|
257 |
is_degraded = status.is_degraded |
|
258 |
ldisk_degraded = status.ldisk_degraded |
|
259 |
|
|
247 | 260 |
if self._children: |
248 | 261 |
for child in self._children: |
249 |
c_percent, c_time, c_degraded, c_ldisk = child.GetSyncStatus() |
|
262 |
child_status = child.GetSyncStatus() |
|
263 |
|
|
250 | 264 |
if min_percent is None: |
251 |
min_percent = c_percent |
|
252 |
elif c_percent is not None: |
|
253 |
min_percent = min(min_percent, c_percent) |
|
265 |
min_percent = child_status.sync_percent |
|
266 |
elif child_status.sync_percent is not None: |
|
267 |
min_percent = min(min_percent, child_status.sync_percent) |
|
268 |
|
|
254 | 269 |
if max_time is None: |
255 |
max_time = c_time |
|
256 |
elif c_time is not None: |
|
257 |
max_time = max(max_time, c_time) |
|
258 |
is_degraded = is_degraded or c_degraded |
|
259 |
ldisk = ldisk or c_ldisk |
|
260 |
return min_percent, max_time, is_degraded, ldisk |
|
270 |
max_time = child_status.estimated_time |
|
271 |
elif child_status.estimated_time is not None: |
|
272 |
max_time = max(max_time, child_status.estimated_time) |
|
273 |
|
|
274 |
is_degraded = is_degraded or child_status.is_degraded |
|
275 |
ldisk_degraded = ldisk_degraded or child_status.ldisk_degraded |
|
276 |
|
|
277 |
return objects.BlockDevStatus(dev_path=self.dev_path, |
|
278 |
major=self.major, |
|
279 |
minor=self.minor, |
|
280 |
sync_percent=min_percent, |
|
281 |
estimated_time=max_time, |
|
282 |
is_degraded=is_degraded, |
|
283 |
ldisk_degraded=ldisk_degraded) |
|
261 | 284 |
|
262 | 285 |
|
263 | 286 |
def SetInfo(self, text): |
... | ... | |
506 | 529 |
|
507 | 530 |
The status was already read in Attach, so we just return it. |
508 | 531 |
|
509 |
@rtype: tuple |
|
510 |
@return: (sync_percent, estimated_time, is_degraded, ldisk) |
|
532 |
@rtype: objects.BlockDevStatus |
|
511 | 533 |
|
512 | 534 |
""" |
513 |
return None, None, self._degraded, self._degraded |
|
535 |
return objects.BlockDevStatus(dev_path=self.dev_path, |
|
536 |
major=self.major, |
|
537 |
minor=self.minor, |
|
538 |
sync_percent=None, |
|
539 |
estimated_time=None, |
|
540 |
is_degraded=self._degraded, |
|
541 |
ldisk_degraded=self._degraded) |
|
514 | 542 |
|
515 | 543 |
def Open(self, force=False): |
516 | 544 |
"""Make the device ready for I/O. |
... | ... | |
1300 | 1328 |
We compute the ldisk parameter based on whether we have a local |
1301 | 1329 |
disk or not. |
1302 | 1330 |
|
1303 |
@rtype: tuple |
|
1304 |
@return: (sync_percent, estimated_time, is_degraded, ldisk) |
|
1331 |
@rtype: objects.BlockDevStatus |
|
1305 | 1332 |
|
1306 | 1333 |
""" |
1307 | 1334 |
if self.minor is None and not self.Attach(): |
1308 | 1335 |
_ThrowError("drbd%d: can't Attach() in GetSyncStatus", self._aminor) |
1336 |
|
|
1309 | 1337 |
stats = self.GetProcStatus() |
1310 |
ldisk = not stats.is_disk_uptodate |
|
1338 |
ldisk_degraded = not stats.is_disk_uptodate
|
|
1311 | 1339 |
is_degraded = not stats.is_connected |
1312 |
return stats.sync_percent, stats.est_time, is_degraded or ldisk, ldisk |
|
1340 |
|
|
1341 |
return objects.BlockDevStatus(dev_path=self.dev_path, |
|
1342 |
major=self.major, |
|
1343 |
minor=self.minor, |
|
1344 |
sync_percent=stats.sync_percent, |
|
1345 |
estimated_time=stats.est_time, |
|
1346 |
is_degraded=(is_degraded or ldisk_degraded), |
|
1347 |
ldisk_degraded=ldisk_degraded) |
|
1313 | 1348 |
|
1314 | 1349 |
def Open(self, force=False): |
1315 | 1350 |
"""Make the local state primary. |
Also available in: Unified diff