/* * Register myself to the GTM (active) as a "disconnected" node. * * This status would be updated later after restoring completion. * See gtm_standby_update_self(). * * Returns 1 on success, 0 on failure. */ int gtm_standby_register_self(const char *node_name, int port, const char *datadir) { int rc; elog(LOG, "Registering standby-GTM status..."); node_get_local_addr(GTM_ActiveConn, standbyHostName, sizeof(standbyNodeName), &rc); if (rc != 0) return 0; memset(standbyNodeName, 0, NI_MAXHOST); strncpy(standbyNodeName, node_name, NI_MAXHOST - 1); standbyPortNumber = port; standbyDataDir= (char *)datadir; rc = node_register_internal(GTM_ActiveConn, GTM_NODE_GTM, standbyHostName, standbyPortNumber, standbyNodeName, standbyDataDir, NODE_DISCONNECTED); if (rc < 0) { elog(LOG, "Failed to register a standby-GTM status."); return 0; } elog(LOG, "Registering standby-GTM done."); return 1; }
/* * Update my node status from "disconnected" to "connected" in GTM by myself. * * Returns 1 on success, 0 on failure. */ int gtm_standby_activate_self(void) { int rc; elog(LOG, "Updating the standby-GTM status to \"CONNECTED\"..."); rc = node_unregister(GTM_ActiveConn, GTM_NODE_GTM, standbyNodeName); if (rc < 0) { elog(LOG, "Failed to unregister old standby-GTM status."); return 0; } rc = node_register_internal(GTM_ActiveConn, GTM_NODE_GTM, standbyHostName, standbyPortNumber, standbyNodeName, standbyDataDir, NODE_CONNECTED); if (rc < 0) { elog(LOG, "Failed to register a new standby-GTM status."); return 0; } elog(LOG, "Updating the standby-GTM status done."); return 1; }
void test01() { GlobalTransactionId gxid; int rc; char host[1024]; printf("\n=== test01:node_register ===\n"); setUp(); node_get_local_addr(conn, host, sizeof(host)); /* * starting */ rc = node_register_internal(conn, GTM_NODE_GTM, host, 6667, "One zero two", "/tmp/pgxc/data/gtm_standby", NODE_DISCONNECTED); _ASSERT(rc == 0); rc = node_unregister(conn, GTM_NODE_GTM, "One zero two"); _ASSERT(rc == 0); rc = node_register_internal(conn, GTM_NODE_GTM, host, 6667, "One zero two", "/tmp/pgxc/data/gtm_standby", NODE_CONNECTED); _ASSERT(rc == 0); sleep(10); gxid = begin_transaction(conn, GTM_ISOLATION_SERIALIZABLE, timestamp); _ASSERT( gxid!=InvalidGlobalTransactionId ); rc = prepare_transaction(conn, gxid); _ASSERT( rc!=-1 ); rc = abort_transaction(conn, gxid); _ASSERT( rc!=-1 ); sleep(10); /* * closing */ rc = node_unregister(conn, GTM_NODE_GTM, "One zero two"); _ASSERT( rc==0 ); tearDown(); }