Commit 9f0f2afe authored by Julien Muchembled's avatar Julien Muchembled

protocol: update packet docstrings

/reviewed-on nexedi/neoppod!9
parent f62f9bc9
...@@ -647,7 +647,9 @@ class Error(Packet): ...@@ -647,7 +647,9 @@ class Error(Packet):
""" """
Error is a special type of message, because this can be sent against Error is a special type of message, because this can be sent against
any other message, even if such a message does not expect a reply any other message, even if such a message does not expect a reply
usually. Any -> Any. usually.
:nodes: * -> *
""" """
_fmt = PStruct('error', _fmt = PStruct('error',
PNumber('code'), PNumber('code'),
...@@ -656,19 +658,25 @@ class Error(Packet): ...@@ -656,19 +658,25 @@ class Error(Packet):
class Ping(Packet): class Ping(Packet):
""" """
Check if a peer is still alive. Any -> Any. Empty request used as network barrier.
:nodes: * -> *
""" """
_answer = PFEmpty _answer = PFEmpty
class CloseClient(Packet): class CloseClient(Packet):
""" """
Tell peer it can close the connection if it has finished with us. Any -> Any Tell peer that it can close the connection if it has finished with us.
:nodes: * -> *
""" """
class RequestIdentification(Packet): class RequestIdentification(Packet):
""" """
Request a node identification. This must be the first packet for any Request a node identification. This must be the first packet for any
connection. Any -> Any. connection.
:nodes: * -> *
""" """
poll_thread = True poll_thread = True
...@@ -690,7 +698,9 @@ class RequestIdentification(Packet): ...@@ -690,7 +698,9 @@ class RequestIdentification(Packet):
class PrimaryMaster(Packet): class PrimaryMaster(Packet):
""" """
Ask current primary master's uuid. CTL -> A. Ask node identier of the current primary master.
:nodes: ctl -> A
""" """
_answer = PStruct('answer_primary', _answer = PStruct('answer_primary',
PUUID('primary_uuid'), PUUID('primary_uuid'),
...@@ -698,7 +708,10 @@ class PrimaryMaster(Packet): ...@@ -698,7 +708,10 @@ class PrimaryMaster(Packet):
class NotPrimaryMaster(Packet): class NotPrimaryMaster(Packet):
""" """
Send list of known master nodes. SM -> Any. Notify peer that I'm not the primary master. Attach any extra information
to help the peer joining the cluster.
:nodes: SM -> *
""" """
_fmt = PStruct('not_primary_master', _fmt = PStruct('not_primary_master',
PSignedNull('primary'), PSignedNull('primary'),
...@@ -709,7 +722,10 @@ class NotPrimaryMaster(Packet): ...@@ -709,7 +722,10 @@ class NotPrimaryMaster(Packet):
class Recovery(Packet): class Recovery(Packet):
""" """
Ask all data needed by master to recover. PM -> S, S -> PM. Ask storage nodes data needed by master to recover.
Reused by `neoctl print ids`.
:nodes: M -> S; ctl -> A -> M
""" """
_answer = PStruct('answer_recovery', _answer = PStruct('answer_recovery',
PPTID('ptid'), PPTID('ptid'),
...@@ -720,7 +736,9 @@ class Recovery(Packet): ...@@ -720,7 +736,9 @@ class Recovery(Packet):
class LastIDs(Packet): class LastIDs(Packet):
""" """
Ask the last OID/TID so that a master can initialize its TransactionManager. Ask the last OID/TID so that a master can initialize its TransactionManager.
PM -> S, S -> PM. Reused by `neoctl print ids`.
:nodes: M -> S; ctl -> A -> M
""" """
_answer = PStruct('answer_last_ids', _answer = PStruct('answer_last_ids',
POID('last_oid'), POID('last_oid'),
...@@ -729,8 +747,10 @@ class LastIDs(Packet): ...@@ -729,8 +747,10 @@ class LastIDs(Packet):
class PartitionTable(Packet): class PartitionTable(Packet):
""" """
Ask the full partition table. PM -> S. Ask storage node the remaining data needed by master to recover.
Answer rows in a partition table. S -> PM. This is also how the clients get the full partition table on connection.
:nodes: M -> S; C -> M
""" """
_answer = PStruct('answer_partition_table', _answer = PStruct('answer_partition_table',
PPTID('ptid'), PPTID('ptid'),
...@@ -739,7 +759,9 @@ class PartitionTable(Packet): ...@@ -739,7 +759,9 @@ class PartitionTable(Packet):
class NotifyPartitionTable(Packet): class NotifyPartitionTable(Packet):
""" """
Send rows in a partition table to update other nodes. PM -> S, C. Send the full partition table to admin/storage nodes on connection.
:nodes: M -> A, S
""" """
_fmt = PStruct('send_partition_table', _fmt = PStruct('send_partition_table',
PPTID('ptid'), PPTID('ptid'),
...@@ -748,8 +770,9 @@ class NotifyPartitionTable(Packet): ...@@ -748,8 +770,9 @@ class NotifyPartitionTable(Packet):
class PartitionChanges(Packet): class PartitionChanges(Packet):
""" """
Notify a subset of a partition table. This is used to notify changes. Notify about changes in the partition table.
PM -> S, C.
:nodes: M -> *
""" """
_fmt = PStruct('notify_partition_changes', _fmt = PStruct('notify_partition_changes',
PPTID('ptid'), PPTID('ptid'),
...@@ -764,8 +787,10 @@ class PartitionChanges(Packet): ...@@ -764,8 +787,10 @@ class PartitionChanges(Packet):
class StartOperation(Packet): class StartOperation(Packet):
""" """
Tell a storage nodes to start an operation. Until a storage node receives Tell a storage node to start operation. Before this message, it must only
this message, it must not serve client nodes. PM -> S. communicate with the primary master.
:nodes: M -> S
""" """
_fmt = PStruct('start_operation', _fmt = PStruct('start_operation',
# XXX: Is this boolean needed ? Maybe this # XXX: Is this boolean needed ? Maybe this
...@@ -775,14 +800,17 @@ class StartOperation(Packet): ...@@ -775,14 +800,17 @@ class StartOperation(Packet):
class StopOperation(Packet): class StopOperation(Packet):
""" """
Tell a storage node to stop an operation. Once a storage node receives Notify that the cluster is not operational anymore. Any operation between
this message, it must not serve client nodes. PM -> S. nodes must be aborted.
:nodes: M -> S, C
""" """
class UnfinishedTransactions(Packet): class UnfinishedTransactions(Packet):
""" """
Ask unfinished transactions S -> PM. Ask unfinished transactions, which will be replicated when they're finished.
Answer unfinished transactions PM -> S.
:nodes: S -> M
""" """
_fmt = PStruct('ask_unfinished_transactions', _fmt = PStruct('ask_unfinished_transactions',
PList('row_list', PList('row_list',
...@@ -799,8 +827,10 @@ class UnfinishedTransactions(Packet): ...@@ -799,8 +827,10 @@ class UnfinishedTransactions(Packet):
class LockedTransactions(Packet): class LockedTransactions(Packet):
""" """
Ask locked transactions PM -> S. Ask locked transactions to replay committed transactions that haven't been
Answer locked transactions S -> PM. unlocked.
:nodes: M -> S
""" """
_answer = PStruct('answer_locked_transactions', _answer = PStruct('answer_locked_transactions',
PDict('tid_dict', PDict('tid_dict',
...@@ -811,7 +841,10 @@ class LockedTransactions(Packet): ...@@ -811,7 +841,10 @@ class LockedTransactions(Packet):
class FinalTID(Packet): class FinalTID(Packet):
""" """
Return final tid if ttid has been committed. * -> S. C -> PM. Return final tid if ttid has been committed, to recover from certain
failures during tpc_finish.
:nodes: M -> S; C -> M, S
""" """
_fmt = PStruct('final_tid', _fmt = PStruct('final_tid',
PTID('ttid'), PTID('ttid'),
...@@ -823,7 +856,9 @@ class FinalTID(Packet): ...@@ -823,7 +856,9 @@ class FinalTID(Packet):
class ValidateTransaction(Packet): class ValidateTransaction(Packet):
""" """
Commit a transaction. PM -> S. Do replay a committed transaction that was not unlocked.
:nodes: M -> S
""" """
_fmt = PStruct('validate_transaction', _fmt = PStruct('validate_transaction',
PTID('ttid'), PTID('ttid'),
...@@ -832,8 +867,9 @@ class ValidateTransaction(Packet): ...@@ -832,8 +867,9 @@ class ValidateTransaction(Packet):
class BeginTransaction(Packet): class BeginTransaction(Packet):
""" """
Ask to begin a new transaction. C -> PM. Ask to begin a new transaction. This maps to `tpc_begin`.
Answer when a transaction begin, give a TID if necessary. PM -> C.
:nodes: C -> M
""" """
_fmt = PStruct('ask_begin_transaction', _fmt = PStruct('ask_begin_transaction',
PTID('tid'), PTID('tid'),
...@@ -845,8 +881,10 @@ class BeginTransaction(Packet): ...@@ -845,8 +881,10 @@ class BeginTransaction(Packet):
class FailedVote(Packet): class FailedVote(Packet):
""" """
Report storage nodes for which vote failed. C -> M Report storage nodes for which vote failed.
True is returned if it's still possible to finish the transaction. True is returned if it's still possible to finish the transaction.
:nodes: C -> M
""" """
_fmt = PStruct('failed_vote', _fmt = PStruct('failed_vote',
PTID('tid'), PTID('tid'),
...@@ -857,8 +895,10 @@ class FailedVote(Packet): ...@@ -857,8 +895,10 @@ class FailedVote(Packet):
class FinishTransaction(Packet): class FinishTransaction(Packet):
""" """
Finish a transaction. C -> PM. Finish a transaction. Return the TID of the committed transaction.
Answer when a transaction is finished. PM -> C. This maps to `tpc_finish`.
:nodes: C -> M
""" """
poll_thread = True poll_thread = True
...@@ -877,8 +917,9 @@ class FinishTransaction(Packet): ...@@ -877,8 +917,9 @@ class FinishTransaction(Packet):
class NotifyTransactionFinished(Packet): class NotifyTransactionFinished(Packet):
""" """
Notify that a transaction blocking a replication is now finished Notify that a transaction blocking a replication is now finished.
M -> S
:nodes: M -> S
""" """
_fmt = PStruct('notify_transaction_finished', _fmt = PStruct('notify_transaction_finished',
PTID('ttid'), PTID('ttid'),
...@@ -887,8 +928,9 @@ class NotifyTransactionFinished(Packet): ...@@ -887,8 +928,9 @@ class NotifyTransactionFinished(Packet):
class LockInformation(Packet): class LockInformation(Packet):
""" """
Lock information on a transaction. PM -> S. Commit a transaction. The new data is read-locked.
Notify information on a transaction locked. S -> PM.
:nodes: M -> S
""" """
_fmt = PStruct('ask_lock_informations', _fmt = PStruct('ask_lock_informations',
PTID('ttid'), PTID('ttid'),
...@@ -901,7 +943,10 @@ class LockInformation(Packet): ...@@ -901,7 +943,10 @@ class LockInformation(Packet):
class InvalidateObjects(Packet): class InvalidateObjects(Packet):
""" """
Invalidate objects. PM -> C. Notify about a new transaction modifying objects,
invalidating client caches.
:nodes: M -> C
""" """
_fmt = PStruct('ask_finish_transaction', _fmt = PStruct('ask_finish_transaction',
PTID('tid'), PTID('tid'),
...@@ -910,7 +955,10 @@ class InvalidateObjects(Packet): ...@@ -910,7 +955,10 @@ class InvalidateObjects(Packet):
class UnlockInformation(Packet): class UnlockInformation(Packet):
""" """
Unlock information on a transaction. PM -> S. Notify about a successfully committed transaction. The new data can be
unlocked.
:nodes: M -> S
""" """
_fmt = PStruct('notify_unlock_information', _fmt = PStruct('notify_unlock_information',
PTID('ttid'), PTID('ttid'),
...@@ -918,8 +966,9 @@ class UnlockInformation(Packet): ...@@ -918,8 +966,9 @@ class UnlockInformation(Packet):
class GenerateOIDs(Packet): class GenerateOIDs(Packet):
""" """
Ask new object IDs. C -> PM. Ask new OIDs to create objects.
Answer new object IDs. PM -> C.
:nodes: C -> M
""" """
_fmt = PStruct('ask_new_oids', _fmt = PStruct('ask_new_oids',
PNumber('num_oids'), PNumber('num_oids'),
...@@ -931,8 +980,10 @@ class GenerateOIDs(Packet): ...@@ -931,8 +980,10 @@ class GenerateOIDs(Packet):
class Deadlock(Packet): class Deadlock(Packet):
""" """
Ask master to generate a new TTID that will be used by the client Ask master to generate a new TTID that will be used by the client to solve
to rebase a transaction. S -> PM -> C a deadlock by rebasing the transaction on top of concurrent changes.
:nodes: S -> M -> C
""" """
_fmt = PStruct('notify_deadlock', _fmt = PStruct('notify_deadlock',
PTID('ttid'), PTID('ttid'),
...@@ -941,7 +992,9 @@ class Deadlock(Packet): ...@@ -941,7 +992,9 @@ class Deadlock(Packet):
class RebaseTransaction(Packet): class RebaseTransaction(Packet):
""" """
Rebase transaction. C -> S. Rebase a transaction to solve a deadlock.
:nodes: C -> S
""" """
_fmt = PStruct('ask_rebase_transaction', _fmt = PStruct('ask_rebase_transaction',
PTID('ttid'), PTID('ttid'),
...@@ -954,7 +1007,9 @@ class RebaseTransaction(Packet): ...@@ -954,7 +1007,9 @@ class RebaseTransaction(Packet):
class RebaseObject(Packet): class RebaseObject(Packet):
""" """
Rebase object. C -> S. Rebase an object change to solve a deadlock.
:nodes: C -> S
XXX: It is a request packet to simplify the implementation. For more XXX: It is a request packet to simplify the implementation. For more
efficiency, this should be turned into a notification, and the efficiency, this should be turned into a notification, and the
...@@ -980,9 +1035,11 @@ class RebaseObject(Packet): ...@@ -980,9 +1035,11 @@ class RebaseObject(Packet):
class StoreObject(Packet): class StoreObject(Packet):
""" """
Ask to store an object. Send an OID, an original serial, a current Ask to create/modify an object. This maps to `store`.
transaction ID, and data. C -> S.
As for IStorage, 'serial' is ZERO_TID for new objects. As for IStorage, 'serial' is ZERO_TID for new objects.
:nodes: C -> S
""" """
_fmt = PStruct('ask_store_object', _fmt = PStruct('ask_store_object',
POID('oid'), POID('oid'),
...@@ -1000,7 +1057,9 @@ class StoreObject(Packet): ...@@ -1000,7 +1057,9 @@ class StoreObject(Packet):
class AbortTransaction(Packet): class AbortTransaction(Packet):
""" """
Abort a transaction. C -> S and C -> PM -> S. Abort a transaction. This maps to `tpc_abort`.
:nodes: C -> S; C -> M -> S
""" """
_fmt = PStruct('abort_transaction', _fmt = PStruct('abort_transaction',
PTID('tid'), PTID('tid'),
...@@ -1009,8 +1068,9 @@ class AbortTransaction(Packet): ...@@ -1009,8 +1068,9 @@ class AbortTransaction(Packet):
class StoreTransaction(Packet): class StoreTransaction(Packet):
""" """
Ask to store a transaction. C -> S. Ask to store a transaction. Implies vote.
Answer if transaction has been stored. S -> C.
:nodes: C -> S
""" """
_fmt = PStruct('ask_store_transaction', _fmt = PStruct('ask_store_transaction',
PTID('tid'), PTID('tid'),
...@@ -1023,8 +1083,9 @@ class StoreTransaction(Packet): ...@@ -1023,8 +1083,9 @@ class StoreTransaction(Packet):
class VoteTransaction(Packet): class VoteTransaction(Packet):
""" """
Ask to store a transaction. C -> S. Ask to vote a transaction.
Answer if transaction has been stored. S -> C.
:nodes: C -> S
""" """
_fmt = PStruct('ask_vote_transaction', _fmt = PStruct('ask_vote_transaction',
PTID('tid'), PTID('tid'),
...@@ -1033,15 +1094,15 @@ class VoteTransaction(Packet): ...@@ -1033,15 +1094,15 @@ class VoteTransaction(Packet):
class GetObject(Packet): class GetObject(Packet):
""" """
Ask a stored object by its OID and a serial or a TID if given. If a serial Ask a stored object by its OID, optionally at/before a specific tid.
is specified, the specified revision of an object will be returned. If This maps to `load/loadBefore/loadSerial`.
a TID is specified, an object right before the TID will be returned. C -> S.
Answer the requested object. S -> C. :nodes: C -> S
""" """
_fmt = PStruct('ask_object', _fmt = PStruct('ask_object',
POID('oid'), POID('oid'),
PTID('serial'), PTID('at'),
PTID('tid'), PTID('before'),
) )
_answer = PStruct('answer_object', _answer = PStruct('answer_object',
...@@ -1057,8 +1118,9 @@ class GetObject(Packet): ...@@ -1057,8 +1118,9 @@ class GetObject(Packet):
class TIDList(Packet): class TIDList(Packet):
""" """
Ask for TIDs between a range of offsets. The order of TIDs is descending, Ask for TIDs between a range of offsets. The order of TIDs is descending,
and the range is [first, last). C -> S. and the range is [first, last). This maps to `undoLog`.
Answer the requested TIDs. S -> C.
:nodes: C -> S
""" """
_fmt = PStruct('ask_tids', _fmt = PStruct('ask_tids',
PIndex('first'), PIndex('first'),
...@@ -1073,8 +1135,9 @@ class TIDList(Packet): ...@@ -1073,8 +1135,9 @@ class TIDList(Packet):
class TIDListFrom(Packet): class TIDListFrom(Packet):
""" """
Ask for length TIDs starting at min_tid. The order of TIDs is ascending. Ask for length TIDs starting at min_tid. The order of TIDs is ascending.
C -> S. Used by `iterator`.
Answer the requested TIDs. S -> C
:nodes: C -> S
""" """
_fmt = PStruct('tid_list_from', _fmt = PStruct('tid_list_from',
PTID('min_tid'), PTID('min_tid'),
...@@ -1089,8 +1152,9 @@ class TIDListFrom(Packet): ...@@ -1089,8 +1152,9 @@ class TIDListFrom(Packet):
class TransactionInformation(Packet): class TransactionInformation(Packet):
""" """
Ask information about a transaction. Any -> S. Ask for transaction metadata.
Answer information (user, description) about a transaction. S -> Any.
:nodes: C -> S
""" """
_fmt = PStruct('ask_transaction_information', _fmt = PStruct('ask_transaction_information',
PTID('tid'), PTID('tid'),
...@@ -1108,8 +1172,9 @@ class TransactionInformation(Packet): ...@@ -1108,8 +1172,9 @@ class TransactionInformation(Packet):
class ObjectHistory(Packet): class ObjectHistory(Packet):
""" """
Ask history information for a given object. The order of serials is Ask history information for a given object. The order of serials is
descending, and the range is [first, last]. C -> S. descending, and the range is [first, last]. This maps to `history`.
Answer history information (serial, size) for an object. S -> C.
:nodes: C -> S
""" """
_fmt = PStruct('ask_object_history', _fmt = PStruct('ask_object_history',
POID('oid'), POID('oid'),
...@@ -1124,9 +1189,9 @@ class ObjectHistory(Packet): ...@@ -1124,9 +1189,9 @@ class ObjectHistory(Packet):
class PartitionList(Packet): class PartitionList(Packet):
""" """
All the following messages are for neoctl to admin node Ask information about partitions.
Ask information about partition
Answer information about partition :nodes: ctl -> A
""" """
_fmt = PStruct('ask_partition_list', _fmt = PStruct('ask_partition_list',
PNumber('min_offset'), PNumber('min_offset'),
...@@ -1141,8 +1206,9 @@ class PartitionList(Packet): ...@@ -1141,8 +1206,9 @@ class PartitionList(Packet):
class NodeList(Packet): class NodeList(Packet):
""" """
Ask information about nodes Ask information about nodes.
Answer information about nodes
:nodes: ctl -> A
""" """
_fmt = PStruct('ask_node_list', _fmt = PStruct('ask_node_list',
PFNodeType, PFNodeType,
...@@ -1154,7 +1220,9 @@ class NodeList(Packet): ...@@ -1154,7 +1220,9 @@ class NodeList(Packet):
class SetNodeState(Packet): class SetNodeState(Packet):
""" """
Set the node state Change the state of a node.
:nodes: ctl -> A -> M
""" """
_fmt = PStruct('set_node_state', _fmt = PStruct('set_node_state',
PUUID('uuid'), PUUID('uuid'),
...@@ -1165,7 +1233,10 @@ class SetNodeState(Packet): ...@@ -1165,7 +1233,10 @@ class SetNodeState(Packet):
class AddPendingNodes(Packet): class AddPendingNodes(Packet):
""" """
Ask the primary to include some pending node in the partition table Mark given pending nodes as running, for future inclusion when tweaking
the partition table.
:nodes: ctl -> A -> M
""" """
_fmt = PStruct('add_pending_nodes', _fmt = PStruct('add_pending_nodes',
PFUUIDList, PFUUIDList,
...@@ -1175,7 +1246,10 @@ class AddPendingNodes(Packet): ...@@ -1175,7 +1246,10 @@ class AddPendingNodes(Packet):
class TweakPartitionTable(Packet): class TweakPartitionTable(Packet):
""" """
Ask the primary to optimize the partition table. A -> PM. Ask the master to balance the partition table, optionally excluding
specific nodes in anticipation of removing them.
:nodes: ctl -> A -> M
""" """
_fmt = PStruct('tweak_partition_table', _fmt = PStruct('tweak_partition_table',
PFUUIDList, PFUUIDList,
...@@ -1185,7 +1259,9 @@ class TweakPartitionTable(Packet): ...@@ -1185,7 +1259,9 @@ class TweakPartitionTable(Packet):
class NotifyNodeInformation(Packet): class NotifyNodeInformation(Packet):
""" """
Notify information about one or more nodes. PM -> Any. Notify information about one or more nodes.
:nodes: M -> *
""" """
_fmt = PStruct('notify_node_informations', _fmt = PStruct('notify_node_informations',
PFloat('id_timestamp'), PFloat('id_timestamp'),
...@@ -1194,7 +1270,9 @@ class NotifyNodeInformation(Packet): ...@@ -1194,7 +1270,9 @@ class NotifyNodeInformation(Packet):
class SetClusterState(Packet): class SetClusterState(Packet):
""" """
Set the cluster state Set the cluster state.
:nodes: ctl -> A -> M
""" """
_fmt = PStruct('set_cluster_state', _fmt = PStruct('set_cluster_state',
PEnum('state', ClusterStates), PEnum('state', ClusterStates),
...@@ -1204,7 +1282,9 @@ class SetClusterState(Packet): ...@@ -1204,7 +1282,9 @@ class SetClusterState(Packet):
class Repair(Packet): class Repair(Packet):
""" """
Ask storage nodes to repair their databases. ctl -> A -> M Ask storage nodes to repair their databases.
:nodes: ctl -> A -> M
""" """
_flags = map(PBoolean, ('dry_run', _flags = map(PBoolean, ('dry_run',
# 'prune_orphan' (commented because it's the only option for the moment) # 'prune_orphan' (commented because it's the only option for the moment)
...@@ -1217,13 +1297,18 @@ class Repair(Packet): ...@@ -1217,13 +1297,18 @@ class Repair(Packet):
class RepairOne(Packet): class RepairOne(Packet):
""" """
See Repair. M -> S Repair is translated to this message, asking a specific storage node to
repair its database.
:nodes: M -> S
""" """
_fmt = PStruct('repair', *Repair._flags) _fmt = PStruct('repair', *Repair._flags)
class ClusterInformation(Packet): class ClusterInformation(Packet):
""" """
Notify information about the cluster Notify about a cluster state change.
:nodes: M -> *
""" """
_fmt = PStruct('notify_cluster_information', _fmt = PStruct('notify_cluster_information',
PEnum('state', ClusterStates), PEnum('state', ClusterStates),
...@@ -1231,8 +1316,9 @@ class ClusterInformation(Packet): ...@@ -1231,8 +1316,9 @@ class ClusterInformation(Packet):
class ClusterState(Packet): class ClusterState(Packet):
""" """
Ask state of the cluster Ask the state of the cluster
Answer state of the cluster
:nodes: ctl -> A; A -> M
""" """
_answer = PStruct('answer_cluster_state', _answer = PStruct('answer_cluster_state',
...@@ -1243,8 +1329,7 @@ class ObjectUndoSerial(Packet): ...@@ -1243,8 +1329,7 @@ class ObjectUndoSerial(Packet):
""" """
Ask storage the serial where object data is when undoing given transaction, Ask storage the serial where object data is when undoing given transaction,
for a list of OIDs. for a list of OIDs.
C -> S
Answer serials at which object data is when undoing a given transaction.
object_tid_dict has the following format: object_tid_dict has the following format:
key: oid key: oid
value: 3-tuple value: 3-tuple
...@@ -1254,7 +1339,8 @@ class ObjectUndoSerial(Packet): ...@@ -1254,7 +1339,8 @@ class ObjectUndoSerial(Packet):
Where undone data is (tid at which data is before given undo). Where undone data is (tid at which data is before given undo).
is_current (bool) is_current (bool)
If current_serial's data is current on storage. If current_serial's data is current on storage.
S -> C
:nodes: C -> S
""" """
_fmt = PStruct('ask_undo_transaction', _fmt = PStruct('ask_undo_transaction',
PTID('tid'), PTID('tid'),
...@@ -1276,12 +1362,11 @@ class ObjectUndoSerial(Packet): ...@@ -1276,12 +1362,11 @@ class ObjectUndoSerial(Packet):
class CheckCurrentSerial(Packet): class CheckCurrentSerial(Packet):
""" """
Verifies if given serial is current for object oid in the database, and Check if given serial is current for the given oid, and lock it so that
take a write lock on it (so that this state is not altered until this state is not altered until transaction ends.
transaction ends). This maps to `checkCurrentSerialInTransaction`.
Answer to AskCheckCurrentSerial.
Same structure as AnswerStoreObject, to handle the same way, except there :nodes: C -> S
is nothing to invalidate in any client's cache.
""" """
_fmt = PStruct('ask_check_current_serial', _fmt = PStruct('ask_check_current_serial',
PTID('tid'), PTID('tid'),
...@@ -1294,11 +1379,8 @@ class CheckCurrentSerial(Packet): ...@@ -1294,11 +1379,8 @@ class CheckCurrentSerial(Packet):
class Pack(Packet): class Pack(Packet):
""" """
Request a pack at given TID. Request a pack at given TID.
C -> M
M -> S :nodes: C -> M -> S
Inform that packing it over.
S -> M
M -> C
""" """
_fmt = PStruct('ask_pack', _fmt = PStruct('ask_pack',
PTID('tid'), PTID('tid'),
...@@ -1310,8 +1392,10 @@ class Pack(Packet): ...@@ -1310,8 +1392,10 @@ class Pack(Packet):
class CheckReplicas(Packet): class CheckReplicas(Packet):
""" """
ctl -> A Ask the cluster to search for mismatches between replicas, metadata only,
A -> M and optionally within a specific range. Reference nodes can be specified.
:nodes: ctl -> A -> M
""" """
_fmt = PStruct('check_replicas', _fmt = PStruct('check_replicas',
PDict('partition_dict', PDict('partition_dict',
...@@ -1325,7 +1409,11 @@ class CheckReplicas(Packet): ...@@ -1325,7 +1409,11 @@ class CheckReplicas(Packet):
class CheckPartition(Packet): class CheckPartition(Packet):
""" """
M -> S Ask a storage node to compare a partition with all other nodes.
Like for CheckReplicas, only metadata are checked, optionally within a
specific range. A reference node can be specified.
:nodes: M -> S
""" """
_fmt = PStruct('check_partition', _fmt = PStruct('check_partition',
PNumber('partition'), PNumber('partition'),
...@@ -1342,11 +1430,8 @@ class CheckTIDRange(Packet): ...@@ -1342,11 +1430,8 @@ class CheckTIDRange(Packet):
Ask some stats about a range of transactions. Ask some stats about a range of transactions.
Used to know if there are differences between a replicating node and Used to know if there are differences between a replicating node and
reference node. reference node.
S -> S
Stats about a range of transactions. :nodes: S -> S
Used to know if there are differences between a replicating node and
reference node.
S -> S
""" """
_fmt = PStruct('ask_check_tid_range', _fmt = PStruct('ask_check_tid_range',
PNumber('partition'), PNumber('partition'),
...@@ -1366,11 +1451,8 @@ class CheckSerialRange(Packet): ...@@ -1366,11 +1451,8 @@ class CheckSerialRange(Packet):
Ask some stats about a range of object history. Ask some stats about a range of object history.
Used to know if there are differences between a replicating node and Used to know if there are differences between a replicating node and
reference node. reference node.
S -> S
Stats about a range of object history. :nodes: S -> S
Used to know if there are differences between a replicating node and
reference node.
S -> S
""" """
_fmt = PStruct('ask_check_serial_range', _fmt = PStruct('ask_check_serial_range',
PNumber('partition'), PNumber('partition'),
...@@ -1390,7 +1472,9 @@ class CheckSerialRange(Packet): ...@@ -1390,7 +1472,9 @@ class CheckSerialRange(Packet):
class PartitionCorrupted(Packet): class PartitionCorrupted(Packet):
""" """
S -> M Notify that mismatches were found while check replicas for a partition.
:nodes: S -> M
""" """
_fmt = PStruct('partition_corrupted', _fmt = PStruct('partition_corrupted',
PNumber('partition'), PNumber('partition'),
...@@ -1402,9 +1486,8 @@ class PartitionCorrupted(Packet): ...@@ -1402,9 +1486,8 @@ class PartitionCorrupted(Packet):
class LastTransaction(Packet): class LastTransaction(Packet):
""" """
Ask last committed TID. Ask last committed TID.
C -> M
Answer last committed TID. :nodes: C -> M; ctl -> A -> M
M -> C
""" """
poll_thread = True poll_thread = True
...@@ -1414,16 +1497,17 @@ class LastTransaction(Packet): ...@@ -1414,16 +1497,17 @@ class LastTransaction(Packet):
class NotifyReady(Packet): class NotifyReady(Packet):
""" """
Notify that node is ready to serve requests. Notify that we're ready to serve requests.
S -> M
"""
pass
# replication :nodes: S -> M
"""
class FetchTransactions(Packet): class FetchTransactions(Packet):
""" """
S -> S Ask a storage node to send all transaction data we don't have,
and reply with the list of transactions we should not have.
:nodes: S -> S
""" """
_fmt = PStruct('ask_transaction_list', _fmt = PStruct('ask_transaction_list',
PNumber('partition'), PNumber('partition'),
...@@ -1440,7 +1524,9 @@ class FetchTransactions(Packet): ...@@ -1440,7 +1524,9 @@ class FetchTransactions(Packet):
class AddTransaction(Packet): class AddTransaction(Packet):
""" """
S -> S Send metadata of a transaction to a node that do not have them.
:nodes: S -> S
""" """
nodelay = False nodelay = False
...@@ -1456,7 +1542,10 @@ class AddTransaction(Packet): ...@@ -1456,7 +1542,10 @@ class AddTransaction(Packet):
class FetchObjects(Packet): class FetchObjects(Packet):
""" """
S -> S Ask a storage node to send object records we don't have,
and reply with the list of records we should not have.
:nodes: S -> S
""" """
_fmt = PStruct('ask_object_list', _fmt = PStruct('ask_object_list',
PNumber('partition'), PNumber('partition'),
...@@ -1481,7 +1570,9 @@ class FetchObjects(Packet): ...@@ -1481,7 +1570,9 @@ class FetchObjects(Packet):
class AddObject(Packet): class AddObject(Packet):
""" """
S -> S Send an object record to a node that do not have it.
:nodes: S -> S
""" """
nodelay = False nodelay = False
...@@ -1498,11 +1589,12 @@ class Replicate(Packet): ...@@ -1498,11 +1589,12 @@ class Replicate(Packet):
""" """
Notify a storage node to replicate partitions up to given 'tid' Notify a storage node to replicate partitions up to given 'tid'
and from given sources. and from given sources.
M -> S
- upstream_name: replicate from an upstream cluster - upstream_name: replicate from an upstream cluster
- address: address of the source storage node, or None if there's no new - address: address of the source storage node, or None if there's no new
data up to 'tid' for the given partition data up to 'tid' for the given partition
:nodes: M -> S
""" """
_fmt = PStruct('replicate', _fmt = PStruct('replicate',
PTID('tid'), PTID('tid'),
...@@ -1517,7 +1609,8 @@ class ReplicationDone(Packet): ...@@ -1517,7 +1609,8 @@ class ReplicationDone(Packet):
""" """
Notify the master node that a partition has been successfully replicated Notify the master node that a partition has been successfully replicated
from a storage to another. from a storage to another.
S -> M
:nodes: S -> M
""" """
_fmt = PStruct('notify_replication_done', _fmt = PStruct('notify_replication_done',
PNumber('offset'), PNumber('offset'),
...@@ -1527,6 +1620,8 @@ class ReplicationDone(Packet): ...@@ -1527,6 +1620,8 @@ class ReplicationDone(Packet):
class Truncate(Packet): class Truncate(Packet):
""" """
Request DB to be truncated. Also used to leave backup mode. Request DB to be truncated. Also used to leave backup mode.
:nodes: ctl -> A -> M; M -> S
""" """
_fmt = PStruct('truncate', _fmt = PStruct('truncate',
PTID('tid'), PTID('tid'),
......
...@@ -42,11 +42,11 @@ class ClientOperationHandler(BaseHandler): ...@@ -42,11 +42,11 @@ class ClientOperationHandler(BaseHandler):
# for read rpc # for read rpc
return self.app.tm.read_queue return self.app.tm.read_queue
def askObject(self, conn, oid, serial, tid): def askObject(self, conn, oid, at, before):
app = self.app app = self.app
if app.tm.loadLocked(oid): if app.tm.loadLocked(oid):
raise DelayEvent raise DelayEvent
o = app.dm.getObject(oid, serial, tid) o = app.dm.getObject(oid, at, before)
try: try:
serial, next_serial, compression, checksum, data, data_serial = o serial, next_serial, compression, checksum, data, data_serial = o
except TypeError: except TypeError:
......
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