コード例 #1
0
ファイル: gtm_cmd.c プロジェクト: DBInsight/postgres-x2
int
remove_gtmSlave(bool clean_opt)
{
	FILE *f;

	/* Check if gtm_slave is configured */
	if (!isVarYes(VAR_gtmSlave) || !sval(VAR_gtmSlaveServer) || is_none(sval(VAR_gtmSlaveServer)))
	{
		elog(ERROR, "ERROR: GTM slave is not configured.\n");
		return 1;
	}
	/* Check if gtm_slave is not running */
	if (!do_gtm_ping(sval(VAR_gtmSlaveServer), atoi(sval(VAR_gtmSlavePort))))
	{
		elog(ERROR, "ERROR: GTM slave is now running. Cannot remove it.\n");
		return 1;
	}
	elog(NOTICE, "Removing gtm slave.\n");
	/* Clean */
	if (clean_opt)
		clean_gtm_slave();
	/* Reconfigure */
	reset_var(VAR_gtmSlave);
	assign_sval(VAR_gtmSlave, Strdup("n"));
	reset_var(VAR_gtmSlaveServer);
	assign_sval(VAR_gtmSlaveServer, Strdup("none"));
	reset_var(VAR_gtmSlavePort);
	assign_sval(VAR_gtmSlavePort, Strdup("-1"));
	reset_var(VAR_gtmSlaveDir);
	assign_sval(VAR_gtmSlaveDir, Strdup("none"));
	/* Write the configuration file and bakup it */
	if ((f = fopen(pgxc_ctl_config_path, "a")) == NULL)
	{
		/* Should it be panic? */
		elog(ERROR, "ERROR: cannot open configuration file \"%s\", %s\n", pgxc_ctl_config_path, strerror(errno));
		return 1;
	}
	fprintf(f, 
			"#===================================================\n"
			"# pgxc configuration file updated due to GTM slave removal\n"
			"#        %s\n",
			timeStampString(date, MAXTOKEN+1));
	fprintSval(f, VAR_gtmSlave);
	fprintSval(f, VAR_gtmSlaveServer);
	fprintSval(f, VAR_gtmSlavePort);
	fprintSval(f, VAR_gtmSlaveDir);
	fprintf(f, "%s", "#----End of reconfiguration -------------------------\n");
	fclose(f);
	backup_configuration();
	elog(NOTICE, "Done.\n");
	return 0;
}
コード例 #2
0
ファイル: pgxc_monitor.c プロジェクト: pavanvd/postgres-xl
int
main(int ac, char *av[])
{
	int opt;
	nodetype_t	nodetype = NONE;
	char	   *port = NULL;
	char	   *host = NULL;
	char	   *nodename = NULL;
	bool		verbose = false;
	char	   *username = NULL;
	char	   *database = NULL;

	progname = strdup(av[0]);

	/* Print help if necessary */
	if (ac > 1)
	{
		if (strcmp(av[1], "--help") == 0 || strcmp(av[1], "-?") == 0)
		{
			usage();
			exit(0);
		}
	}

	/* Scan options */
	while ((opt = getopt(ac, av, "Z:U:d:h:n:p:qv")) != -1)
	{
		switch(opt)
		{
			case 'Z':
				if (strcmp(optarg, "gtm") == 0)
					nodetype = GTM;
				else if (strcmp(optarg, "node") == 0)
					nodetype = NODE;
				else
				{
					fprintf(stderr, "%s: invalid -Z option value.\n", progname);
					exit(3);
				}
				break;
			case 'h':
				Free(host);
				host = strdup(optarg);
				break;
			case 'n':
				Free(nodename);
				nodename = strdup(optarg);
				break;
			case 'p':
				Free(port);
				port = strdup(optarg);
				break;
			case 'q':
				verbose = false;
				break;
			case 'v':
				verbose = true;
				break;
			case 'U':
				username = strdup(optarg);
				break;
			case 'd':
				database = strdup(optarg);
				break;
			default:
				fprintf(stderr, "%s: unknow option %c.\n", progname, opt);
				exit(3);
		}
	}

	/* If no types are defined, well there is nothing to be done */
	if (nodetype == NONE)
	{
		fprintf(stderr, "%s: -Z option is missing, it is mandatory.\n", progname);
		usage();
		exit(3);
	}

	switch(nodetype)
	{
		case GTM:
			exit(do_gtm_ping(host, port, nodetype, nodename, verbose));
		case NODE:
			exit(do_node_ping(host, port, username, database, verbose));
		case NONE:
		default:
			break;
	}

	/* Should not happen */
	fprintf(stderr, "%s: internal error.\n", progname);
	exit(3);
}
コード例 #3
0
ファイル: gtm_cmd.c プロジェクト: DBInsight/postgres-x2
/*
 * Failover the gtm ------------------------------------------------------
 */
int
failover_gtm(void)
{
	char date[MAXTOKEN+1];
	char *stdIn;
	int rc;
	FILE *f;
	
	elog(INFO, "Failover gtm\n");
	if (!isVarYes(VAR_gtmSlave) || (sval(VAR_gtmSlaveServer) == NULL) || is_none(sval(VAR_gtmSlaveServer)))
	{
		elog(ERROR, "ERROR: GTM slave is not configured. Cannot failover.\n");
		return(1);
	}
	
	if (do_gtm_ping(sval(VAR_gtmSlaveServer), atoi(sval(VAR_gtmSlavePort))) != 0)
	{
		elog(ERROR, "ERROR: GTM slave is not running\n");
		return(1);
	}

	/* Promote the slave */
	elog(NOTICE, "Running \"gtm_ctl promote -Z gtm -D %s\"\n", sval(VAR_gtmSlaveDir));
	rc = doImmediate(sval(VAR_gtmSlaveServer), NULL, 
					 "gtm_ctl promote -Z gtm -D %s", sval(VAR_gtmSlaveDir));
	if (WEXITSTATUS(rc) != 0)
	{
		elog(ERROR, "ERROR: could not promote gtm (host:%s, dir:%s)\n", sval(VAR_gtmSlaveServer), sval(VAR_gtmSlaveDir));
		return 1;
	}

	/* Configure promoted gtm */
	if ((f = prepareLocalStdin(newFilename(stdIn), MAXPATH, NULL)) == NULL)
		return(1);
	fprintf(f,
			"#===================================================\n"
			"# Updated due to GTM failover\n"
			"#        %s\n"
			"startup = ACT\n"
			"#----End of reconfiguration -------------------------\n",
			timeStampString(date, MAXTOKEN+1));
	fclose(f);
	elog(NOTICE, "Updating gtm.conf at %s:%s\n", sval(VAR_gtmSlaveServer), sval(VAR_gtmSlaveDir));
	rc = doImmediate(sval(VAR_gtmSlaveServer), stdIn, "cat >> %s/gtm.conf", sval(VAR_gtmSlaveDir));
	if (WEXITSTATUS(rc) != 0)
	{
		elog(ERROR, "ERROR: could not update gtm.conf (host: %s, dir:%s)\n", sval(VAR_gtmSlaveServer), sval(VAR_gtmSlaveDir));
		return 1;
	}

	/* Update and backup configuration file */
	if ((f = prepareLocalStdin(stdIn, MAXPATH, NULL)) == NULL)
		return(1);
	fprintf(f,
			"#===================================================\n"
			"# pgxc configuration file updated due to GTM failover\n"
			"#        %s\n"
			"gtmMasterServer=%s\n"
			"gtmMasterPort=%s\n"
			"gtmMasterDir=%s\n"
			"gtmSlave=n\n"
			"gtmSlaveServer=none\n"
			"gtmSlavePort=0\n"
			"gtmSlaveDir=none\n"
			"#----End of reconfiguration -------------------------\n",
			timeStampString(date, MAXTOKEN+1),
			sval(VAR_gtmSlaveServer),
			sval(VAR_gtmSlavePort),
			sval(VAR_gtmSlaveDir));
	fclose(f);
	rc = doImmediate(NULL, stdIn, "cat >> %s", pgxc_ctl_config_path);
	if (WEXITSTATUS(rc) != 0)
	{
		elog(ERROR, "ERROR: could not update gtm.conf (host: %s, dir:%s)\n", sval(VAR_gtmSlaveServer), sval(VAR_gtmSlaveDir));
		return 1;
	}
	freeAndReset(stdIn);
	backup_configuration();

	/* Reconfigure myself */
	assign_val(VAR_gtmMasterServer, VAR_gtmSlaveServer); reset_var(VAR_gtmSlaveServer);
	assign_val(VAR_gtmMasterPort, VAR_gtmSlavePort); reset_var(VAR_gtmSlavePort);
	assign_val(VAR_gtmMasterDir, VAR_gtmSlaveDir); reset_var(VAR_gtmSlaveDir);
	assign_sval(VAR_gtmSlaveServer, "none");
	assign_sval(VAR_gtmSlavePort, "0");
	assign_sval(VAR_gtmSlaveDir, "none");
	assign_sval(VAR_gtmSlave, "n");

	return 0;
}