When multiple nodes in a computer network perform work on a shared entity,
such as a database record, an arbitration process is used to ensure
changes made by more than one node to the same data is propagated to each
of the nodes holding the shared entity and that the changes are applied
in the same order on each of the nodes. An arbitration cycle for a
particular entity is begun on a node ("instigator") when the node
broadcasts a proposal message for a change to the entity to the other
nodes or when the node ("observer") receives such a proposal message.
Multiple nodes can be instigators during a single arbitration cycle. Each
node that receives a proposal message sends a response message to the
corresponding instigator. The arbitration cycle is closed to additional
proposal messages after one instigator has received responses from all
the nodes that share the entity. After each instigator node receives all
the proposals in the arbitration cycle, it determines whether it is the
winner of the arbitration cycle and broadcasts a closure message if it
is. Each node determines an order in which to apply the changes proposed
in the arbitration cycle when it knows it has received all the proposals
in the arbitration cycle as determined by the sending or receiving of the
closure message. Because each arbitration cycle is associated with a
particular entity, multiple arbitration cycles associated with different
items can be running concurrently in the network but multiple arbitration
cycles for the same item must be executed serially. The arbitration
process is executed even if there is only one proposal made in an
arbitration cycle since the arbitration process enables the orderly
propagation of changes across all the nodes that share the entity.