221 |
221 |
"""
|
222 |
222 |
raise NotImplementedError
|
223 |
223 |
|
224 |
|
def SetSyncSpeed(self, speed):
|
225 |
|
"""Adjust the sync speed of the mirror.
|
|
224 |
def SetSyncParams(self, params):
|
|
225 |
"""Adjust the synchronization parameters of the mirror.
|
226 |
226 |
|
227 |
227 |
In case this is not a mirroring device, this is no-op.
|
228 |
228 |
|
|
229 |
@param params: dictionary of LD level disk parameters related to the
|
|
230 |
synchronization.
|
|
231 |
|
229 |
232 |
"""
|
230 |
233 |
result = True
|
231 |
234 |
if self._children:
|
232 |
235 |
for child in self._children:
|
233 |
|
result = result and child.SetSyncSpeed(speed)
|
|
236 |
result = result and child.SetSyncParams(params)
|
234 |
237 |
return result
|
235 |
238 |
|
236 |
239 |
def PauseResumeSync(self, pause):
|
... | ... | |
238 |
241 |
|
239 |
242 |
In case this is not a mirroring device, this is no-op.
|
240 |
243 |
|
241 |
|
@param pause: Wheater to pause or resume
|
|
244 |
@param pause: Whether to pause or resume
|
242 |
245 |
|
243 |
246 |
"""
|
244 |
247 |
result = True
|
... | ... | |
1472 |
1475 |
# sync speed only after setting up both sides can race with DRBD
|
1473 |
1476 |
# connecting, hence we set it here before telling DRBD anything
|
1474 |
1477 |
# about its peer.
|
1475 |
|
sync_speed = self.params.get(constants.LDP_RESYNC_RATE)
|
1476 |
|
self._SetMinorSyncSpeed(minor, sync_speed)
|
|
1478 |
self._SetMinorSyncParams(minor, self.params)
|
1477 |
1479 |
|
1478 |
1480 |
if netutils.IP6Address.IsValid(lhost):
|
1479 |
1481 |
if not netutils.IP6Address.IsValid(rhost):
|
... | ... | |
1573 |
1575 |
self._children = []
|
1574 |
1576 |
|
1575 |
1577 |
@classmethod
|
1576 |
|
def _SetMinorSyncSpeed(cls, minor, kbytes):
|
1577 |
|
"""Set the speed of the DRBD syncer.
|
|
1578 |
def _SetMinorSyncParams(cls, minor, params):
|
|
1579 |
"""Set the parameters of the DRBD syncer.
|
1578 |
1580 |
|
1579 |
1581 |
This is the low-level implementation.
|
1580 |
1582 |
|
1581 |
1583 |
@type minor: int
|
1582 |
1584 |
@param minor: the drbd minor whose settings we change
|
1583 |
|
@type kbytes: int
|
1584 |
|
@param kbytes: the speed in kbytes/second
|
|
1585 |
@type params: dict
|
|
1586 |
@param params: LD level disk parameters related to the synchronization
|
1585 |
1587 |
@rtype: boolean
|
1586 |
1588 |
@return: the success of the operation
|
1587 |
1589 |
|
1588 |
1590 |
"""
|
1589 |
|
result = utils.RunCmd(["drbdsetup", cls._DevPath(minor), "syncer",
|
1590 |
|
"-r", "%d" % kbytes, "--create-device"])
|
|
1591 |
|
|
1592 |
args = ["drbdsetup", cls._DevPath(minor), "syncer"]
|
|
1593 |
if params[constants.LDP_DYNAMIC_RESYNC]:
|
|
1594 |
version = cls._GetVersion(cls._GetProcData())
|
|
1595 |
vmin = version["k_minor"]
|
|
1596 |
vrel = version["k_point"]
|
|
1597 |
|
|
1598 |
# By definition we are using 8.x, so just check the rest of the version
|
|
1599 |
# number
|
|
1600 |
if vmin != 3 or vrel < 9:
|
|
1601 |
logging.error("The current DRBD version (8.%d.%d) does not support the"
|
|
1602 |
" dynamic resync speed controller", vmin, vrel)
|
|
1603 |
return False
|
|
1604 |
|
|
1605 |
# add the c-* parameters to args
|
|
1606 |
# TODO(spadaccio) use the actual parameters
|
|
1607 |
args.extend(["--c-plan-ahead", "20"])
|
|
1608 |
|
|
1609 |
else:
|
|
1610 |
args.extend(["-r", "%d" % params[constants.LDP_RESYNC_RATE]])
|
|
1611 |
|
|
1612 |
args.append("--create-device")
|
|
1613 |
result = utils.RunCmd(args)
|
1591 |
1614 |
if result.failed:
|
1592 |
1615 |
logging.error("Can't change syncer rate: %s - %s",
|
1593 |
1616 |
result.fail_reason, result.output)
|
1594 |
1617 |
return not result.failed
|
1595 |
1618 |
|
1596 |
|
def SetSyncSpeed(self, kbytes):
|
1597 |
|
"""Set the speed of the DRBD syncer.
|
|
1619 |
def SetSyncParams(self, params):
|
|
1620 |
"""Set the synchronization parameters of the DRBD syncer.
|
1598 |
1621 |
|
1599 |
|
@type kbytes: int
|
1600 |
|
@param kbytes: the speed in kbytes/second
|
|
1622 |
@type params: dict
|
|
1623 |
@param params: LD level disk parameters related to the synchronization
|
1601 |
1624 |
@rtype: boolean
|
1602 |
1625 |
@return: the success of the operation
|
1603 |
1626 |
|
1604 |
1627 |
"""
|
1605 |
1628 |
if self.minor is None:
|
1606 |
|
logging.info("Not attached during SetSyncSpeed")
|
|
1629 |
logging.info("Not attached during SetSyncParams")
|
1607 |
1630 |
return False
|
1608 |
|
children_result = super(DRBD8, self).SetSyncSpeed(kbytes)
|
1609 |
|
return self._SetMinorSyncSpeed(self.minor, kbytes) and children_result
|
|
1631 |
children_result = super(DRBD8, self).SetSyncParams(params)
|
|
1632 |
return self._SetMinorSyncParams(self.minor, params) and children_result
|
1610 |
1633 |
|
1611 |
1634 |
def PauseResumeSync(self, pause):
|
1612 |
1635 |
"""Pauses or resumes the sync of a DRBD device.
|
... | ... | |
1843 |
1866 |
# the device
|
1844 |
1867 |
self._SlowAssemble()
|
1845 |
1868 |
|
1846 |
|
sync_speed = self.params.get(constants.LDP_RESYNC_RATE)
|
1847 |
|
self.SetSyncSpeed(sync_speed)
|
|
1869 |
self.SetSyncParams(self.params)
|
1848 |
1870 |
|
1849 |
1871 |
def _SlowAssemble(self):
|
1850 |
1872 |
"""Assembles the DRBD device from a (partially) configured device.
|