int main(int argc, char *argv[]) { DB_ENV *dbenv; DB_SITE *dbsite; extern char *optarg; const char *home; char ch, *host, *portstr; int local_is_set, ret, is_group_creator; u_int16_t port; /* Used to track whether this is a replica or a master. */ APP_DATA my_app_data; dbenv = NULL; ret = local_is_set = is_group_creator = 0; home = NULL; my_app_data.is_master = 0; /* Assume that we start as a replica */ if ((ret = create_env(progname, &dbenv)) != 0) goto err; /* Make APP_DATA available through the environment handle. */ dbenv->app_private = &my_app_data; /* Default priority is 100. */ dbenv->rep_set_priority(dbenv, 100); /* Permanent messages require at least one ack. */ dbenv->repmgr_set_ack_policy(dbenv, DB_REPMGR_ACKS_ONE); /* Give 500 microseconds to receive the ack. */ dbenv->rep_set_timeout(dbenv, DB_REP_ACK_TIMEOUT, 500); /* Collect the command line options. */ while ((ch = getopt(argc, argv, "h:l:L:p:r:")) != EOF) switch (ch) { case 'h': home = optarg; break; /* Set the host and port used by this environment. */ case 'L': is_group_creator = 1; /* FALLTHROUGH */ case 'l': host = strtok(optarg, ":"); if ((portstr = strtok(NULL, ":")) == NULL) { fprintf(stderr, "Bad host specification.\n"); goto err; } port = (unsigned short)atoi(portstr); if ((ret = dbenv->repmgr_site(dbenv, host, port, &dbsite, 0)) != 0){ fprintf(stderr, "Could not set local address %s:%d.\n", host, port); goto err; } dbsite->set_config(dbsite, DB_LOCAL_SITE, 1); if (is_group_creator) dbsite->set_config(dbsite, DB_GROUP_CREATOR, 1); if ((ret = dbsite->close(dbsite)) != 0) { dbenv->err(dbenv, ret, "DB_SITE->close"); goto err; } local_is_set = 1; break; /* Set this replica's election priority. */ case 'p': dbenv->rep_set_priority(dbenv, atoi(optarg)); break; /* Identify another site in the replication group. */ case 'r': host = strtok(optarg, ":"); if ((portstr = strtok(NULL, ":")) == NULL) { fprintf(stderr, "Bad host specification.\n"); goto err; } port = (unsigned short)atoi(portstr); if ((ret = dbenv->repmgr_site(dbenv, host, port, &dbsite, 0)) != 0) { dbenv->err(dbenv, ret, "DB_ENV->repmgr_site"); goto err; } dbsite->set_config(dbsite, DB_BOOTSTRAP_HELPER, 1); if ((ret = dbsite->close(dbsite)) != 0) { dbenv->err(dbenv, ret, "DB_SITE->close"); goto err; } break; case '?': default: usage(); } /* Error check command line. */ if (home == NULL || !local_is_set) usage(); if ((ret = env_init(dbenv, home)) != 0) goto err; if ((ret = dbenv->repmgr_start(dbenv, 3, DB_REP_ELECTION)) != 0) goto err; if ((ret = doloop(dbenv)) != 0) { dbenv->err(dbenv, ret, "Application failed"); goto err; } err: if (dbenv != NULL) (void)dbenv->close(dbenv, 0); return (ret); }