def test01_basic_replication(self): master_port = test_support.find_unused_port() self.dbenvMaster.repmgr_set_local_site("127.0.0.1", master_port) client_port = test_support.find_unused_port() self.dbenvClient.repmgr_set_local_site("127.0.0.1", client_port) self.dbenvMaster.repmgr_add_remote_site("127.0.0.1", client_port) self.dbenvClient.repmgr_add_remote_site("127.0.0.1", master_port) self.dbenvMaster.rep_set_nsites(2) self.dbenvClient.rep_set_nsites(2) self.dbenvMaster.rep_set_priority(10) self.dbenvClient.rep_set_priority(0) self.dbenvMaster.rep_set_timeout(db.DB_REP_CONNECTION_RETRY, 100123) self.dbenvClient.rep_set_timeout(db.DB_REP_CONNECTION_RETRY, 100321) self.assertEqual( self.dbenvMaster.rep_get_timeout(db.DB_REP_CONNECTION_RETRY), 100123) self.assertEqual( self.dbenvClient.rep_get_timeout(db.DB_REP_CONNECTION_RETRY), 100321) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100234) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100432) self.assertEqual( self.dbenvMaster.rep_get_timeout(db.DB_REP_ELECTION_TIMEOUT), 100234) self.assertEqual( self.dbenvClient.rep_get_timeout(db.DB_REP_ELECTION_TIMEOUT), 100432) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100345) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100543) self.assertEqual( self.dbenvMaster.rep_get_timeout(db.DB_REP_ELECTION_RETRY), 100345) self.assertEqual( self.dbenvClient.rep_get_timeout(db.DB_REP_ELECTION_RETRY), 100543) self.dbenvMaster.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvClient.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvMaster.repmgr_start(1, db.DB_REP_MASTER) self.dbenvClient.repmgr_start(1, db.DB_REP_CLIENT) self.assertEqual(self.dbenvMaster.rep_get_nsites(), 2) self.assertEqual(self.dbenvClient.rep_get_nsites(), 2) self.assertEqual(self.dbenvMaster.rep_get_priority(), 10) self.assertEqual(self.dbenvClient.rep_get_priority(), 0) self.assertEqual(self.dbenvMaster.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) self.assertEqual(self.dbenvClient.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) # The timeout is necessary in BDB 4.5, since DB_EVENT_REP_STARTUPDONE # is not generated if the master has no new transactions. # This is solved in BDB 4.6 (#15542). import time timeout = time.time() + 60 while (time.time() < timeout) and not (self.confirmed_master and self.client_startupdone): time.sleep(0.02) # self.client_startupdone does not always get set to True within # the timeout. On windows this may be a deep issue, on other # platforms it is likely just a timing issue, especially on slow # virthost buildbots (see issue 3892 for more). Even though # the timeout triggers, the rest of this test method usually passes # (but not all of it always, see below). So we just note the # timeout on stderr and keep soldering on. if time.time() > timeout: import sys print >> sys.stderr, ("XXX: timeout happened before" "startup was confirmed - see issue 3892") startup_timeout = True d = self.dbenvMaster.repmgr_site_list() self.assertEqual(len(d), 1) self.assertEqual(d[0][0], "127.0.0.1") self.assertEqual(d[0][1], client_port) self.assertTrue((d[0][2]==db.DB_REPMGR_CONNECTED) or \ (d[0][2]==db.DB_REPMGR_DISCONNECTED)) d = self.dbenvClient.repmgr_site_list() self.assertEqual(len(d), 1) self.assertEqual(d[0][0], "127.0.0.1") self.assertEqual(d[0][1], master_port) self.assertTrue((d[0][2]==db.DB_REPMGR_CONNECTED) or \ (d[0][2]==db.DB_REPMGR_DISCONNECTED)) if db.version() >= (4, 6): d = self.dbenvMaster.repmgr_stat(flags=db.DB_STAT_CLEAR) self.assertTrue("msgs_queued" in d) self.dbMaster = db.DB(self.dbenvMaster) txn = self.dbenvMaster.txn_begin() self.dbMaster.open("test", db.DB_HASH, db.DB_CREATE, 0666, txn=txn) txn.commit() import time, os.path timeout = time.time() + 10 while (time.time()<timeout) and \ not (os.path.exists(os.path.join(self.homeDirClient,"test"))) : time.sleep(0.01) self.dbClient = db.DB(self.dbenvClient) while True: txn = self.dbenvClient.txn_begin() try: self.dbClient.open("test", db.DB_HASH, flags=db.DB_RDONLY, mode=0666, txn=txn) except db.DBRepHandleDeadError: txn.abort() self.dbClient.close() self.dbClient = db.DB(self.dbenvClient) continue txn.commit() break txn = self.dbenvMaster.txn_begin() self.dbMaster.put("ABC", "123", txn=txn) txn.commit() import time timeout = time.time() + 10 v = None while (time.time() < timeout) and (v is None): txn = self.dbenvClient.txn_begin() v = self.dbClient.get("ABC", txn=txn) txn.commit() if v is None: time.sleep(0.02) # If startup did not happen before the timeout above, then this test # sometimes fails. This happens randomly, which causes buildbot # instability, but all the other bsddb tests pass. Since bsddb3 in the # stdlib is currently not getting active maintenance, and is gone in # py3k, we just skip the end of the test in that case. if time.time() >= timeout and startup_timeout: self.skipTest("replication test skipped due to random failure, " "see issue 3892") self.assertTrue(time.time() < timeout) self.assertEqual("123", v) txn = self.dbenvMaster.txn_begin() self.dbMaster.delete("ABC", txn=txn) txn.commit() timeout = time.time() + 10 while (time.time() < timeout) and (v is not None): txn = self.dbenvClient.txn_begin() v = self.dbClient.get("ABC", txn=txn) txn.commit() if v is None: time.sleep(0.02) self.assertTrue(time.time() < timeout) self.assertEqual(None, v)
def test01_basic_replication(self): master_port = test_support.find_unused_port() client_port = test_support.find_unused_port() if db.version() >= (5, 2): self.site = self.dbenvMaster.repmgr_site('127.0.0.1', master_port) self.site.set_config(db.DB_GROUP_CREATOR, True) self.site.set_config(db.DB_LOCAL_SITE, True) self.site2 = self.dbenvMaster.repmgr_site('127.0.0.1', client_port) self.site3 = self.dbenvClient.repmgr_site('127.0.0.1', master_port) self.site3.set_config(db.DB_BOOTSTRAP_HELPER, True) self.site4 = self.dbenvClient.repmgr_site('127.0.0.1', client_port) self.site4.set_config(db.DB_LOCAL_SITE, True) d = {db.DB_BOOTSTRAP_HELPER: [False, False, True, False], db.DB_GROUP_CREATOR: [True, False, False, False], db.DB_LEGACY: [False, False, False, False], db.DB_LOCAL_SITE: [True, False, False, True], db.DB_REPMGR_PEER: [False, False, False, False]} for i, j in d.items(): for k, v in zip([self.site, self.site2, self.site3, self.site4], j): if v: self.assertTrue(k.get_config(i)) else: self.assertFalse(k.get_config(i)) self.assertNotEqual(self.site.get_eid(), self.site2.get_eid()) self.assertNotEqual(self.site3.get_eid(), self.site4.get_eid()) for i, j in zip([self.site, self.site2, self.site3, self.site4], [master_port, client_port, master_port, client_port]): addr = i.get_address() self.assertEqual(addr, ('127.0.0.1', j)) for i in [self.site, self.site2]: self.assertEqual(i.get_address(), self.dbenvMaster.repmgr_site_by_eid(i.get_eid()).get_address()) for i in [self.site3, self.site4]: self.assertEqual(i.get_address(), self.dbenvClient.repmgr_site_by_eid(i.get_eid()).get_address()) else: self.dbenvMaster.repmgr_set_local_site('127.0.0.1', master_port) self.dbenvClient.repmgr_set_local_site('127.0.0.1', client_port) self.dbenvMaster.repmgr_add_remote_site('127.0.0.1', client_port) self.dbenvClient.repmgr_add_remote_site('127.0.0.1', master_port) self.dbenvMaster.rep_set_nsites(2) self.dbenvClient.rep_set_nsites(2) self.dbenvMaster.rep_set_priority(10) self.dbenvClient.rep_set_priority(0) self.dbenvMaster.rep_set_timeout(db.DB_REP_CONNECTION_RETRY, 100123) self.dbenvClient.rep_set_timeout(db.DB_REP_CONNECTION_RETRY, 100321) self.assertEqual(self.dbenvMaster.rep_get_timeout(db.DB_REP_CONNECTION_RETRY), 100123) self.assertEqual(self.dbenvClient.rep_get_timeout(db.DB_REP_CONNECTION_RETRY), 100321) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100234) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100432) self.assertEqual(self.dbenvMaster.rep_get_timeout(db.DB_REP_ELECTION_TIMEOUT), 100234) self.assertEqual(self.dbenvClient.rep_get_timeout(db.DB_REP_ELECTION_TIMEOUT), 100432) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100345) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100543) self.assertEqual(self.dbenvMaster.rep_get_timeout(db.DB_REP_ELECTION_RETRY), 100345) self.assertEqual(self.dbenvClient.rep_get_timeout(db.DB_REP_ELECTION_RETRY), 100543) self.dbenvMaster.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvClient.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvMaster.repmgr_start(1, db.DB_REP_MASTER) self.dbenvClient.repmgr_start(1, db.DB_REP_CLIENT) self.assertEqual(self.dbenvMaster.rep_get_nsites(), 2) self.assertEqual(self.dbenvClient.rep_get_nsites(), 2) self.assertEqual(self.dbenvMaster.rep_get_priority(), 10) self.assertEqual(self.dbenvClient.rep_get_priority(), 0) self.assertEqual(self.dbenvMaster.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) self.assertEqual(self.dbenvClient.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) import time timeout = time.time() + 60 while time.time() < timeout and not (self.confirmed_master and self.client_startupdone): time.sleep(0.02) if time.time() > timeout: import sys print >> sys.stderr, 'XXX: timeout happened beforestartup was confirmed - see issue 3892' startup_timeout = True d = self.dbenvMaster.repmgr_site_list() self.assertEqual(len(d), 1) d = d.values()[0] self.assertEqual(d[0], '127.0.0.1') self.assertEqual(d[1], client_port) self.assertTrue(d[2] == db.DB_REPMGR_CONNECTED or d[2] == db.DB_REPMGR_DISCONNECTED) d = self.dbenvClient.repmgr_site_list() self.assertEqual(len(d), 1) d = d.values()[0] self.assertEqual(d[0], '127.0.0.1') self.assertEqual(d[1], master_port) self.assertTrue(d[2] == db.DB_REPMGR_CONNECTED or d[2] == db.DB_REPMGR_DISCONNECTED) if db.version() >= (4, 6): d = self.dbenvMaster.repmgr_stat(flags=db.DB_STAT_CLEAR) self.assertTrue('msgs_queued' in d) self.dbMaster = db.DB(self.dbenvMaster) txn = self.dbenvMaster.txn_begin() self.dbMaster.open('test', db.DB_HASH, db.DB_CREATE, 438, txn=txn) txn.commit() import time, os.path timeout = time.time() + 10 while time.time() < timeout and not os.path.exists(os.path.join(self.homeDirClient, 'test')): time.sleep(0.01) self.dbClient = db.DB(self.dbenvClient) while True: txn = self.dbenvClient.txn_begin() try: self.dbClient.open('test', db.DB_HASH, flags=db.DB_RDONLY, mode=438, txn=txn) except db.DBRepHandleDeadError: txn.abort() self.dbClient.close() self.dbClient = db.DB(self.dbenvClient) continue txn.commit() break txn = self.dbenvMaster.txn_begin() self.dbMaster.put('ABC', '123', txn=txn) txn.commit() import time timeout = time.time() + 10 v = None while time.time() < timeout and v is None: txn = self.dbenvClient.txn_begin() v = self.dbClient.get('ABC', txn=txn) txn.commit() if v is None: time.sleep(0.02) if time.time() >= timeout and startup_timeout: self.skipTest('replication test skipped due to random failure, see issue 3892') self.assertTrue(time.time() < timeout) self.assertEqual('123', v) txn = self.dbenvMaster.txn_begin() self.dbMaster.delete('ABC', txn=txn) txn.commit() timeout = time.time() + 10 while time.time() < timeout and v is not None: txn = self.dbenvClient.txn_begin() v = self.dbClient.get('ABC', txn=txn) txn.commit() if v is None: time.sleep(0.02) self.assertTrue(time.time() < timeout) self.assertEqual(None, v) return
def test01_basic_replication(self) : master_port = test_support.find_unused_port() client_port = test_support.find_unused_port() if db.version() >= (5, 2) : self.site = self.dbenvMaster.repmgr_site("127.0.0.1", master_port) self.site.set_config(db.DB_GROUP_CREATOR, True) self.site.set_config(db.DB_LOCAL_SITE, True) self.site2 = self.dbenvMaster.repmgr_site("127.0.0.1", client_port) self.site3 = self.dbenvClient.repmgr_site("127.0.0.1", master_port) self.site3.set_config(db.DB_BOOTSTRAP_HELPER, True) self.site4 = self.dbenvClient.repmgr_site("127.0.0.1", client_port) self.site4.set_config(db.DB_LOCAL_SITE, True) d = { db.DB_BOOTSTRAP_HELPER: [False, False, True, False], db.DB_GROUP_CREATOR: [True, False, False, False], db.DB_LEGACY: [False, False, False, False], db.DB_LOCAL_SITE: [True, False, False, True], db.DB_REPMGR_PEER: [False, False, False, False ], } for i, j in d.items() : for k, v in \ zip([self.site, self.site2, self.site3, self.site4], j) : if v : self.assertTrue(k.get_config(i)) else : self.assertFalse(k.get_config(i)) self.assertNotEqual(self.site.get_eid(), self.site2.get_eid()) self.assertNotEqual(self.site3.get_eid(), self.site4.get_eid()) for i, j in zip([self.site, self.site2, self.site3, self.site4], \ [master_port, client_port, master_port, client_port]) : addr = i.get_address() self.assertEqual(addr, ("127.0.0.1", j)) for i in [self.site, self.site2] : self.assertEqual(i.get_address(), self.dbenvMaster.repmgr_site_by_eid(i.get_eid()).get_address()) for i in [self.site3, self.site4] : self.assertEqual(i.get_address(), self.dbenvClient.repmgr_site_by_eid(i.get_eid()).get_address()) else : self.dbenvMaster.repmgr_set_local_site("127.0.0.1", master_port) self.dbenvClient.repmgr_set_local_site("127.0.0.1", client_port) self.dbenvMaster.repmgr_add_remote_site("127.0.0.1", client_port) self.dbenvClient.repmgr_add_remote_site("127.0.0.1", master_port) self.dbenvMaster.rep_set_nsites(2) self.dbenvClient.rep_set_nsites(2) self.dbenvMaster.rep_set_priority(10) self.dbenvClient.rep_set_priority(0) self.dbenvMaster.rep_set_timeout(db.DB_REP_CONNECTION_RETRY,100123) self.dbenvClient.rep_set_timeout(db.DB_REP_CONNECTION_RETRY,100321) self.assertEqual(self.dbenvMaster.rep_get_timeout( db.DB_REP_CONNECTION_RETRY), 100123) self.assertEqual(self.dbenvClient.rep_get_timeout( db.DB_REP_CONNECTION_RETRY), 100321) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100234) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100432) self.assertEqual(self.dbenvMaster.rep_get_timeout( db.DB_REP_ELECTION_TIMEOUT), 100234) self.assertEqual(self.dbenvClient.rep_get_timeout( db.DB_REP_ELECTION_TIMEOUT), 100432) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100345) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100543) self.assertEqual(self.dbenvMaster.rep_get_timeout( db.DB_REP_ELECTION_RETRY), 100345) self.assertEqual(self.dbenvClient.rep_get_timeout( db.DB_REP_ELECTION_RETRY), 100543) self.dbenvMaster.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvClient.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvMaster.repmgr_start(1, db.DB_REP_MASTER); self.dbenvClient.repmgr_start(1, db.DB_REP_CLIENT); self.assertEqual(self.dbenvMaster.rep_get_nsites(),2) self.assertEqual(self.dbenvClient.rep_get_nsites(),2) self.assertEqual(self.dbenvMaster.rep_get_priority(),10) self.assertEqual(self.dbenvClient.rep_get_priority(),0) self.assertEqual(self.dbenvMaster.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) self.assertEqual(self.dbenvClient.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) # The timeout is necessary in BDB 4.5, since DB_EVENT_REP_STARTUPDONE # is not generated if the master has no new transactions. # This is solved in BDB 4.6 (#15542). import time timeout = time.time()+60 while (time.time()<timeout) and not (self.confirmed_master and self.client_startupdone) : time.sleep(0.02) # self.client_startupdone does not always get set to True within # the timeout. On windows this may be a deep issue, on other # platforms it is likely just a timing issue, especially on slow # virthost buildbots (see issue 3892 for more). Even though # the timeout triggers, the rest of this test method usually passes # (but not all of it always, see below). So we just note the # timeout on stderr and keep soldering on. if time.time()>timeout: import sys print >> sys.stderr, ("XXX: timeout happened before" "startup was confirmed - see issue 3892") startup_timeout = True d = self.dbenvMaster.repmgr_site_list() self.assertEqual(len(d), 1) d = d.values()[0] # There is only one self.assertEqual(d[0], "127.0.0.1") self.assertEqual(d[1], client_port) self.assertTrue((d[2]==db.DB_REPMGR_CONNECTED) or \ (d[2]==db.DB_REPMGR_DISCONNECTED)) d = self.dbenvClient.repmgr_site_list() self.assertEqual(len(d), 1) d = d.values()[0] # There is only one self.assertEqual(d[0], "127.0.0.1") self.assertEqual(d[1], master_port) self.assertTrue((d[2]==db.DB_REPMGR_CONNECTED) or \ (d[2]==db.DB_REPMGR_DISCONNECTED)) if db.version() >= (4,6) : d = self.dbenvMaster.repmgr_stat(flags=db.DB_STAT_CLEAR); self.assertTrue("msgs_queued" in d) self.dbMaster=db.DB(self.dbenvMaster) txn=self.dbenvMaster.txn_begin() self.dbMaster.open("test", db.DB_HASH, db.DB_CREATE, 0666, txn=txn) txn.commit() import time,os.path timeout=time.time()+10 while (time.time()<timeout) and \ not (os.path.exists(os.path.join(self.homeDirClient,"test"))) : time.sleep(0.01) self.dbClient=db.DB(self.dbenvClient) while True : txn=self.dbenvClient.txn_begin() try : self.dbClient.open("test", db.DB_HASH, flags=db.DB_RDONLY, mode=0666, txn=txn) except db.DBRepHandleDeadError : txn.abort() self.dbClient.close() self.dbClient=db.DB(self.dbenvClient) continue txn.commit() break txn=self.dbenvMaster.txn_begin() self.dbMaster.put("ABC", "123", txn=txn) txn.commit() import time timeout=time.time()+10 v=None while (time.time()<timeout) and (v is None) : txn=self.dbenvClient.txn_begin() v=self.dbClient.get("ABC", txn=txn) txn.commit() if v is None : time.sleep(0.02) # If startup did not happen before the timeout above, then this test # sometimes fails. This happens randomly, which causes buildbot # instability, but all the other bsddb tests pass. Since bsddb3 in the # stdlib is currently not getting active maintenance, and is gone in # py3k, we just skip the end of the test in that case. if time.time()>=timeout and startup_timeout: self.skipTest("replication test skipped due to random failure, " "see issue 3892") self.assertTrue(time.time()<timeout) self.assertEqual("123", v) txn=self.dbenvMaster.txn_begin() self.dbMaster.delete("ABC", txn=txn) txn.commit() timeout=time.time()+10 while (time.time()<timeout) and (v is not None) : txn=self.dbenvClient.txn_begin() v=self.dbClient.get("ABC", txn=txn) txn.commit() if v is None : time.sleep(0.02) self.assertTrue(time.time()<timeout) self.assertEqual(None, v)
def test01_basic_replication(self) : master_port = test_support.find_unused_port() self.dbenvMaster.repmgr_set_local_site("127.0.0.1", master_port) client_port = test_support.find_unused_port() self.dbenvClient.repmgr_set_local_site("127.0.0.1", client_port) self.dbenvMaster.repmgr_add_remote_site("127.0.0.1", client_port) self.dbenvClient.repmgr_add_remote_site("127.0.0.1", master_port) self.dbenvMaster.rep_set_nsites(2) self.dbenvClient.rep_set_nsites(2) self.dbenvMaster.rep_set_priority(10) self.dbenvClient.rep_set_priority(0) self.dbenvMaster.rep_set_timeout(db.DB_REP_CONNECTION_RETRY,100123) self.dbenvClient.rep_set_timeout(db.DB_REP_CONNECTION_RETRY,100321) self.assertEquals(self.dbenvMaster.rep_get_timeout( db.DB_REP_CONNECTION_RETRY), 100123) self.assertEquals(self.dbenvClient.rep_get_timeout( db.DB_REP_CONNECTION_RETRY), 100321) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100234) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100432) self.assertEquals(self.dbenvMaster.rep_get_timeout( db.DB_REP_ELECTION_TIMEOUT), 100234) self.assertEquals(self.dbenvClient.rep_get_timeout( db.DB_REP_ELECTION_TIMEOUT), 100432) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100345) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100543) self.assertEquals(self.dbenvMaster.rep_get_timeout( db.DB_REP_ELECTION_RETRY), 100345) self.assertEquals(self.dbenvClient.rep_get_timeout( db.DB_REP_ELECTION_RETRY), 100543) self.dbenvMaster.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvClient.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvMaster.repmgr_start(1, db.DB_REP_MASTER); self.dbenvClient.repmgr_start(1, db.DB_REP_CLIENT); self.assertEquals(self.dbenvMaster.rep_get_nsites(),2) self.assertEquals(self.dbenvClient.rep_get_nsites(),2) self.assertEquals(self.dbenvMaster.rep_get_priority(),10) self.assertEquals(self.dbenvClient.rep_get_priority(),0) self.assertEquals(self.dbenvMaster.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) self.assertEquals(self.dbenvClient.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) # The timeout is necessary in BDB 4.5, since DB_EVENT_REP_STARTUPDONE # is not generated if the master has no new transactions. # This is solved in BDB 4.6 (#15542). import time timeout = time.time()+10 while (time.time()<timeout) and not (self.confirmed_master and self.client_startupdone) : time.sleep(0.02) # this fails on Windows as self.client_startupdone never gets set # to True - see bug 3892. BUT - even though this assertion # fails on Windows the rest of the test passes - so to prove # that we let the rest of the test run. Sadly we can't # make use of raising TestSkipped() here (unittest still # reports it as an error), so we yell to stderr. import sys if sys.platform=="win32": print >> sys.stderr, \ "XXX - windows bsddb replication fails on windows and is skipped" print >> sys.stderr, "XXX - Please see issue #3892" else: self.assertTrue(time.time()<timeout) d = self.dbenvMaster.repmgr_site_list() self.assertEquals(len(d), 1) self.assertEquals(d[0][0], "127.0.0.1") self.assertEquals(d[0][1], client_port) self.assertTrue((d[0][2]==db.DB_REPMGR_CONNECTED) or \ (d[0][2]==db.DB_REPMGR_DISCONNECTED)) d = self.dbenvClient.repmgr_site_list() self.assertEquals(len(d), 1) self.assertEquals(d[0][0], "127.0.0.1") self.assertEquals(d[0][1], master_port) self.assertTrue((d[0][2]==db.DB_REPMGR_CONNECTED) or \ (d[0][2]==db.DB_REPMGR_DISCONNECTED)) if db.version() >= (4,6) : d = self.dbenvMaster.repmgr_stat(flags=db.DB_STAT_CLEAR); self.assertTrue("msgs_queued" in d) self.dbMaster=db.DB(self.dbenvMaster) txn=self.dbenvMaster.txn_begin() self.dbMaster.open("test", db.DB_HASH, db.DB_CREATE, 0666, txn=txn) txn.commit() import time,os.path timeout=time.time()+10 while (time.time()<timeout) and \ not (os.path.exists(os.path.join(self.homeDirClient,"test"))) : time.sleep(0.01) self.dbClient=db.DB(self.dbenvClient) while True : txn=self.dbenvClient.txn_begin() try : self.dbClient.open("test", db.DB_HASH, flags=db.DB_RDONLY, mode=0666, txn=txn) except db.DBRepHandleDeadError : txn.abort() self.dbClient.close() self.dbClient=db.DB(self.dbenvClient) continue txn.commit() break txn=self.dbenvMaster.txn_begin() self.dbMaster.put("ABC", "123", txn=txn) txn.commit() import time timeout=time.time()+10 v=None while (time.time()<timeout) and (v==None) : txn=self.dbenvClient.txn_begin() v=self.dbClient.get("ABC", txn=txn) txn.commit() if v==None : time.sleep(0.02) self.assertTrue(time.time()<timeout) self.assertEquals("123", v) txn=self.dbenvMaster.txn_begin() self.dbMaster.delete("ABC", txn=txn) txn.commit() timeout=time.time()+10 while (time.time()<timeout) and (v!=None) : txn=self.dbenvClient.txn_begin() v=self.dbClient.get("ABC", txn=txn) txn.commit() if v==None : time.sleep(0.02) self.assertTrue(time.time()<timeout) self.assertEquals(None, v)
def test01_basic_replication(self): master_port = test_support.find_unused_port() client_port = test_support.find_unused_port() if db.version() >= (5, 2): self.site = self.dbenvMaster.repmgr_site('127.0.0.1', master_port) self.site.set_config(db.DB_GROUP_CREATOR, True) self.site.set_config(db.DB_LOCAL_SITE, True) self.site2 = self.dbenvMaster.repmgr_site('127.0.0.1', client_port) self.site3 = self.dbenvClient.repmgr_site('127.0.0.1', master_port) self.site3.set_config(db.DB_BOOTSTRAP_HELPER, True) self.site4 = self.dbenvClient.repmgr_site('127.0.0.1', client_port) self.site4.set_config(db.DB_LOCAL_SITE, True) d = { db.DB_BOOTSTRAP_HELPER: [False, False, True, False], db.DB_GROUP_CREATOR: [True, False, False, False], db.DB_LEGACY: [False, False, False, False], db.DB_LOCAL_SITE: [True, False, False, True], db.DB_REPMGR_PEER: [False, False, False, False] } for i, j in d.items(): for k, v in zip( [self.site, self.site2, self.site3, self.site4], j): if v: self.assertTrue(k.get_config(i)) else: self.assertFalse(k.get_config(i)) self.assertNotEqual(self.site.get_eid(), self.site2.get_eid()) self.assertNotEqual(self.site3.get_eid(), self.site4.get_eid()) for i, j in zip( [self.site, self.site2, self.site3, self.site4], [master_port, client_port, master_port, client_port]): addr = i.get_address() self.assertEqual(addr, ('127.0.0.1', j)) for i in [self.site, self.site2]: self.assertEqual( i.get_address(), self.dbenvMaster.repmgr_site_by_eid( i.get_eid()).get_address()) for i in [self.site3, self.site4]: self.assertEqual( i.get_address(), self.dbenvClient.repmgr_site_by_eid( i.get_eid()).get_address()) else: self.dbenvMaster.repmgr_set_local_site('127.0.0.1', master_port) self.dbenvClient.repmgr_set_local_site('127.0.0.1', client_port) self.dbenvMaster.repmgr_add_remote_site('127.0.0.1', client_port) self.dbenvClient.repmgr_add_remote_site('127.0.0.1', master_port) self.dbenvMaster.rep_set_nsites(2) self.dbenvClient.rep_set_nsites(2) self.dbenvMaster.rep_set_priority(10) self.dbenvClient.rep_set_priority(0) self.dbenvMaster.rep_set_timeout(db.DB_REP_CONNECTION_RETRY, 100123) self.dbenvClient.rep_set_timeout(db.DB_REP_CONNECTION_RETRY, 100321) self.assertEqual( self.dbenvMaster.rep_get_timeout(db.DB_REP_CONNECTION_RETRY), 100123) self.assertEqual( self.dbenvClient.rep_get_timeout(db.DB_REP_CONNECTION_RETRY), 100321) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100234) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100432) self.assertEqual( self.dbenvMaster.rep_get_timeout(db.DB_REP_ELECTION_TIMEOUT), 100234) self.assertEqual( self.dbenvClient.rep_get_timeout(db.DB_REP_ELECTION_TIMEOUT), 100432) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100345) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100543) self.assertEqual( self.dbenvMaster.rep_get_timeout(db.DB_REP_ELECTION_RETRY), 100345) self.assertEqual( self.dbenvClient.rep_get_timeout(db.DB_REP_ELECTION_RETRY), 100543) self.dbenvMaster.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvClient.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvMaster.repmgr_start(1, db.DB_REP_MASTER) self.dbenvClient.repmgr_start(1, db.DB_REP_CLIENT) self.assertEqual(self.dbenvMaster.rep_get_nsites(), 2) self.assertEqual(self.dbenvClient.rep_get_nsites(), 2) self.assertEqual(self.dbenvMaster.rep_get_priority(), 10) self.assertEqual(self.dbenvClient.rep_get_priority(), 0) self.assertEqual(self.dbenvMaster.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) self.assertEqual(self.dbenvClient.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) import time timeout = time.time() + 60 while time.time() < timeout and not (self.confirmed_master and self.client_startupdone): time.sleep(0.02) if time.time() > timeout: import sys print >> sys.stderr, 'XXX: timeout happened beforestartup was confirmed - see issue 3892' startup_timeout = True d = self.dbenvMaster.repmgr_site_list() self.assertEqual(len(d), 1) d = d.values()[0] self.assertEqual(d[0], '127.0.0.1') self.assertEqual(d[1], client_port) self.assertTrue(d[2] == db.DB_REPMGR_CONNECTED or d[2] == db.DB_REPMGR_DISCONNECTED) d = self.dbenvClient.repmgr_site_list() self.assertEqual(len(d), 1) d = d.values()[0] self.assertEqual(d[0], '127.0.0.1') self.assertEqual(d[1], master_port) self.assertTrue(d[2] == db.DB_REPMGR_CONNECTED or d[2] == db.DB_REPMGR_DISCONNECTED) if db.version() >= (4, 6): d = self.dbenvMaster.repmgr_stat(flags=db.DB_STAT_CLEAR) self.assertTrue('msgs_queued' in d) self.dbMaster = db.DB(self.dbenvMaster) txn = self.dbenvMaster.txn_begin() self.dbMaster.open('test', db.DB_HASH, db.DB_CREATE, 438, txn=txn) txn.commit() import time, os.path timeout = time.time() + 10 while time.time() < timeout and not os.path.exists( os.path.join(self.homeDirClient, 'test')): time.sleep(0.01) self.dbClient = db.DB(self.dbenvClient) while True: txn = self.dbenvClient.txn_begin() try: self.dbClient.open('test', db.DB_HASH, flags=db.DB_RDONLY, mode=438, txn=txn) except db.DBRepHandleDeadError: txn.abort() self.dbClient.close() self.dbClient = db.DB(self.dbenvClient) continue txn.commit() break txn = self.dbenvMaster.txn_begin() self.dbMaster.put('ABC', '123', txn=txn) txn.commit() import time timeout = time.time() + 10 v = None while time.time() < timeout and v is None: txn = self.dbenvClient.txn_begin() v = self.dbClient.get('ABC', txn=txn) txn.commit() if v is None: time.sleep(0.02) if time.time() >= timeout and startup_timeout: self.skipTest( 'replication test skipped due to random failure, see issue 3892' ) self.assertTrue(time.time() < timeout) self.assertEqual('123', v) txn = self.dbenvMaster.txn_begin() self.dbMaster.delete('ABC', txn=txn) txn.commit() timeout = time.time() + 10 while time.time() < timeout and v is not None: txn = self.dbenvClient.txn_begin() v = self.dbClient.get('ABC', txn=txn) txn.commit() if v is None: time.sleep(0.02) self.assertTrue(time.time() < timeout) self.assertEqual(None, v) return
def test01_basic_replication(self): master_port = test_support.find_unused_port() client_port = test_support.find_unused_port() if db.version() >= (5, 2): self.site = self.dbenvMaster.repmgr_site("127.0.0.1", master_port) self.site.set_config(db.DB_GROUP_CREATOR, True) self.site.set_config(db.DB_LOCAL_SITE, True) self.site2 = self.dbenvMaster.repmgr_site("127.0.0.1", client_port) self.site3 = self.dbenvClient.repmgr_site("127.0.0.1", master_port) self.site3.set_config(db.DB_BOOTSTRAP_HELPER, True) self.site4 = self.dbenvClient.repmgr_site("127.0.0.1", client_port) self.site4.set_config(db.DB_LOCAL_SITE, True) d = { db.DB_BOOTSTRAP_HELPER: [False, False, True, False], db.DB_GROUP_CREATOR: [True, False, False, False], db.DB_LEGACY: [False, False, False, False], db.DB_LOCAL_SITE: [True, False, False, True], db.DB_REPMGR_PEER: [False, False, False, False], } for i, j in d.items(): for k, v in zip([self.site, self.site2, self.site3, self.site4], j): if v: self.assertTrue(k.get_config(i)) else: self.assertFalse(k.get_config(i)) self.assertNotEqual(self.site.get_eid(), self.site2.get_eid()) self.assertNotEqual(self.site3.get_eid(), self.site4.get_eid()) for i, j in zip( [self.site, self.site2, self.site3, self.site4], [master_port, client_port, master_port, client_port] ): addr = i.get_address() self.assertEqual(addr, ("127.0.0.1", j)) for i in [self.site, self.site2]: self.assertEqual(i.get_address(), self.dbenvMaster.repmgr_site_by_eid(i.get_eid()).get_address()) for i in [self.site3, self.site4]: self.assertEqual(i.get_address(), self.dbenvClient.repmgr_site_by_eid(i.get_eid()).get_address()) else: self.dbenvMaster.repmgr_set_local_site("127.0.0.1", master_port) self.dbenvClient.repmgr_set_local_site("127.0.0.1", client_port) self.dbenvMaster.repmgr_add_remote_site("127.0.0.1", client_port) self.dbenvClient.repmgr_add_remote_site("127.0.0.1", master_port) self.dbenvMaster.rep_set_nsites(2) self.dbenvClient.rep_set_nsites(2) self.dbenvMaster.rep_set_priority(10) self.dbenvClient.rep_set_priority(0) self.dbenvMaster.rep_set_timeout(db.DB_REP_CONNECTION_RETRY, 100123) self.dbenvClient.rep_set_timeout(db.DB_REP_CONNECTION_RETRY, 100321) self.assertEqual(self.dbenvMaster.rep_get_timeout(db.DB_REP_CONNECTION_RETRY), 100123) self.assertEqual(self.dbenvClient.rep_get_timeout(db.DB_REP_CONNECTION_RETRY), 100321) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100234) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100432) self.assertEqual(self.dbenvMaster.rep_get_timeout(db.DB_REP_ELECTION_TIMEOUT), 100234) self.assertEqual(self.dbenvClient.rep_get_timeout(db.DB_REP_ELECTION_TIMEOUT), 100432) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100345) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100543) self.assertEqual(self.dbenvMaster.rep_get_timeout(db.DB_REP_ELECTION_RETRY), 100345) self.assertEqual(self.dbenvClient.rep_get_timeout(db.DB_REP_ELECTION_RETRY), 100543) self.dbenvMaster.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvClient.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvMaster.repmgr_start(1, db.DB_REP_MASTER) self.dbenvClient.repmgr_start(1, db.DB_REP_CLIENT) self.assertEqual(self.dbenvMaster.rep_get_nsites(), 2) self.assertEqual(self.dbenvClient.rep_get_nsites(), 2) self.assertEqual(self.dbenvMaster.rep_get_priority(), 10) self.assertEqual(self.dbenvClient.rep_get_priority(), 0) self.assertEqual(self.dbenvMaster.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) self.assertEqual(self.dbenvClient.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) # The timeout is necessary in BDB 4.5, since DB_EVENT_REP_STARTUPDONE # is not generated if the master has no new transactions. # This is solved in BDB 4.6 (#15542). import time timeout = time.time() + 10 while (time.time() < timeout) and not (self.confirmed_master and self.client_startupdone): time.sleep(0.02) self.assertTrue(time.time() < timeout) d = self.dbenvMaster.repmgr_site_list() self.assertEqual(len(d), 1) d = d.values()[0] # There is only one self.assertEqual(d[0], "127.0.0.1") self.assertEqual(d[1], client_port) self.assertTrue((d[2] == db.DB_REPMGR_CONNECTED) or (d[2] == db.DB_REPMGR_DISCONNECTED)) d = self.dbenvClient.repmgr_site_list() self.assertEqual(len(d), 1) d = d.values()[0] # There is only one self.assertEqual(d[0], "127.0.0.1") self.assertEqual(d[1], master_port) self.assertTrue((d[2] == db.DB_REPMGR_CONNECTED) or (d[2] == db.DB_REPMGR_DISCONNECTED)) if db.version() >= (4, 6): d = self.dbenvMaster.repmgr_stat(flags=db.DB_STAT_CLEAR) self.assertTrue("msgs_queued" in d) self.dbMaster = db.DB(self.dbenvMaster) txn = self.dbenvMaster.txn_begin() self.dbMaster.open("test", db.DB_HASH, db.DB_CREATE, 0666, txn=txn) txn.commit() import time, os.path timeout = time.time() + 10 while (time.time() < timeout) and not (os.path.exists(os.path.join(self.homeDirClient, "test"))): time.sleep(0.01) self.dbClient = db.DB(self.dbenvClient) while True: txn = self.dbenvClient.txn_begin() try: self.dbClient.open("test", db.DB_HASH, flags=db.DB_RDONLY, mode=0666, txn=txn) except db.DBRepHandleDeadError: txn.abort() self.dbClient.close() self.dbClient = db.DB(self.dbenvClient) continue txn.commit() break txn = self.dbenvMaster.txn_begin() self.dbMaster.put("ABC", "123", txn=txn) txn.commit() import time timeout = time.time() + 10 v = None while (time.time() < timeout) and (v is None): txn = self.dbenvClient.txn_begin() v = self.dbClient.get("ABC", txn=txn) txn.commit() if v is None: time.sleep(0.02) self.assertTrue(time.time() < timeout) self.assertEqual("123", v) txn = self.dbenvMaster.txn_begin() self.dbMaster.delete("ABC", txn=txn) txn.commit() timeout = time.time() + 10 while (time.time() < timeout) and (v is not None): txn = self.dbenvClient.txn_begin() v = self.dbClient.get("ABC", txn=txn) txn.commit() if v is None: time.sleep(0.02) self.assertTrue(time.time() < timeout) self.assertEqual(None, v)
def test01_basic_replication(self): master_port = test_support.find_unused_port() client_port = test_support.find_unused_port() if db.version() >= (5, 2): self.site = self.dbenvMaster.repmgr_site("127.0.0.1", master_port) self.site.set_config(db.DB_GROUP_CREATOR, True) self.site.set_config(db.DB_LOCAL_SITE, True) self.site2 = self.dbenvMaster.repmgr_site("127.0.0.1", client_port) self.site3 = self.dbenvClient.repmgr_site("127.0.0.1", master_port) self.site3.set_config(db.DB_BOOTSTRAP_HELPER, True) self.site4 = self.dbenvClient.repmgr_site("127.0.0.1", client_port) self.site4.set_config(db.DB_LOCAL_SITE, True) d = { db.DB_BOOTSTRAP_HELPER: [False, False, True, False], db.DB_GROUP_CREATOR: [True, False, False, False], db.DB_LEGACY: [False, False, False, False], db.DB_LOCAL_SITE: [True, False, False, True], db.DB_REPMGR_PEER: [False, False, False, False], } for i, j in d.items(): for k, v in \ zip([self.site, self.site2, self.site3, self.site4], j) : if v: self.assertTrue(k.get_config(i)) else: self.assertFalse(k.get_config(i)) self.assertNotEqual(self.site.get_eid(), self.site2.get_eid()) self.assertNotEqual(self.site3.get_eid(), self.site4.get_eid()) for i, j in zip([self.site, self.site2, self.site3, self.site4], \ [master_port, client_port, master_port, client_port]) : addr = i.get_address() self.assertEqual(addr, ("127.0.0.1", j)) for i in [self.site, self.site2]: self.assertEqual( i.get_address(), self.dbenvMaster.repmgr_site_by_eid( i.get_eid()).get_address()) for i in [self.site3, self.site4]: self.assertEqual( i.get_address(), self.dbenvClient.repmgr_site_by_eid( i.get_eid()).get_address()) else: self.dbenvMaster.repmgr_set_local_site("127.0.0.1", master_port) self.dbenvClient.repmgr_set_local_site("127.0.0.1", client_port) self.dbenvMaster.repmgr_add_remote_site("127.0.0.1", client_port) self.dbenvClient.repmgr_add_remote_site("127.0.0.1", master_port) self.dbenvMaster.rep_set_nsites(2) self.dbenvClient.rep_set_nsites(2) self.dbenvMaster.rep_set_priority(10) self.dbenvClient.rep_set_priority(0) self.dbenvMaster.rep_set_timeout(db.DB_REP_CONNECTION_RETRY, 100123) self.dbenvClient.rep_set_timeout(db.DB_REP_CONNECTION_RETRY, 100321) self.assertEqual( self.dbenvMaster.rep_get_timeout(db.DB_REP_CONNECTION_RETRY), 100123) self.assertEqual( self.dbenvClient.rep_get_timeout(db.DB_REP_CONNECTION_RETRY), 100321) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100234) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100432) self.assertEqual( self.dbenvMaster.rep_get_timeout(db.DB_REP_ELECTION_TIMEOUT), 100234) self.assertEqual( self.dbenvClient.rep_get_timeout(db.DB_REP_ELECTION_TIMEOUT), 100432) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100345) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100543) self.assertEqual( self.dbenvMaster.rep_get_timeout(db.DB_REP_ELECTION_RETRY), 100345) self.assertEqual( self.dbenvClient.rep_get_timeout(db.DB_REP_ELECTION_RETRY), 100543) self.dbenvMaster.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvClient.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvMaster.repmgr_start(1, db.DB_REP_MASTER) self.dbenvClient.repmgr_start(1, db.DB_REP_CLIENT) self.assertEqual(self.dbenvMaster.rep_get_nsites(), 2) self.assertEqual(self.dbenvClient.rep_get_nsites(), 2) self.assertEqual(self.dbenvMaster.rep_get_priority(), 10) self.assertEqual(self.dbenvClient.rep_get_priority(), 0) self.assertEqual(self.dbenvMaster.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) self.assertEqual(self.dbenvClient.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) # The timeout is necessary in BDB 4.5, since DB_EVENT_REP_STARTUPDONE # is not generated if the master has no new transactions. # This is solved in BDB 4.6 (#15542). import time timeout = time.time() + 10 while (time.time() < timeout) and not (self.confirmed_master and self.client_startupdone): time.sleep(0.02) self.assertTrue(time.time() < timeout) d = self.dbenvMaster.repmgr_site_list() self.assertEqual(len(d), 1) d = d.values()[0] # There is only one self.assertEqual(d[0], "127.0.0.1") self.assertEqual(d[1], client_port) self.assertTrue((d[2]==db.DB_REPMGR_CONNECTED) or \ (d[2]==db.DB_REPMGR_DISCONNECTED)) d = self.dbenvClient.repmgr_site_list() self.assertEqual(len(d), 1) d = d.values()[0] # There is only one self.assertEqual(d[0], "127.0.0.1") self.assertEqual(d[1], master_port) self.assertTrue((d[2]==db.DB_REPMGR_CONNECTED) or \ (d[2]==db.DB_REPMGR_DISCONNECTED)) d = self.dbenvMaster.repmgr_stat(flags=db.DB_STAT_CLEAR) self.assertTrue("msgs_queued" in d) self.dbMaster = db.DB(self.dbenvMaster) txn = self.dbenvMaster.txn_begin() self.dbMaster.open("test", db.DB_HASH, db.DB_CREATE, 0666, txn=txn) txn.commit() import time, os.path timeout = time.time() + 10 while (time.time()<timeout) and \ not (os.path.exists(os.path.join(self.homeDirClient,"test"))) : time.sleep(0.01) self.dbClient = db.DB(self.dbenvClient) while True: txn = self.dbenvClient.txn_begin() try: self.dbClient.open("test", db.DB_HASH, flags=db.DB_RDONLY, mode=0666, txn=txn) except db.DBRepHandleDeadError: txn.abort() self.dbClient.close() self.dbClient = db.DB(self.dbenvClient) continue txn.commit() break txn = self.dbenvMaster.txn_begin() self.dbMaster.put("ABC", "123", txn=txn) txn.commit() import time timeout = time.time() + 10 v = None while (time.time() < timeout) and (v is None): txn = self.dbenvClient.txn_begin() v = self.dbClient.get("ABC", txn=txn) txn.commit() if v is None: time.sleep(0.02) self.assertTrue(time.time() < timeout) self.assertEqual("123", v) txn = self.dbenvMaster.txn_begin() self.dbMaster.delete("ABC", txn=txn) txn.commit() timeout = time.time() + 10 while (time.time() < timeout) and (v is not None): txn = self.dbenvClient.txn_begin() v = self.dbClient.get("ABC", txn=txn) txn.commit() if v is None: time.sleep(0.02) self.assertTrue(time.time() < timeout) self.assertEqual(None, v)
def test01_basic_replication(self) : master_port = test_support.find_unused_port() self.dbenvMaster.repmgr_set_local_site("127.0.0.1", master_port) client_port = test_support.find_unused_port() self.dbenvClient.repmgr_set_local_site("127.0.0.1", client_port) self.dbenvMaster.repmgr_add_remote_site("127.0.0.1", client_port) self.dbenvClient.repmgr_add_remote_site("127.0.0.1", master_port) self.dbenvMaster.rep_set_nsites(2) self.dbenvClient.rep_set_nsites(2) self.dbenvMaster.rep_set_priority(10) self.dbenvClient.rep_set_priority(0) self.dbenvMaster.rep_set_timeout(db.DB_REP_CONNECTION_RETRY,100123) self.dbenvClient.rep_set_timeout(db.DB_REP_CONNECTION_RETRY,100321) self.assertEquals(self.dbenvMaster.rep_get_timeout( db.DB_REP_CONNECTION_RETRY), 100123) self.assertEquals(self.dbenvClient.rep_get_timeout( db.DB_REP_CONNECTION_RETRY), 100321) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100234) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100432) self.assertEquals(self.dbenvMaster.rep_get_timeout( db.DB_REP_ELECTION_TIMEOUT), 100234) self.assertEquals(self.dbenvClient.rep_get_timeout( db.DB_REP_ELECTION_TIMEOUT), 100432) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100345) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100543) self.assertEquals(self.dbenvMaster.rep_get_timeout( db.DB_REP_ELECTION_RETRY), 100345) self.assertEquals(self.dbenvClient.rep_get_timeout( db.DB_REP_ELECTION_RETRY), 100543) self.dbenvMaster.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvClient.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvMaster.repmgr_start(1, db.DB_REP_MASTER); self.dbenvClient.repmgr_start(1, db.DB_REP_CLIENT); self.assertEquals(self.dbenvMaster.rep_get_nsites(),2) self.assertEquals(self.dbenvClient.rep_get_nsites(),2) self.assertEquals(self.dbenvMaster.rep_get_priority(),10) self.assertEquals(self.dbenvClient.rep_get_priority(),0) self.assertEquals(self.dbenvMaster.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) self.assertEquals(self.dbenvClient.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) # The timeout is necessary in BDB 4.5, since DB_EVENT_REP_STARTUPDONE # is not generated if the master has no new transactions. # This is solved in BDB 4.6 (#15542). import time timeout = time.time()+10 while (time.time()<timeout) and not (self.confirmed_master and self.client_startupdone) : time.sleep(0.02) self.assertTrue(time.time()<timeout) d = self.dbenvMaster.repmgr_site_list() self.assertEquals(len(d), 1) self.assertEquals(d[0][0], "127.0.0.1") self.assertEquals(d[0][1], client_port) self.assertTrue((d[0][2]==db.DB_REPMGR_CONNECTED) or \ (d[0][2]==db.DB_REPMGR_DISCONNECTED)) d = self.dbenvClient.repmgr_site_list() self.assertEquals(len(d), 1) self.assertEquals(d[0][0], "127.0.0.1") self.assertEquals(d[0][1], master_port) self.assertTrue((d[0][2]==db.DB_REPMGR_CONNECTED) or \ (d[0][2]==db.DB_REPMGR_DISCONNECTED)) if db.version() >= (4,6) : d = self.dbenvMaster.repmgr_stat(flags=db.DB_STAT_CLEAR); self.assertTrue("msgs_queued" in d) self.dbMaster=db.DB(self.dbenvMaster) txn=self.dbenvMaster.txn_begin() self.dbMaster.open("test", db.DB_HASH, db.DB_CREATE, 0666, txn=txn) txn.commit() import time,os.path timeout=time.time()+10 while (time.time()<timeout) and \ not (os.path.exists(os.path.join(self.homeDirClient,"test"))) : time.sleep(0.01) self.dbClient=db.DB(self.dbenvClient) while True : txn=self.dbenvClient.txn_begin() try : self.dbClient.open("test", db.DB_HASH, flags=db.DB_RDONLY, mode=0666, txn=txn) except db.DBRepHandleDeadError : txn.abort() self.dbClient.close() self.dbClient=db.DB(self.dbenvClient) continue txn.commit() break txn=self.dbenvMaster.txn_begin() self.dbMaster.put("ABC", "123", txn=txn) txn.commit() import time timeout=time.time()+10 v=None while (time.time()<timeout) and (v==None) : txn=self.dbenvClient.txn_begin() v=self.dbClient.get("ABC", txn=txn) txn.commit() if v==None : time.sleep(0.02) self.assertTrue(time.time()<timeout) self.assertEquals("123", v) txn=self.dbenvMaster.txn_begin() self.dbMaster.delete("ABC", txn=txn) txn.commit() timeout=time.time()+10 while (time.time()<timeout) and (v!=None) : txn=self.dbenvClient.txn_begin() v=self.dbClient.get("ABC", txn=txn) txn.commit() if v==None : time.sleep(0.02) self.assertTrue(time.time()<timeout) self.assertEquals(None, v)
def test01_basic_replication(self): master_port = test_support.find_unused_port() self.dbenvMaster.repmgr_set_local_site("127.0.0.1", master_port) client_port = test_support.find_unused_port() self.dbenvClient.repmgr_set_local_site("127.0.0.1", client_port) self.dbenvMaster.repmgr_add_remote_site("127.0.0.1", client_port) self.dbenvClient.repmgr_add_remote_site("127.0.0.1", master_port) self.dbenvMaster.rep_set_nsites(2) self.dbenvClient.rep_set_nsites(2) self.dbenvMaster.rep_set_priority(10) self.dbenvClient.rep_set_priority(0) self.dbenvMaster.rep_set_timeout(db.DB_REP_CONNECTION_RETRY, 100123) self.dbenvClient.rep_set_timeout(db.DB_REP_CONNECTION_RETRY, 100321) self.assertEquals( self.dbenvMaster.rep_get_timeout(db.DB_REP_CONNECTION_RETRY), 100123) self.assertEquals( self.dbenvClient.rep_get_timeout(db.DB_REP_CONNECTION_RETRY), 100321) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100234) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_TIMEOUT, 100432) self.assertEquals( self.dbenvMaster.rep_get_timeout(db.DB_REP_ELECTION_TIMEOUT), 100234) self.assertEquals( self.dbenvClient.rep_get_timeout(db.DB_REP_ELECTION_TIMEOUT), 100432) self.dbenvMaster.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100345) self.dbenvClient.rep_set_timeout(db.DB_REP_ELECTION_RETRY, 100543) self.assertEquals( self.dbenvMaster.rep_get_timeout(db.DB_REP_ELECTION_RETRY), 100345) self.assertEquals( self.dbenvClient.rep_get_timeout(db.DB_REP_ELECTION_RETRY), 100543) self.dbenvMaster.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvClient.repmgr_set_ack_policy(db.DB_REPMGR_ACKS_ALL) self.dbenvMaster.repmgr_start(1, db.DB_REP_MASTER) self.dbenvClient.repmgr_start(1, db.DB_REP_CLIENT) self.assertEquals(self.dbenvMaster.rep_get_nsites(), 2) self.assertEquals(self.dbenvClient.rep_get_nsites(), 2) self.assertEquals(self.dbenvMaster.rep_get_priority(), 10) self.assertEquals(self.dbenvClient.rep_get_priority(), 0) self.assertEquals(self.dbenvMaster.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) self.assertEquals(self.dbenvClient.repmgr_get_ack_policy(), db.DB_REPMGR_ACKS_ALL) # The timeout is necessary in BDB 4.5, since DB_EVENT_REP_STARTUPDONE # is not generated if the master has no new transactions. # This is solved in BDB 4.6 (#15542). import time timeout = time.time() + 60 while (time.time() < timeout) and not (self.confirmed_master and self.client_startupdone): time.sleep(0.02) # this fails on Windows as self.client_startupdone never gets set # to True - see bug 3892. BUT - even though this assertion # fails on Windows the rest of the test passes - so to prove # that we let the rest of the test run. Sadly we can't # make use of raising TestSkipped() here (unittest still # reports it as an error), so we yell to stderr. import sys if sys.platform == "win32": print >> sys.stderr, \ "XXX - windows bsddb replication fails on windows and is skipped" print >> sys.stderr, "XXX - Please see issue #3892" # It also fails irregularly on other platforms, and again the # rest of the tests pass. Since bsddb support is unmaintained, and # is gone in py3k, we just emit a warning instead of a test failure # so as to improve buildbot stability. elif time.time() > timeout: print >> sys.stderr, \ "XXX - timeout before startup confirmed, see issue #3892." d = self.dbenvMaster.repmgr_site_list() self.assertEquals(len(d), 1) self.assertEquals(d[0][0], "127.0.0.1") self.assertEquals(d[0][1], client_port) self.assertTrue((d[0][2]==db.DB_REPMGR_CONNECTED) or \ (d[0][2]==db.DB_REPMGR_DISCONNECTED)) d = self.dbenvClient.repmgr_site_list() self.assertEquals(len(d), 1) self.assertEquals(d[0][0], "127.0.0.1") self.assertEquals(d[0][1], master_port) self.assertTrue((d[0][2]==db.DB_REPMGR_CONNECTED) or \ (d[0][2]==db.DB_REPMGR_DISCONNECTED)) if db.version() >= (4, 6): d = self.dbenvMaster.repmgr_stat(flags=db.DB_STAT_CLEAR) self.assertTrue("msgs_queued" in d) self.dbMaster = db.DB(self.dbenvMaster) txn = self.dbenvMaster.txn_begin() self.dbMaster.open("test", db.DB_HASH, db.DB_CREATE, 0666, txn=txn) txn.commit() import time, os.path timeout = time.time() + 10 while (time.time()<timeout) and \ not (os.path.exists(os.path.join(self.homeDirClient,"test"))) : time.sleep(0.01) self.dbClient = db.DB(self.dbenvClient) while True: txn = self.dbenvClient.txn_begin() try: self.dbClient.open("test", db.DB_HASH, flags=db.DB_RDONLY, mode=0666, txn=txn) except db.DBRepHandleDeadError: txn.abort() self.dbClient.close() self.dbClient = db.DB(self.dbenvClient) continue txn.commit() break txn = self.dbenvMaster.txn_begin() self.dbMaster.put("ABC", "123", txn=txn) txn.commit() import time timeout = time.time() + 10 v = None while (time.time() < timeout) and (v == None): txn = self.dbenvClient.txn_begin() v = self.dbClient.get("ABC", txn=txn) txn.commit() if v == None: time.sleep(0.02) self.assertTrue(time.time() < timeout) self.assertEquals("123", v) txn = self.dbenvMaster.txn_begin() self.dbMaster.delete("ABC", txn=txn) txn.commit() timeout = time.time() + 10 while (time.time() < timeout) and (v != None): txn = self.dbenvClient.txn_begin() v = self.dbClient.get("ABC", txn=txn) txn.commit() if v == None: time.sleep(0.02) self.assertTrue(time.time() < timeout) self.assertEquals(None, v)