int RepMgrGSG::init(RepConfigInfo *config) { int ret = 0; app_config = config; dbenv.set_errfile(stderr); dbenv.set_errpfx(progname); dbenv.set_app_private(&app_data); dbenv.set_event_notify(event_callback); dbenv.repmgr_set_ack_policy(DB_REPMGR_ACKS_ALL); DbSite *dbsite; dbenv.repmgr_site(app_config->this_host.host, app_config->this_host.port, &dbsite, 0); dbsite->set_config(DB_LOCAL_SITE, 1); if (app_config->this_host.creator) dbsite->set_config(DB_GROUP_CREATOR, 1); dbsite->close(); int i = 1; for ( REP_HOST_INFO *cur = app_config->other_hosts; cur != NULL && i <= app_config->nrsites; cur = cur->next, i++) { dbenv.repmgr_site(cur->host, cur->port, &dbsite, 0); dbsite->set_config(DB_BOOTSTRAP_HELPER, 1); dbsite->close(); } dbenv.rep_set_priority(app_config->priority); // Permanent messages require at least one ack. dbenv.repmgr_set_ack_policy(DB_REPMGR_ACKS_ONE); // Give 500 microseconds to receive the ack. dbenv.rep_set_timeout(DB_REP_ACK_TIMEOUT, 5); // We can now open our environment, although we're not ready to // begin replicating. However, we want to have a dbenv around // so that we can send it into any of our message handlers. dbenv.set_cachesize(0, CACHESIZE, 0); dbenv.set_flags(DB_TXN_NOSYNC, 1); try { dbenv.open(app_config->home, DB_CREATE | DB_RECOVER | DB_THREAD | DB_INIT_REP | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN, 0); } catch(DbException dbe) { cerr << "Caught an exception during DB environment open." << endl << "Ensure that the home directory is created prior to starting" << " the application." << endl; ret = ENOENT; goto err; } if ((ret = dbenv.repmgr_start(3, app_config->start_policy)) != 0) goto err; err: return ret; }