summaryrefslogtreecommitdiff
path: root/src/rep/rep_util.c
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2015-02-17 17:25:57 +0000
committer <>2015-03-17 16:26:24 +0000
commit780b92ada9afcf1d58085a83a0b9e6bc982203d1 (patch)
tree598f8b9fa431b228d29897e798de4ac0c1d3d970 /src/rep/rep_util.c
parent7a2660ba9cc2dc03a69ddfcfd95369395cc87444 (diff)
downloadberkeleydb-master.tar.gz
Imported from /home/lorry/working-area/delta_berkeleydb/db-6.1.23.tar.gz.HEADdb-6.1.23master
Diffstat (limited to 'src/rep/rep_util.c')
-rw-r--r--src/rep/rep_util.c568
1 files changed, 434 insertions, 134 deletions
diff --git a/src/rep/rep_util.c b/src/rep/rep_util.c
index 0dfe6122..5ee2592f 100644
--- a/src/rep/rep_util.c
+++ b/src/rep/rep_util.c
@@ -1,7 +1,7 @@
/*-
* See the file LICENSE for redistribution information.
*
- * Copyright (c) 2001, 2012 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2015 Oracle and/or its affiliates. All rights reserved.
*
* $Id$
*/
@@ -11,6 +11,7 @@
#include "db_int.h"
#include "dbinc/db_page.h"
#include "dbinc/db_am.h"
+#include "dbinc/fop.h"
#include "dbinc/mp.h"
#include "dbinc/txn.h"
@@ -437,7 +438,7 @@ __rep_send_message(env, eid, rtype, lsnp, dbt, ctlflags, repflags)
FLD_ISSET(ctlflags, REPCTL_LEASE | REPCTL_PERM)) {
F_SET(&cntrl, REPCTL_LEASE);
DB_ASSERT(env, rep->version == DB_REPVERSION);
- __os_gettime(env, &msg_time, 1);
+ __os_gettime(env, &msg_time, 0);
cntrl.msg_sec = (u_int32_t)msg_time.tv_sec;
cntrl.msg_nsec = (u_int32_t)msg_time.tv_nsec;
}
@@ -591,6 +592,15 @@ __rep_new_master(env, cntrl, eid)
ret = 0;
logc = NULL;
lockout_msg = 0;
+
+ /*
+ * If REP_F_HOLD_GEN is set, we want to keep this site at its
+ * current gen. Do not process an incoming NEWMASTER, which
+ * would change the gen.
+ */
+ if (F_ISSET(rep, REP_F_HOLD_GEN))
+ return (ret);
+
REP_SYSTEM_LOCK(env);
change = rep->gen != cntrl->gen || rep->master_id != eid;
/*
@@ -1128,6 +1138,8 @@ __env_db_rep_exit(env)
rep = db_rep->region;
REP_SYSTEM_LOCK(env);
+ /* If we have a reference, it better not already be 0. */
+ DB_ASSERT(env, rep->handle_cnt != 0);
rep->handle_cnt--;
REP_SYSTEM_UNLOCK(env);
@@ -1190,7 +1202,7 @@ __db_rep_enter(dbp, checkgen, checklock, return_now)
* get an exclusive lock on this database.
*/
if (checkgen && dbp->mpf->mfp && IS_REP_CLIENT(env)) {
- if (dbp->mpf->mfp->excl_lockout)
+ if (dbp->mpf->mfp->excl_lockout)
return (DB_REP_HANDLE_DEAD);
}
@@ -1328,7 +1340,8 @@ __op_rep_exit(env)
rep = db_rep->region;
REP_SYSTEM_LOCK(env);
- DB_ASSERT(env, rep->op_cnt > 0);
+ /* If we have a reference, it better not already be 0. */
+ DB_ASSERT(env, rep->op_cnt != 0);
rep->op_cnt--;
REP_SYSTEM_UNLOCK(env);
@@ -1697,7 +1710,9 @@ __rep_msg_to_old(version, rectype)
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
- REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID },
+ REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
+ REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
+ REP_INVALID },
/*
* 4.2/DB_REPVERSION 1 no longer supported.
*/
@@ -1708,7 +1723,9 @@ __rep_msg_to_old(version, rectype)
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
- REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID },
+ REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
+ REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
+ REP_INVALID },
/*
* 4.3/DB_REPVERSION 2 no longer supported.
*/
@@ -1719,7 +1736,9 @@ __rep_msg_to_old(version, rectype)
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
- REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID },
+ REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
+ REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
+ REP_INVALID },
/*
* From 4.7 message number To 4.4/4.5 message number
*/
@@ -1727,6 +1746,11 @@ __rep_msg_to_old(version, rectype)
1, /* REP_ALIVE */
2, /* REP_ALIVE_REQ */
3, /* REP_ALL_REQ */
+ REP_INVALID, /* REP_BLOB_ALL_REQ */
+ REP_INVALID, /* REP_BLOB_CHUNK */
+ REP_INVALID, /* REP_BLOB_CHUNK_REQ */
+ REP_INVALID, /* REP_BLOB_UPDATE */
+ REP_INVALID, /* REP_BLOB_UPDATE_REQ */
4, /* REP_BULK_LOG */
5, /* REP_BULK_PAGE */
6, /* REP_DUPMASTER */
@@ -1765,6 +1789,11 @@ __rep_msg_to_old(version, rectype)
1, /* REP_ALIVE */
2, /* REP_ALIVE_REQ */
3, /* REP_ALL_REQ */
+ REP_INVALID, /* REP_BLOB_ALL_REQ */
+ REP_INVALID, /* REP_BLOB_CHUNK */
+ REP_INVALID, /* REP_BLOB_CHUNK_REQ */
+ REP_INVALID, /* REP_BLOB_UPDATE */
+ REP_INVALID, /* REP_BLOB_UPDATE_REQ */
4, /* REP_BULK_LOG */
5, /* REP_BULK_PAGE */
6, /* REP_DUPMASTER */
@@ -1803,6 +1832,11 @@ __rep_msg_to_old(version, rectype)
1, /* REP_ALIVE */
2, /* REP_ALIVE_REQ */
3, /* REP_ALL_REQ */
+ REP_INVALID, /* REP_BLOB_ALL_REQ */
+ REP_INVALID, /* REP_BLOB_CHUNK */
+ REP_INVALID, /* REP_BLOB_CHUNK_REQ */
+ REP_INVALID, /* REP_BLOB_UPDATE */
+ REP_INVALID, /* REP_BLOB_UPDATE_REQ */
4, /* REP_BULK_LOG */
5, /* REP_BULK_PAGE */
6, /* REP_DUPMASTER */
@@ -1841,6 +1875,53 @@ __rep_msg_to_old(version, rectype)
1, /* REP_ALIVE */
2, /* REP_ALIVE_REQ */
3, /* REP_ALL_REQ */
+ REP_INVALID, /* REP_BLOB_ALL_REQ */
+ REP_INVALID, /* REP_BLOB_CHUNK */
+ REP_INVALID, /* REP_BLOB_CHUNK_REQ */
+ REP_INVALID, /* REP_BLOB_UPDATE */
+ REP_INVALID, /* REP_BLOB_UPDATE_REQ */
+ 4, /* REP_BULK_LOG */
+ 5, /* REP_BULK_PAGE */
+ 6, /* REP_DUPMASTER */
+ 7, /* REP_FILE */
+ 8, /* REP_FILE_FAIL */
+ 9, /* REP_FILE_REQ */
+ 10, /* REP_LEASE_GRANT */
+ 11, /* REP_LOG */
+ 12, /* REP_LOG_MORE */
+ 13, /* REP_LOG_REQ */
+ 14, /* REP_MASTER_REQ */
+ 15, /* REP_NEWCLIENT */
+ 16, /* REP_NEWFILE */
+ 17, /* REP_NEWMASTER */
+ 18, /* REP_NEWSITE */
+ 19, /* REP_PAGE */
+ 20, /* REP_PAGE_FAIL */
+ 21, /* REP_PAGE_MORE */
+ 22, /* REP_PAGE_REQ */
+ 23, /* REP_REREQUEST */
+ 24, /* REP_START_SYNC */
+ 25, /* REP_UPDATE */
+ 26, /* REP_UPDATE_REQ */
+ 27, /* REP_VERIFY */
+ 28, /* REP_VERIFY_FAIL */
+ 29, /* REP_VERIFY_REQ */
+ 30, /* REP_VOTE1 */
+ 31 /* REP_VOTE2 */
+ },
+ /*
+ * From 6.1 message number To 5.3 message number. Messages
+ * handling BLOBs were added.
+ */
+ { REP_INVALID, /* NO message 0 */
+ 1, /* REP_ALIVE */
+ 2, /* REP_ALIVE_REQ */
+ 3, /* REP_ALL_REQ */
+ REP_INVALID, /* REP_BLOB_ALL_REQ */
+ REP_INVALID, /* REP_BLOB_CHUNK */
+ REP_INVALID, /* REP_BLOB_CHUNK_REQ */
+ REP_INVALID, /* REP_BLOB_UPDATE */
+ REP_INVALID, /* REP_BLOB_UPDATE_REQ */
4, /* REP_BULK_LOG */
5, /* REP_BULK_PAGE */
6, /* REP_DUPMASTER */
@@ -1901,7 +1982,9 @@ __rep_msg_from_old(version, rectype)
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
- REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID },
+ REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
+ REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
+ REP_INVALID },
/*
* 4.2/DB_REPVERSION 1 no longer supported.
*/
@@ -1912,7 +1995,9 @@ __rep_msg_from_old(version, rectype)
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
- REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID },
+ REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
+ REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
+ REP_INVALID },
/*
* 4.3/DB_REPVERSION 2 no longer supported.
*/
@@ -1923,7 +2008,9 @@ __rep_msg_from_old(version, rectype)
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
- REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID },
+ REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
+ REP_INVALID, REP_INVALID, REP_INVALID, REP_INVALID,
+ REP_INVALID },
/*
* From 4.4/4.5 message number To 4.7 message number
*/
@@ -1931,36 +2018,41 @@ __rep_msg_from_old(version, rectype)
1, /* 1, REP_ALIVE */
2, /* 2, REP_ALIVE_REQ */
3, /* 3, REP_ALL_REQ */
- 4, /* 4, REP_BULK_LOG */
- 5, /* 5, REP_BULK_PAGE */
- 6, /* 6, REP_DUPMASTER */
- 7, /* 7, REP_FILE */
- 8, /* 8, REP_FILE_FAIL */
- 9, /* 9, REP_FILE_REQ */
- /* 10, REP_LEASE_GRANT doesn't exist */
- 11, /* 10, REP_LOG */
- 12, /* 11, REP_LOG_MORE */
- 13, /* 12, REP_LOG_REQ */
- 14, /* 13, REP_MASTER_REQ */
- 15, /* 14, REP_NEWCLIENT */
- 16, /* 15, REP_NEWFILE */
- 17, /* 16, REP_NEWMASTER */
- 18, /* 17, REP_NEWSITE */
- 19, /* 18, REP_PAGE */
- 20, /* 19, REP_PAGE_FAIL */
- 21, /* 20, REP_PAGE_MORE */
- 22, /* 21, REP_PAGE_REQ */
- 23, /* 22, REP_REREQUEST */
- /* 24, REP_START_SYNC doesn't exist */
- 25, /* 23, REP_UPDATE */
- 26, /* 24, REP_UPDATE_REQ */
- 27, /* 25, REP_VERIFY */
- 28, /* 26, REP_VERIFY_FAIL */
- 29, /* 27, REP_VERIFY_REQ */
- 30, /* 28, REP_VOTE1 */
- 31, /* 29, REP_VOTE2 */
+ 9, /* 4, REP_BULK_LOG */
+ 10, /* 5, REP_BULK_PAGE */
+ 11, /* 6, REP_DUPMASTER */
+ 12, /* 7, REP_FILE */
+ 13, /* 8, REP_FILE_FAIL */
+ 14, /* 9, REP_FILE_REQ */
+ /* 15, REP_LEASE_GRANT doesn't exist */
+ 16, /* 10, REP_LOG */
+ 17, /* 11, REP_LOG_MORE */
+ 18, /* 12, REP_LOG_REQ */
+ 19, /* 13, REP_MASTER_REQ */
+ 20, /* 14, REP_NEWCLIENT */
+ 21, /* 15, REP_NEWFILE */
+ 22, /* 16, REP_NEWMASTER */
+ 23, /* 17, REP_NEWSITE */
+ 24, /* 18, REP_PAGE */
+ 25, /* 19, REP_PAGE_FAIL */
+ 26, /* 20, REP_PAGE_MORE */
+ 27, /* 21, REP_PAGE_REQ */
+ 28, /* 22, REP_REREQUEST */
+ /* 29, REP_START_SYNC doesn't exist */
+ 30, /* 23, REP_UPDATE */
+ 31, /* 24, REP_UPDATE_REQ */
+ 32, /* 25, REP_VERIFY */
+ 33, /* 26, REP_VERIFY_FAIL */
+ 34, /* 27, REP_VERIFY_REQ */
+ 35, /* 28, REP_VOTE1 */
+ 36, /* 29, REP_VOTE2 */
REP_INVALID, /* 30, 4.4/4.5 no message */
- REP_INVALID /* 31, 4.4/4.5 no message */
+ REP_INVALID, /* 31, 4.4/4.5 no message */
+ REP_INVALID, /* 32, 4.4/4.5 no message */
+ REP_INVALID, /* 33, 4.4/4.5 no message */
+ REP_INVALID, /* 34, 4.4/4.5 no message */
+ REP_INVALID, /* 35, 4.4/4.5 no message */
+ REP_INVALID /* 36, 4.4/4.5 no message */
},
/*
* From 4.6 message number To 4.7 message number. There are
@@ -1971,34 +2063,39 @@ __rep_msg_from_old(version, rectype)
1, /* 1, REP_ALIVE */
2, /* 2, REP_ALIVE_REQ */
3, /* 3, REP_ALL_REQ */
- 4, /* 4, REP_BULK_LOG */
- 5, /* 5, REP_BULK_PAGE */
- 6, /* 6, REP_DUPMASTER */
- 7, /* 7, REP_FILE */
- 8, /* 8, REP_FILE_FAIL */
- 9, /* 9, REP_FILE_REQ */
- 10, /* 10, REP_LEASE_GRANT */
- 11, /* 11, REP_LOG */
- 12, /* 12, REP_LOG_MORE */
- 13, /* 13, REP_LOG_REQ */
- 14, /* 14, REP_MASTER_REQ */
- 15, /* 15, REP_NEWCLIENT */
- 16, /* 16, REP_NEWFILE */
- 17, /* 17, REP_NEWMASTER */
- 18, /* 18, REP_NEWSITE */
- 19, /* 19, REP_PAGE */
- 20, /* 20, REP_PAGE_FAIL */
- 21, /* 21, REP_PAGE_MORE */
- 22, /* 22, REP_PAGE_REQ */
- 23, /* 22, REP_REREQUEST */
- 24, /* 24, REP_START_SYNC */
- 25, /* 25, REP_UPDATE */
- 26, /* 26, REP_UPDATE_REQ */
- 27, /* 27, REP_VERIFY */
- 28, /* 28, REP_VERIFY_FAIL */
- 29, /* 29, REP_VERIFY_REQ */
- 30, /* 30, REP_VOTE1 */
- 31 /* 31, REP_VOTE2 */
+ 9, /* 4, REP_BULK_LOG */
+ 10, /* 5, REP_BULK_PAGE */
+ 11, /* 6, REP_DUPMASTER */
+ 12, /* 7, REP_FILE */
+ 13, /* 8, REP_FILE_FAIL */
+ 14, /* 9, REP_FILE_REQ */
+ 15, /* 10, REP_LEASE_GRANT */
+ 16, /* 11, REP_LOG */
+ 17, /* 12, REP_LOG_MORE */
+ 18, /* 13, REP_LOG_REQ */
+ 19, /* 14, REP_MASTER_REQ */
+ 20, /* 15, REP_NEWCLIENT */
+ 21, /* 16, REP_NEWFILE */
+ 22, /* 17, REP_NEWMASTER */
+ 23, /* 18, REP_NEWSITE */
+ 24, /* 19, REP_PAGE */
+ 25, /* 20, REP_PAGE_FAIL */
+ 26, /* 21, REP_PAGE_MORE */
+ 27, /* 22, REP_PAGE_REQ */
+ 28, /* 22, REP_REREQUEST */
+ 29, /* 24, REP_START_SYNC */
+ 30, /* 25, REP_UPDATE */
+ 31, /* 26, REP_UPDATE_REQ */
+ 32, /* 27, REP_VERIFY */
+ 33, /* 28, REP_VERIFY_FAIL */
+ 34, /* 29, REP_VERIFY_REQ */
+ 35, /* 30, REP_VOTE1 */
+ 36, /* 31, REP_VOTE2 */
+ REP_INVALID, /* 32, 4.6/4.7 no message */
+ REP_INVALID, /* 33, 4.6/4.7 no message */
+ REP_INVALID, /* 34, 4.6/4.7 no message */
+ REP_INVALID, /* 35, 4.6/4.7 no message */
+ REP_INVALID /* 36, 4.6/4.7 no message */
},
/*
* From 4.7 message number To 5.2 message number. There are
@@ -2009,34 +2106,39 @@ __rep_msg_from_old(version, rectype)
1, /* 1, REP_ALIVE */
2, /* 2, REP_ALIVE_REQ */
3, /* 3, REP_ALL_REQ */
- 4, /* 4, REP_BULK_LOG */
- 5, /* 5, REP_BULK_PAGE */
- 6, /* 6, REP_DUPMASTER */
- 7, /* 7, REP_FILE */
- 8, /* 8, REP_FILE_FAIL */
- 9, /* 9, REP_FILE_REQ */
- 10, /* 10, REP_LEASE_GRANT */
- 11, /* 11, REP_LOG */
- 12, /* 12, REP_LOG_MORE */
- 13, /* 13, REP_LOG_REQ */
- 14, /* 14, REP_MASTER_REQ */
- 15, /* 15, REP_NEWCLIENT */
- 16, /* 16, REP_NEWFILE */
- 17, /* 17, REP_NEWMASTER */
- 18, /* 18, REP_NEWSITE */
- 19, /* 19, REP_PAGE */
- 20, /* 20, REP_PAGE_FAIL */
- 21, /* 21, REP_PAGE_MORE */
- 22, /* 22, REP_PAGE_REQ */
- 23, /* 22, REP_REREQUEST */
- 24, /* 24, REP_START_SYNC */
- 25, /* 25, REP_UPDATE */
- 26, /* 26, REP_UPDATE_REQ */
- 27, /* 27, REP_VERIFY */
- 28, /* 28, REP_VERIFY_FAIL */
- 29, /* 29, REP_VERIFY_REQ */
- 30, /* 30, REP_VOTE1 */
- 31 /* 31, REP_VOTE2 */
+ 9, /* 4, REP_BULK_LOG */
+ 10, /* 5, REP_BULK_PAGE */
+ 11, /* 6, REP_DUPMASTER */
+ 12, /* 7, REP_FILE */
+ 13, /* 8, REP_FILE_FAIL */
+ 14, /* 9, REP_FILE_REQ */
+ 15, /* 10, REP_LEASE_GRANT */
+ 16, /* 11, REP_LOG */
+ 17, /* 12, REP_LOG_MORE */
+ 18, /* 13, REP_LOG_REQ */
+ 19, /* 14, REP_MASTER_REQ */
+ 20, /* 15, REP_NEWCLIENT */
+ 21, /* 16, REP_NEWFILE */
+ 22, /* 17, REP_NEWMASTER */
+ 23, /* 18, REP_NEWSITE */
+ 24, /* 19, REP_PAGE */
+ 25, /* 20, REP_PAGE_FAIL */
+ 26, /* 21, REP_PAGE_MORE */
+ 27, /* 22, REP_PAGE_REQ */
+ 28, /* 22, REP_REREQUEST */
+ 29, /* 24, REP_START_SYNC */
+ 30, /* 25, REP_UPDATE */
+ 31, /* 26, REP_UPDATE_REQ */
+ 32, /* 27, REP_VERIFY */
+ 33, /* 28, REP_VERIFY_FAIL */
+ 34, /* 29, REP_VERIFY_REQ */
+ 35, /* 30, REP_VOTE1 */
+ 36, /* 31, REP_VOTE2 */
+ REP_INVALID, /* 32, 4.7/5.2 no message */
+ REP_INVALID, /* 33, 4.7/5.2 no message */
+ REP_INVALID, /* 34, 4.7/5.2 no message */
+ REP_INVALID, /* 35, 4.7/5.2 no message */
+ REP_INVALID /* 36, 4.7/5.2 no message */
},
/*
* From 4.7 message number To 5.3 message number. There are
@@ -2047,34 +2149,86 @@ __rep_msg_from_old(version, rectype)
1, /* 1, REP_ALIVE */
2, /* 2, REP_ALIVE_REQ */
3, /* 3, REP_ALL_REQ */
- 4, /* 4, REP_BULK_LOG */
- 5, /* 5, REP_BULK_PAGE */
- 6, /* 6, REP_DUPMASTER */
- 7, /* 7, REP_FILE */
- 8, /* 8, REP_FILE_FAIL */
- 9, /* 9, REP_FILE_REQ */
- 10, /* 10, REP_LEASE_GRANT */
- 11, /* 11, REP_LOG */
- 12, /* 12, REP_LOG_MORE */
- 13, /* 13, REP_LOG_REQ */
- 14, /* 14, REP_MASTER_REQ */
- 15, /* 15, REP_NEWCLIENT */
- 16, /* 16, REP_NEWFILE */
- 17, /* 17, REP_NEWMASTER */
- 18, /* 18, REP_NEWSITE */
- 19, /* 19, REP_PAGE */
- 20, /* 20, REP_PAGE_FAIL */
- 21, /* 21, REP_PAGE_MORE */
- 22, /* 22, REP_PAGE_REQ */
- 23, /* 22, REP_REREQUEST */
- 24, /* 24, REP_START_SYNC */
- 25, /* 25, REP_UPDATE */
- 26, /* 26, REP_UPDATE_REQ */
- 27, /* 27, REP_VERIFY */
- 28, /* 28, REP_VERIFY_FAIL */
- 29, /* 29, REP_VERIFY_REQ */
- 30, /* 30, REP_VOTE1 */
- 31 /* 31, REP_VOTE2 */
+ 9, /* 4, REP_BULK_LOG */
+ 10, /* 5, REP_BULK_PAGE */
+ 11, /* 6, REP_DUPMASTER */
+ 12, /* 7, REP_FILE */
+ 13, /* 8, REP_FILE_FAIL */
+ 14, /* 9, REP_FILE_REQ */
+ 15, /* 10, REP_LEASE_GRANT */
+ 16, /* 11, REP_LOG */
+ 17, /* 12, REP_LOG_MORE */
+ 18, /* 13, REP_LOG_REQ */
+ 19, /* 14, REP_MASTER_REQ */
+ 20, /* 15, REP_NEWCLIENT */
+ 21, /* 16, REP_NEWFILE */
+ 22, /* 17, REP_NEWMASTER */
+ 23, /* 18, REP_NEWSITE */
+ 24, /* 19, REP_PAGE */
+ 25, /* 20, REP_PAGE_FAIL */
+ 26, /* 21, REP_PAGE_MORE */
+ 27, /* 22, REP_PAGE_REQ */
+ 28, /* 22, REP_REREQUEST */
+ 29, /* 24, REP_START_SYNC */
+ 30, /* 25, REP_UPDATE */
+ 31, /* 26, REP_UPDATE_REQ */
+ 32, /* 27, REP_VERIFY */
+ 33, /* 28, REP_VERIFY_FAIL */
+ 34, /* 29, REP_VERIFY_REQ */
+ 35, /* 30, REP_VOTE1 */
+ 36, /* 31, REP_VOTE2 */
+ REP_INVALID, /* 32, 4.7/5.3 no message */
+ REP_INVALID, /* 33, 4.7/5.3 no message */
+ REP_INVALID, /* 34, 4.7/5.3 no message */
+ REP_INVALID, /* 35, 4.7/5.3 no message */
+ REP_INVALID /* 36, 4.7/5.3 no message */
+ },
+ /*
+ * From 5.3 message number To 6.1 message number. Messages to
+ * handle BLOBs were added.
+ */
+ { REP_INVALID, /* NO message 0 */
+ 1, /* 1, REP_ALIVE */
+ 2, /* 2, REP_ALIVE_REQ */
+ 3, /* 3, REP_ALL_REQ */
+ /* 4, REP_BLOB_ALL_REQ doesn't exist */
+ /* 5, REP_BLOB_CHUNK doesn't exist */
+ /* 6, REP_BLOB_CHUNK_REQ doesn't exist */
+ /* 7, REP_BLOB_UPDATE doesn't exist */
+ /* 8, REP_BLOB_UPDATE_REQ doesn't exist */
+ 9, /* 4, REP_BULK_LOG */
+ 10, /* 5, REP_BULK_PAGE */
+ 11, /* 6, REP_DUPMASTER */
+ 12, /* 7, REP_FILE */
+ 13, /* 8, REP_FILE_FAIL */
+ 14, /* 9, REP_FILE_REQ */
+ 15, /* 10, REP_LEASE_GRANT */
+ 16, /* 11, REP_LOG */
+ 17, /* 12, REP_LOG_MORE */
+ 18, /* 13, REP_LOG_REQ */
+ 19, /* 14, REP_MASTER_REQ */
+ 20, /* 15, REP_NEWCLIENT */
+ 21, /* 16, REP_NEWFILE */
+ 22, /* 17, REP_NEWMASTER */
+ 23, /* 18, REP_NEWSITE */
+ 24, /* 19, REP_PAGE */
+ 25, /* 20, REP_PAGE_FAIL */
+ 26, /* 21, REP_PAGE_MORE */
+ 27, /* 22, REP_PAGE_REQ */
+ 28, /* 23, REP_REREQUEST */
+ 29, /* 24, REP_START_SYNC */
+ 30, /* 25, REP_UPDATE */
+ 31, /* 26, REP_UPDATE_REQ */
+ 32, /* 27, REP_VERIFY */
+ 33, /* 28, REP_VERIFY_FAIL */
+ 34, /* 29, REP_VERIFY_REQ */
+ 35, /* 30, REP_VOTE1 */
+ 36, /* 31, REP_VOTE2 */
+ REP_INVALID, /* 32, 5.3/6.1 no message */
+ REP_INVALID, /* 33, 5.3/6.1 no message */
+ REP_INVALID, /* 34, 5.3/6.1 no message */
+ REP_INVALID, /* 35, 5.3/6.1 no message */
+ REP_INVALID /* 36, 5.3/6.1 no message */
}
};
return (table[version][rectype]);
@@ -2215,9 +2369,9 @@ __rep_print_int(env, verbose, fmt, ap)
__os_id(env->dbenv, &pid, &tid);
if (diag_msg)
MUTEX_LOCK(env, rep->mtx_diag);
- __os_gettime(env, &ts, 1);
+ __os_gettime(env, &ts, 0);
__db_msgadd(env, &mb, "[%lu:%lu][%s] %s: ",
- (u_long)ts.tv_sec, (u_long)ts.tv_nsec/NS_PER_US,
+ (u_long)ts.tv_sec, (u_long)ts.tv_nsec / NS_PER_US,
env->dbenv->thread_id_string(env->dbenv, pid, tid, buf), s);
__db_msgadd_ap(env, &mb, fmt, ap);
@@ -2260,6 +2414,26 @@ __rep_print_message(env, eid, rp, str, flags)
FLD_SET(verbflag, DB_VERB_REP_MISC);
type = "all_req";
break;
+ case REP_BLOB_ALL_REQ:
+ FLD_SET(verbflag, DB_VERB_REP_MISC);
+ type = "all_blob_req";
+ break;
+ case REP_BLOB_CHUNK:
+ FLD_SET(verbflag, DB_VERB_REP_MISC);
+ type = "blob_chunk";
+ break;
+ case REP_BLOB_CHUNK_REQ:
+ FLD_SET(verbflag, DB_VERB_REP_MISC);
+ type = "blob_chunk_req";
+ break;
+ case REP_BLOB_UPDATE:
+ FLD_SET(verbflag, DB_VERB_REP_MISC);
+ type = "blob_update";
+ break;
+ case REP_BLOB_UPDATE_REQ:
+ FLD_SET(verbflag, DB_VERB_REP_MISC);
+ type = "blob_update_req";
+ break;
case REP_BULK_LOG:
FLD_SET(verbflag, DB_VERB_REP_MISC);
type = "bulk_log";
@@ -2650,9 +2824,19 @@ __rep_log_backup(env, logc, lsn, match)
*/
if ((match == REP_REC_COMMIT &&
rectype == DB___txn_regop) ||
- (match == REP_REC_PERM &&
- (rectype == DB___txn_ckp || rectype == DB___txn_regop)))
+ ((match == REP_REC_PERM || match == REP_REC_PERM_DEL) &&
+ IS_PERM_RECTYPE(rectype)))
break;
+ /*
+ * Break early if a file remove is discovered in the logs.
+ * BDB cannot restore a deleted database or blob file from
+ * logs, so trigger internal init to recover the file.
+ * Used by Instant Internal Init in replication.
+ */
+ if (match == REP_REC_PERM_DEL && rectype == DB___fop_remove) {
+ ret = DB_NOTFOUND;
+ break;
+ }
}
return (ret);
}
@@ -2671,7 +2855,6 @@ __rep_get_maxpermlsn(env, max_perm_lsnp)
{
DB_LOG *dblp;
DB_REP *db_rep;
- DB_THREAD_INFO *ip;
LOG *lp;
REP *rep;
@@ -2680,11 +2863,9 @@ __rep_get_maxpermlsn(env, max_perm_lsnp)
dblp = env->lg_handle;
lp = dblp->reginfo.primary;
- ENV_ENTER(env, ip);
MUTEX_LOCK(env, rep->mtx_clientdb);
*max_perm_lsnp = lp->max_perm_lsn;
MUTEX_UNLOCK(env, rep->mtx_clientdb);
- ENV_LEAVE(env, ip);
return (0);
}
@@ -2724,12 +2905,13 @@ __rep_get_datagen(env, data_genp)
u_int8_t data_buf[__REP_LSN_HIST_DATA_SIZE];
DBT key_dbt, data_dbt;
u_int32_t flags;
- int ret, t_ret, tries;
+ int ret, t_ret, tries, was_open;
db_rep = env->rep_handle;
ret = 0;
*data_genp = 0;
tries = 0;
+ was_open = 0;
flags = DB_LAST;
retry:
if ((ret = __txn_begin(env, NULL, NULL, &txn, DB_IGNORE_LEASE)) != 0)
@@ -2746,10 +2928,10 @@ retry:
* That is not an error.
*/
ret = 0;
- goto out;
+ goto noclose;
}
- db_rep->lsn_db = dbp;
- }
+ } else
+ was_open = 1;
if ((ret = __db_cursor(dbp, NULL, txn, &dbc, 0)) != 0)
goto out;
@@ -2784,8 +2966,126 @@ retry:
&key, key_buf, __REP_LSN_HIST_KEY_SIZE, NULL)) == 0)
*data_genp = key.gen;
out:
+ if (!was_open && dbp != NULL &&
+ (t_ret = __db_close(dbp, txn, DB_NOSYNC)) != 0 && ret == 0)
+ ret = t_ret;
+noclose:
if ((t_ret = __txn_commit(txn, DB_TXN_NOSYNC)) != 0 && ret == 0)
ret = t_ret;
err:
return (ret);
}
+
+/*
+ * __rep_become_readonly_master --
+ *
+ * Put this master into a state where it no longer accepts writes but it
+ * is still a master that can respond to requests for missing messages.
+ * It fills in sync_lsn to provide a mechanism to know the LSN of the
+ * next log record expected on this site. Generally, this site should
+ * be restarted as a client shortly after becoming a readonly master.
+ *
+ * PUBLIC: int __rep_become_readonly_master
+ * PUBLIC: __P((ENV *, u_int32_t *, DB_LSN *));
+ */
+int
+__rep_become_readonly_master(env, gen, sync_lsnp)
+ ENV *env;
+ u_int32_t *gen;
+ DB_LSN *sync_lsnp;
+{
+ DB_LOG *dblp;
+ DB_REP *db_rep;
+ LOG *lp;
+ REP *rep;
+ int locked, ret;
+
+ db_rep = env->rep_handle;
+ rep = db_rep->region;
+ dblp = env->lg_handle;
+ lp = dblp->reginfo.primary;
+ *gen = 0;
+ ZERO_LSN(*sync_lsnp);
+ ret = 0;
+ locked = 0;
+
+ REP_SYSTEM_LOCK(env);
+ /*
+ * Lock out replication message thread processing so that replication
+ * world won't change (e.g. restart, client sync).
+ */
+ if (FLD_ISSET(rep->lockout_flags, REP_LOCKOUT_MSG)) {
+ /* There is already someone in msg lockout, return. */
+ RPRINT(env, (env, DB_VERB_REP_MISC,
+ "Readonly master: thread already in msg lockout"));
+ goto errunlock;
+ } else if ((ret = __rep_lockout_msg(env, rep, 0)) != 0)
+ goto errclearlockouts;
+
+ /*
+ * Lock out API to wait for active txn/mpool operations to complete
+ * and prevent new ones from starting.
+ */
+ if ((ret = __rep_lockout_api(env, rep)) != 0)
+ goto errclearlockouts;
+ locked = 1;
+
+ /* Make this site a readonly master and get master generation. */
+ F_SET(rep, REP_F_READONLY_MASTER);
+ *gen = rep->gen;
+ REP_SYSTEM_UNLOCK(env);
+
+ /* Get the next log record the logging subsystem expects to write. */
+ LOG_SYSTEM_LOCK(env);
+ *sync_lsnp = lp->lsn;
+ LOG_SYSTEM_UNLOCK(env);
+
+ REP_SYSTEM_LOCK(env);
+errclearlockouts:
+ FLD_CLR(rep->lockout_flags, REP_LOCKOUT_MSG);
+ if (locked)
+ CLR_LOCKOUT_BDB(rep);
+errunlock:
+ REP_SYSTEM_UNLOCK(env);
+ return (ret);
+}
+
+/*
+ * __rep_get_lsnhist_data --
+ *
+ * A utility function to get the full LSN history database record for a
+ * particular gen.
+ *
+ * PUBLIC: int __rep_get_lsnhist_data __P((ENV *, DB_THREAD_INFO *,
+ * PUBLIC: u_int32_t, __rep_lsn_hist_data_args *));
+ */
+int
+__rep_get_lsnhist_data(env, ip, gen, lsnhist_data)
+ ENV *env;
+ DB_THREAD_INFO *ip;
+ u_int32_t gen;
+ __rep_lsn_hist_data_args *lsnhist_data;
+{
+ DB_TXN *txn;
+ DBC *dbc;
+ struct rep_waitgoal reason;
+ int ret, t_ret;
+
+ txn = NULL;
+ dbc = NULL;
+
+ /*
+ * Cannot use cached LSN history values because we need the
+ * timestamp value here, which is not cached.
+ */
+ ret = __rep_read_lsn_history(env,
+ ip, &txn, &dbc, gen, lsnhist_data, &reason, DB_SET, 0);
+
+ if (dbc != NULL &&
+ (t_ret = __dbc_close(dbc)) != 0 && ret == 0)
+ ret = t_ret;
+ if (txn != NULL &&
+ (t_ret = __db_txn_auto_resolve(env, txn, 1, ret)) != 0 && ret == 0)
+ ret = t_ret;
+ return (ret);
+}