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