Commit 15369269 authored by Julien Muchembled's avatar Julien Muchembled

storage: allow the master to change our node id

This is not used currently.
parent e8473a23
...@@ -399,6 +399,13 @@ class ImporterDatabaseManager(DatabaseManager): ...@@ -399,6 +399,13 @@ class ImporterDatabaseManager(DatabaseManager):
def _updateReadable(self): def _updateReadable(self):
raise AssertionError raise AssertionError
def setUUID(self, nid):
old_nid = self.getUUID()
if old_nid:
assert old_nid == nid, (old_nid, nid)
else:
self.setConfiguration('nid', str(nid))
def changePartitionTable(self, *args, **kw): def changePartitionTable(self, *args, **kw):
self.db.changePartitionTable(*args, **kw) self.db.changePartitionTable(*args, **kw)
if self._writeback: if self._writeback:
......
...@@ -271,6 +271,18 @@ class DatabaseManager(object): ...@@ -271,6 +271,18 @@ class DatabaseManager(object):
def _setConfiguration(self, key, value): def _setConfiguration(self, key, value):
"""""" """"""
def _changePartitionTable(self, cell_list, reset=False):
"""Change a part of a partition table. The list of cells is
a tuple of tuples, each of which consists of an offset (row ID),
the NID of a storage node, and a cell state. If reset is True,
existing data is first thrown away.
"""
def _getPartitionTable(self):
"""Return a whole partition table as a sequence of rows. Each row
is again a tuple of an offset (row ID), the NID of a storage
node, and a cell state."""
def getUUID(self): def getUUID(self):
""" """
Load a NID from a database. Load a NID from a database.
...@@ -279,11 +291,19 @@ class DatabaseManager(object): ...@@ -279,11 +291,19 @@ class DatabaseManager(object):
if nid is not None: if nid is not None:
return int(nid) return int(nid)
@requires(_changePartitionTable, _getPartitionTable)
def setUUID(self, nid): def setUUID(self, nid):
""" """
Store a NID into a database. Store a NID into a database.
""" """
self.setConfiguration('nid', str(nid)) old_nid = self.getUUID()
if nid != old_nid:
if old_nid:
self._changePartitionTable((offset, x, tid)
for offset, x, tid in self._getPartitionTable()
if x == old_nid
for x, tid in ((x, None), (nid, tid)))
self.setConfiguration('nid', str(nid))
def getNumPartitions(self): def getNumPartitions(self):
""" """
...@@ -511,11 +531,6 @@ class DatabaseManager(object): ...@@ -511,11 +531,6 @@ class DatabaseManager(object):
return (util.p64(serial), compression, checksum, data, return (util.p64(serial), compression, checksum, data,
None if data_serial is None else util.p64(data_serial)) None if data_serial is None else util.p64(data_serial))
def _getPartitionTable(self):
"""Return a whole partition table as a sequence of rows. Each row
is again a tuple of an offset (row ID), the NID of a storage
node, and a cell state."""
@requires(_getPartitionTable) @requires(_getPartitionTable)
def _iterAssignedCells(self): def _iterAssignedCells(self):
my_nid = self.getUUID() my_nid = self.getUUID()
...@@ -537,13 +552,6 @@ class DatabaseManager(object): ...@@ -537,13 +552,6 @@ class DatabaseManager(object):
finally: finally:
readable_set.remove(offset) readable_set.remove(offset)
def _changePartitionTable(self, cell_list, reset=False):
"""Change a part of a partition table. The list of cells is
a tuple of tuples, each of which consists of an offset (row ID),
the NID of a storage node, and a cell state. If reset is True,
existing data is first thrown away.
"""
def _getDataLastId(self, partition): def _getDataLastId(self, partition):
""" """
""" """
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment