Commit b3f868de authored by Aurel's avatar Aurel

store the number of replicas inside DB, thus we can create the

partition table if we get all necessaey information at bootstrap


git-svn-id: https://svn.erp5.org/repos/neo/branches/prototype3@458 71dcc9de-d417-0410-9af5-da40c76e7ee4
parent a0a23d21
...@@ -34,6 +34,7 @@ from neo.storage.verification import VerificationEventHandler ...@@ -34,6 +34,7 @@ from neo.storage.verification import VerificationEventHandler
from neo.storage.operation import OperationEventHandler from neo.storage.operation import OperationEventHandler
from neo.storage.replicator import Replicator from neo.storage.replicator import Replicator
from neo.connector import getConnectorHandler from neo.connector import getConnectorHandler
from neo.pt import PartitionTable
from neo.util import dump from neo.util import dump
class Application(object): class Application(object):
...@@ -79,6 +80,11 @@ class Application(object): ...@@ -79,6 +80,11 @@ class Application(object):
self.uuid = INVALID_UUID self.uuid = INVALID_UUID
self.num_partitions = dm.getNumPartitions() self.num_partitions = dm.getNumPartitions()
self.num_replicas = dm.getNumReplicas()
if self.num_partitions is not None and self.num_replicas is not None:
# create a partition table
self.pt = PartitionTable(self.num_partitions, self.num_replicas)
name = dm.getName() name = dm.getName()
if name is None: if name is None:
...@@ -88,8 +94,8 @@ class Application(object): ...@@ -88,8 +94,8 @@ class Application(object):
self.ptid = dm.getPTID() # return ptid or INVALID_PTID self.ptid = dm.getPTID() # return ptid or INVALID_PTID
if self.ptid == INVALID_PTID: if self.ptid == INVALID_PTID:
dm.setPTID(self.ptid) dm.setPTID(self.ptid)
logging.info("loaded configuration from db : uuid = %s, ptid = %s, name = %s, np = %s" \ logging.info("loaded configuration from db : uuid = %s, ptid = %s, name = %s, np = %s, nr = %s" \
%(dump(self.uuid), dump(self.ptid), name, self.num_partitions)) %(dump(self.uuid), dump(self.ptid), name, self.num_partitions, self.num_replicas))
def loadPartitionTable(self): def loadPartitionTable(self):
"""Load a partition table from the database.""" """Load a partition table from the database."""
......
...@@ -177,17 +177,16 @@ class BootstrapEventHandler(StorageEventHandler): ...@@ -177,17 +177,16 @@ class BootstrapEventHandler(StorageEventHandler):
conn.close() conn.close()
return return
if app.num_partitions is None: if app.num_partitions is None or app.num_replicas is None:
app.num_partitions = num_partitions app.num_partitions = num_partitions
app.dm.setNumPartitions(app.num_partitions) app.dm.setNumPartitions(app.num_partitions)
app.num_replicas = num_replicas app.num_replicas = num_replicas
app.dm.setNumReplicas(app.num_replicas)
app.pt = PartitionTable(num_partitions, num_replicas) app.pt = PartitionTable(num_partitions, num_replicas)
app.loadPartitionTable() app.loadPartitionTable()
app.ptid = app.dm.getPTID() app.ptid = app.dm.getPTID()
elif app.num_partitions != num_partitions: elif app.num_partitions != num_partitions:
raise RuntimeError('the number of partitions is inconsistent') raise RuntimeError('the number of partitions is inconsistent')
elif app.num_replicas != num_replicas:
raise RuntimeError('the number of replicas is inconsistent')
if your_uuid != INVALID_UUID and app.uuid != your_uuid: if your_uuid != INVALID_UUID and app.uuid != your_uuid:
# got an uuid from the primary master # got an uuid from the primary master
......
...@@ -44,6 +44,15 @@ class DatabaseManager(object): ...@@ -44,6 +44,15 @@ class DatabaseManager(object):
"""Store the number of partitions into a database.""" """Store the number of partitions into a database."""
raise NotImplementedError('this method must be overridden') raise NotImplementedError('this method must be overridden')
def getNumReplicas(self):
"""Load the number of replicas from a database. If not present,
return None."""
raise NotImplementedError('this method must be overridden')
def setNumReplicas(self, num_partitions):
"""Store the number of replicas into a database."""
raise NotImplementedError('this method must be overridden')
def getName(self): def getName(self):
"""Load a name from a database. If not present, return None.""" """Load a name from a database. If not present, return None."""
raise NotImplementedError('this method must be overridden') raise NotImplementedError('this method must be overridden')
......
...@@ -211,6 +211,20 @@ class MySQLDatabaseManager(DatabaseManager): ...@@ -211,6 +211,20 @@ class MySQLDatabaseManager(DatabaseManager):
raise raise
self.commit() self.commit()
def getNumReplicas(self):
n = self.getConfiguration('replicas')
if n is not None:
return int(n)
def setNumReplicas(self, num_replicas):
self.begin()
try:
self.setConfiguration('replicas', num_replicas)
except:
self.rollback()
raise
self.commit()
def getName(self): def getName(self):
return self.getConfiguration('name') return self.getConfiguration('name')
......
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