pg_tsdtm icon indicating copy to clipboard operation
pg_tsdtm copied to clipboard

=== dtm

Distributed transaction management tools for PostgreSQL.


Communication scheme

  .- Backend -.
 /             \
/               \

DTM ---- Backend ---- Coordinator \ / \ / `- Backend -´


Coordinator-Backend API

This API includes a set of postgres procedures that the coordinator can call with "select" statement.

extend_transaction (n integer) -> (higcid gcid) join_transaction (higcid gcid) -> () FIXME: add procedures that would start and finish 2pc


libdtm api

typedef unsigned long long cid_t;

// Connects to the specified DTM. DTMConn DtmConnect(char *host, int port);

// Disconnects from the DTM. Do not use the 'dtm' pointer after this call, or // bad things will happen. void DtmDisconnect(DTMConn dtm);

// Asks DTM for the first 'gcid' with unknown status. This 'gcid' is used as a // kind of snapshot. Returns the 'gcid' on success, or INVALID_GCID otherwise. cid_t DtmGlobalGetNextCid(DTMConn dtm);

// Prepares a commit. Returns the 'gcid' on success, or INVALID_GCID otherwise. cid_t DtmGlobalPrepare(DTMConn dtm);

// Finishes a given commit with 'committed' status. Returns 'true' on success, // 'false' otherwise. bool DtmGlobalCommit(DTMConn dtm, cid_t gcid);

// Finishes a given commit with 'aborted' status. void DtmGlobalRollback(DTMConn dtm, cid_t gcid);

// Gets the status of the commit identified by 'gcid'. Returns the status on // success, or -1 otherwise. int DtmGlobalGetTransStatus(DTMConn dtm, cid_t gcid);


Backend-DTM Protocol

DTM <--> Backend:

<- 'p' - "prepare" -> '+' - "commit prepared" -> '-' - "something went wrong"

<- 'c' - "commit" -> '+' - "commit saved" -> '-' - "something went wrong"

<- 'a' - "abort" -> '+' - "abort saved" -> '-' - "something went wrong"

<- 'h' - "horizon" -> '+' - "here is a gcid you can use as a snapshot" -> '-' - "something went wrong"

<- 's' - "status" -> '+''c|a|?' - "here is the transaction status" (c)ommitted, (a)borted or (?)unknown -> '-' - "something went wrong"

Backend disconnection is considered as an abort of all incomplete commits prepared by that backend.