=== 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'<hex16 self> - "prepare" -> '+'<hex16 gcid> - "commit prepared" -> '-' - "something went wrong" <- 'c'<hex16 gcid> - "commit" -> '+' - "commit saved" -> '-' - "something went wrong" <- 'a'<hex16 gcid> - "abort" -> '+' - "abort saved" -> '-' - "something went wrong" <- 'h' - "horizon" -> '+'<hex16 gcid> - "here is a gcid you can use as a snapshot" -> '-' - "something went wrong" <- 's'<hex16 gcid> - "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.