fprintf(f,
"#========================================\n"
"# Addition for log shipping, %s\n"
- "wal_level = hot_standby\n"
+ "wal_level = archive\n"
"archive_mode = on\n"
"archive_command = 'rsync %%p %s@%s:%s/%%f'\n"
"max_wal_senders = %s\n"
fprintf(f,
"#==========================================\n"
"# Added to initialize the slave, %s\n"
- "hot_standby = on\n"
+ "hot_standby = off\n"
"port = %s\n"
"pooler_port = %s\n"
- "wal_level = minimal\n"
+ "wal_level = archive\n"
"archive_mode = off\n"
"archive_command = ''\n"
"max_wal_senders = 0\n"
fprintf(f,
"#========================================\n"
"# Addition for log shipping, %s\n"
- "wal_level = hot_standby\n"
+ "wal_level = archive\n"
"archive_mode = on\n"
"archive_command = 'rsync %%p %s@%s:%s/%%f'\n"
"max_wal_senders = %d\n"
fprintf(f,
"#==========================================\n"
"# Added to initialize the slave, %s\n"
- "hot_standby = on\n"
+ "hot_standby = off\n"
"port = %d\n"
"pooler_port = %d\n"
- "wal_level = minimal\n" /* WAL level --- minimal. No cascade slave so far. */
+ "wal_level = archive\n"
"archive_mode = off\n" /* No archive mode */
"archive_command = ''\n" /* No archive mode */
"max_wal_senders = 0\n" /* Minimum WAL senders */
return 1;
}
AddMember(nodelist, name);
- if (pingNode(aval(VAR_coordSlaveServers)[idx], aval(VAR_coordSlavePorts)[idx]) == 0)
+ if (pingNodeSlave(aval(VAR_coordSlaveServers)[idx], aval(VAR_coordSlaveDirs)[idx]) == 0)
stop_coordinator_slave(nodelist, "immediate");
{
FILE *f;
return(NULL);
}
fprintf(f,
- "wal_level = hot_standby\n"
+ "wal_level = archive\n"
"archive_mode = on\n"
"archive_command = 'rsync %%p %s@%s:%s/%%f'\n"
"max_wal_senders = %s\n"
fprintf(f,
"#==========================================\n"
"# Added to startup the slave, %s\n"
- "hot_standby = on\n"
+ "hot_standby = off\n"
"port = %s\n"
"pooler_port = %s\n"
"# End of addition\n",
/* The next step might need improvement. When GTM is dead, the following may
* fail even though the master is running.
*/
- if (pingNode(aval(VAR_datanodeSlaveServers)[idx], aval(VAR_datanodeSlavePorts)[idx]) == 0)
+ if (pingNodeSlave(aval(VAR_datanodeSlaveServers)[idx],
+ aval(VAR_datanodeSlaveDirs)[idx]) == 0)
{
cmd_t *cmdReloadMaster;
fprintf(f,
"#========================================\n"
"# Addition for log shipping, %s\n"
- "wal_level = hot_standby\n"
+ "wal_level = archive\n"
"archive_mode = on\n"
"archive_command = 'rsync %%p %s@%s:%s/%%f'\n"
"max_wal_senders = %d\n"
fprintf(f,
"#==========================================\n"
"# Added to initialize the slave, %s\n"
- "hot_standby = on\n"
+ "hot_standby = off\n"
"port = %s\n"
"pooler_port = %s\n"
- "wal_level = minimal\n" /* WAL level --- minimal. No cascade slave so far. */
+ "wal_level = archive\n"
"archive_mode = off\n" /* No archive mode */
"archive_command = ''\n" /* No archive mode */
"max_wal_senders = 0\n" /* Minimum WAL senders */
return 1;
}
AddMember(nodelist, name);
- if (pingNode(aval(VAR_datanodeSlaveServers)[idx], aval(VAR_datanodeSlavePorts)[idx]) == 0)
+ if (pingNodeSlave(aval(VAR_datanodeSlaveServers)[idx],
+ aval(VAR_datanodeSlaveDirs)[idx]) == 0)
stop_datanode_slave(nodelist, "immediate");
{
FILE *f;
printResult(pingNode(aval(VAR_coordMasterServers)[idx], aval(VAR_coordPorts)[idx]),
"coordinator master", actualNodeList[ii]);
if (doesExist(VAR_coordSlaveServers, idx) && !is_none(aval(VAR_coordSlaveServers)[idx]))
- printResult(pingNode(aval(VAR_coordSlaveServers)[idx], aval(VAR_coordSlavePorts)[idx]),
+ printResult(pingNodeSlave(aval(VAR_coordSlaveServers)[idx],
+ aval(VAR_coordSlaveDirs)[idx]),
"coordinator slave", actualNodeList[ii]);
}
}
continue;
}
if (doesExist(VAR_datanodeSlaveServers, idx) && !is_none(aval(VAR_datanodeSlaveServers)[idx]))
- printResult(pingNode(aval(VAR_datanodeSlaveServers)[idx], aval(VAR_datanodeSlavePorts)[idx]),
+ printResult(pingNodeSlave(aval(VAR_datanodeSlaveServers)[idx],
+ aval(VAR_datanodeSlaveDirs)[idx]),
"datanode slave", actualNodeList[ii]);
else
elog(ERROR, "ERROR: datanode slave %s is not configured.\n", actualNodeList[ii]);
printResult(pingNode(aval(VAR_datanodeMasterServers)[idx], aval(VAR_datanodePorts)[idx]),
"datanode master", actualNodeList[ii]);
if (doesExist(VAR_datanodeSlaveServers, idx) && !is_none(aval(VAR_datanodeSlaveServers)[idx]))
- printResult(pingNode(aval(VAR_datanodeSlaveServers)[idx], aval(VAR_datanodeSlavePorts)[idx]),
+ printResult(pingNodeSlave(aval(VAR_datanodeSlaveServers)[idx],
+ aval(VAR_datanodeSlaveDirs)[idx]),
"datanode slave", actualNodeList[ii]);
}
}
return -1;
}
+/*
+ * A different mechanism to ping datanode and coordinator slaves since these
+ * nodes currently do not accept connections and hence won't respond to PQping
+ * requests. Instead we rely on "pg_ctl status", which must be run via ssh on
+ * the remote machine
+ */
+int pingNodeSlave(char *host, char *datadir)
+{
+ FILE *wkf;
+ char cmd[MAXLINE+1];
+ char line[MAXLINE+1];
+ int rv;
+
+ snprintf(cmd, MAXLINE, "ssh %s@%s pg_ctl -D %s status > /dev/null 2>&1; echo $?",
+ sval(VAR_pgxcUser), host, datadir);
+ wkf = popen(cmd, "r");
+ if (wkf == NULL)
+ return -1;
+ if (fgets(line, MAXLINE, wkf))
+ {
+ trimNl(line);
+ rv = atoi(line);
+ }
+ else
+ rv = -1;
+ pclose(wkf);
+ return rv;
+}
+
void trimNl(char *s)
{
for (;*s && *s != '\n'; s++);
extern int getEffectiveGtmProxyIdxFromServerName(char *serverName);
extern pid_t get_prog_pid(char *host, char *pidfile, char *dir);
extern int pingNode(char *host, char *port);
+extern int pingNodeSlave(char *host, char *datadir);
extern void trimNl(char *s);
extern char *getChPidList(char *host, pid_t ppid);
extern char *getIpAddress(char *hostName);