Currently, we increase the cluster serial number for instance additions,
removals and renames. This is conforming with the REST paradigm, however
it means that for each of these operations, we need to push ssconf
updates to all nodes.
In order to support future cases with reduced set of master-eligible
nodes, we want to reduce the ssconf pushes (which need to be to all
nodes). This patch changes the meaning for the cluster serial number so
that it doesn't track instance operations at all.
This means that addition of an instance can fail due to concurrent
additions, even if the cluster serial has not changed. It slightly
breaks the REST paradigm, but IMHO it's better for actual usage.
Reviewed-by: ultrotter
instance.serial_no = 1
self._config_data.instances[instance.name] = instance
instance.serial_no = 1
self._config_data.instances[instance.name] = instance
- self._config_data.cluster.serial_no += 1
self._WriteConfig()
def _SetInstanceStatus(self, instance_name, status):
self._WriteConfig()
def _SetInstanceStatus(self, instance_name, status):
if instance_name not in self._config_data.instances:
raise errors.ConfigurationError("Unknown instance '%s'" % instance_name)
del self._config_data.instances[instance_name]
if instance_name not in self._config_data.instances:
raise errors.ConfigurationError("Unknown instance '%s'" % instance_name)
del self._config_data.instances[instance_name]
- self._config_data.cluster.serial_no += 1
self._WriteConfig()
@locking.ssynchronized(_config_lock)
self._WriteConfig()
@locking.ssynchronized(_config_lock)
disk.iv_name))
self._config_data.instances[inst.name] = inst
disk.iv_name))
self._config_data.instances[inst.name] = inst
- self._config_data.cluster.serial_no += 1
self._WriteConfig()
@locking.ssynchronized(_config_lock)
self._WriteConfig()
@locking.ssynchronized(_config_lock)
if self._config_data is None:
raise errors.ProgrammerError("Configuration file not read,"
" cannot save.")
if self._config_data is None:
raise errors.ProgrammerError("Configuration file not read,"
" cannot save.")
if isinstance(target, objects.Cluster):
test = target == self._config_data.cluster
elif isinstance(target, objects.Node):
test = target in self._config_data.nodes.values()
elif isinstance(target, objects.Instance):
test = target in self._config_data.instances.values()
if isinstance(target, objects.Cluster):
test = target == self._config_data.cluster
elif isinstance(target, objects.Node):
test = target in self._config_data.nodes.values()
elif isinstance(target, objects.Instance):
test = target in self._config_data.instances.values()
else:
raise errors.ProgrammerError("Invalid object type (%s) passed to"
" ConfigWriter.Update" % type(target))
if not test:
raise errors.ConfigurationError("Configuration updated since object"
" has been read or unknown object")
else:
raise errors.ProgrammerError("Invalid object type (%s) passed to"
" ConfigWriter.Update" % type(target))
if not test:
raise errors.ConfigurationError("Configuration updated since object"
" has been read or unknown object")
+ if update_serial:
+ target.serial_no += 1