summaryrefslogtreecommitdiff
path: root/src/dbinc/rep.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/dbinc/rep.h')
-rw-r--r--src/dbinc/rep.h287
1 files changed, 215 insertions, 72 deletions
diff --git a/src/dbinc/rep.h b/src/dbinc/rep.h
index 75004239..f3bdf481 100644
--- a/src/dbinc/rep.h
+++ b/src/dbinc/rep.h
@@ -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$
*/
@@ -19,6 +19,7 @@ extern "C" {
* Names of client temp databases.
*/
#define REPFILEPREFIX "__db.rep"
+#define REPBLOBNAME "__db.rep.blob.db"
#define REPDBNAME "__db.rep.db"
#define REPPAGENAME "__db.reppg.db"
@@ -42,43 +43,58 @@ extern "C" {
/*
* Message types
*/
-#define REP_INVALID 0 /* Invalid message type. */
-#define REP_ALIVE 1 /* I am alive message. */
-#define REP_ALIVE_REQ 2 /* Request for alive messages. */
-#define REP_ALL_REQ 3 /* Request all log records greater than LSN. */
-#define REP_BULK_LOG 4 /* Bulk transfer of log records. */
-#define REP_BULK_PAGE 5 /* Bulk transfer of pages. */
-#define REP_DUPMASTER 6 /* Duplicate master detected; propagate. */
-#define REP_FILE 7 /* Page of a database file. NOTUSED */
-#define REP_FILE_FAIL 8 /* File requested does not exist. */
-#define REP_FILE_REQ 9 /* Request for a database file. NOTUSED */
-#define REP_LEASE_GRANT 10 /* Client grants a lease to a master. */
-#define REP_LOG 11 /* Log record. */
-#define REP_LOG_MORE 12 /* There are more log records to request. */
-#define REP_LOG_REQ 13 /* Request for a log record. */
-#define REP_MASTER_REQ 14 /* Who is the master */
-#define REP_NEWCLIENT 15 /* Announces the presence of a new client. */
-#define REP_NEWFILE 16 /* Announce a log file change. */
-#define REP_NEWMASTER 17 /* Announces who the master is. */
-#define REP_NEWSITE 18 /* Announces that a site has heard from a new
- * site; like NEWCLIENT, but indirect. A
- * NEWCLIENT message comes directly from the new
- * client while a NEWSITE comes indirectly from
- * someone who heard about a NEWSITE.
- */
-#define REP_PAGE 19 /* Database page. */
-#define REP_PAGE_FAIL 20 /* Requested page does not exist. */
-#define REP_PAGE_MORE 21 /* There are more pages to request. */
-#define REP_PAGE_REQ 22 /* Request for a database page. */
-#define REP_REREQUEST 23 /* Force rerequest. */
-#define REP_START_SYNC 24 /* Tell client to begin syncing a ckp.*/
-#define REP_UPDATE 25 /* Environment hotcopy information. */
-#define REP_UPDATE_REQ 26 /* Request for hotcopy information. */
-#define REP_VERIFY 27 /* A log record for verification. */
-#define REP_VERIFY_FAIL 28 /* The client is outdated. */
-#define REP_VERIFY_REQ 29 /* Request for a log record to verify. */
-#define REP_VOTE1 30 /* Send out your information for an election. */
-#define REP_VOTE2 31 /* Send a "you are master" vote. */
+#define REP_INVALID 0 /* Invalid message type. */
+#define REP_ALIVE 1 /* I am alive message. */
+#define REP_ALIVE_REQ 2 /* Request for alive messages. */
+#define REP_ALL_REQ 3 /* Request all log records greater than
+ * LSN. */
+#define REP_BLOB_ALL_REQ 4 /* Request all the given blob files. */
+#define REP_BLOB_CHUNK 5 /* A piece of data contained in a blob
+ * file. */
+#define REP_BLOB_CHUNK_REQ 6 /* Request a piece of data from a blob
+ * file. */
+#define REP_BLOB_UPDATE 7 /* A list of blob files for a
+ * database. */
+#define REP_BLOB_UPDATE_REQ 8 /* Request blob files. */
+#define REP_BULK_LOG 9 /* Bulk transfer of log records. */
+#define REP_BULK_PAGE 10 /* Bulk transfer of pages. */
+#define REP_DUPMASTER 11 /* Duplicate master detected;
+ * propagate. */
+#define REP_FILE 12 /* Page of a database file. NOTUSED */
+#define REP_FILE_FAIL 13 /* File requested does not exist. */
+#define REP_FILE_REQ 14 /* Request for a database file.
+ * NOTUSED */
+#define REP_LEASE_GRANT 15 /* Client grants a lease to a master. */
+#define REP_LOG 16 /* Log record. */
+#define REP_LOG_MORE 17 /* There are more log records to
+ * request. */
+#define REP_LOG_REQ 18 /* Request for a log record. */
+#define REP_MASTER_REQ 19 /* Who is the master */
+#define REP_NEWCLIENT 20 /* Announces the presence of a new
+ * client. */
+#define REP_NEWFILE 21 /* Announce a log file change. */
+#define REP_NEWMASTER 22 /* Announces who the master is. */
+#define REP_NEWSITE 23 /* Announces that a site has heard from
+ * a new site; like NEWCLIENT, but
+ * indirect. A NEWCLIENT message comes
+ * directly from the new client while a
+ * NEWSITE comes indirectly from
+ * someone who heard about a NEWSITE.*/
+#define REP_PAGE 24 /* Database page. */
+#define REP_PAGE_FAIL 25 /* Requested page does not exist. */
+#define REP_PAGE_MORE 26 /* There are more pages to request. */
+#define REP_PAGE_REQ 27 /* Request for a database page. */
+#define REP_REREQUEST 28 /* Force rerequest. */
+#define REP_START_SYNC 29 /* Tell client to begin syncing a ckp.*/
+#define REP_UPDATE 30 /* Environment hotcopy information. */
+#define REP_UPDATE_REQ 31 /* Request for hotcopy information. */
+#define REP_VERIFY 32 /* A log record for verification. */
+#define REP_VERIFY_FAIL 33 /* The client is outdated. */
+#define REP_VERIFY_REQ 34 /* Request for a log record to
+ * verify. */
+#define REP_VOTE1 35 /* Send out your information for an
+ * election. */
+#define REP_VOTE2 36 /* Send a "you are master" vote. */
/*
* Maximum message number for conversion tables. Update this
* value as the largest message number above increases.
@@ -90,7 +106,7 @@ extern "C" {
* NOTE: When changing messages above, the two tables for upgrade support
* need adjusting. They are in rep_util.c.
*/
-#define REP_MAX_MSG 31
+#define REP_MAX_MSG 36
/*
* This is the list of client-to-client requests messages.
@@ -99,6 +115,8 @@ extern "C" {
*/
#define REP_MSG_REQ(rectype) \
(rectype == REP_ALL_REQ || \
+ rectype == REP_BLOB_ALL_REQ || \
+ rectype == REP_BLOB_CHUNK_REQ || \
rectype == REP_LOG_REQ || \
rectype == REP_PAGE_REQ || \
rectype == REP_VERIFY_REQ)
@@ -125,6 +143,9 @@ extern "C" {
#define DB_LOGVERSION_51 17
#define DB_LOGVERSION_52 18
#define DB_LOGVERSION_53 19
+#define DB_LOGVERSION_60 20
+#define DB_LOGVERSION_60p1 21
+#define DB_LOGVERSION_61 22
#define DB_LOGVERSION_MIN DB_LOGVERSION_44
#define DB_REPVERSION_INVALID 0
#define DB_REPVERSION_44 3
@@ -132,11 +153,12 @@ extern "C" {
#define DB_REPVERSION_46 4
#define DB_REPVERSION_47 5
#define DB_REPVERSION_48 5
-#define DB_REPVERSION_50 5
#define DB_REPVERSION_51 5
#define DB_REPVERSION_52 6
#define DB_REPVERSION_53 7
-#define DB_REPVERSION DB_REPVERSION_53
+#define DB_REPVERSION_60 7
+#define DB_REPVERSION_61 8
+#define DB_REPVERSION DB_REPVERSION_61
#define DB_REPVERSION_MIN DB_REPVERSION_44
/*
@@ -204,9 +226,20 @@ extern "C" {
#define REP_INITVERSION 3
/*
+ * View/partial replication file name.
+ * The file is empty. It exists as a permanent indicator that this
+ * environment can never be master.
+ */
+#define REPVIEW "__db.rep.view"
+#define IS_VIEW_SITE(env) \
+ (REP_ON(env) && \
+ ((env)->rep_handle->region->stat.st_view != 0))
+
+/*
* Database types for __rep_client_dbinit
*/
typedef enum {
+ REP_BLOB, /* Blob file database. */
REP_DB, /* Log record database. */
REP_PG /* Pg database. */
} repdb_t;
@@ -239,7 +272,7 @@ typedef enum {
typedef enum {
SYNC_OFF, /* No recovery. */
SYNC_LOG, /* Recovery - log. */
- SYNC_PAGE, /* Recovery - pages. */
+ SYNC_PAGE, /* Recovery - pages and blobs. */
SYNC_UPDATE, /* Recovery - update. */
SYNC_VERIFY /* Recovery - verify. */
} repsync_t;
@@ -346,6 +379,17 @@ typedef struct __rep { /* SHARED */
u_int32_t first_vers; /* Log version of first log file. */
DB_LSN last_lsn; /* Latest LSN we need. */
/* These are protected by mtx_clientdb. */
+ db_seq_t gap_bl_hi_id; /* Last id in the blob gap. */
+ db_seq_t gap_bl_hi_sid; /* Last sid in the blob gap. */
+ off_t gap_bl_hi_off; /* Last offset in the blob gap. */
+ db_seq_t last_blob_id; /* Last id on the list to process. */
+ db_seq_t last_blob_sid; /* Last sid on the list to process. */
+ db_seq_t prev_blob_id; /* Previous last id on list. */
+ db_seq_t prev_blob_sid; /* Previous last sid on list. */
+ db_seq_t highest_id; /* Highest file id to request. */
+ u_int32_t blob_more_files;/* More blob files to be processed. */
+ int blob_sync; /* Currently handling blobs. */
+ int blob_rereq; /* When to rereq a blob update msg. */
db_timespec last_pg_ts; /* Last page stored timestamp. */
db_pgno_t ready_pg; /* Next pg expected. */
db_pgno_t waiting_pg; /* First pg after gap. */
@@ -391,11 +435,13 @@ typedef struct __rep { /* SHARED */
roff_t siteinfo_off; /* Offset of site array region. */
u_int site_cnt; /* Array slots in use. */
u_int site_max; /* Total array slots allocated. */
+ u_int sites_avail; /* Total number of available sites. */
int self_eid; /* Where to find the local site. */
u_int siteinfo_seq; /* Number of updates to this info. */
u_int32_t min_log_file; /* Earliest log needed by repgroup. */
pid_t listener;
+ u_int listener_nthreads; /* # of msg threads in listener. */
int perm_policy;
db_timeout_t ack_timeout;
@@ -403,6 +449,11 @@ typedef struct __rep { /* SHARED */
db_timeout_t connection_retry_wait;
db_timeout_t heartbeat_frequency; /* Max period between msgs. */
db_timeout_t heartbeat_monitor_timeout;
+ u_int32_t inqueue_max_gbytes;
+ u_int32_t inqueue_max_bytes;
+ u_int32_t inqueue_rz_gbytes;
+ u_int32_t inqueue_rz_bytes;
+ u_int32_t inqueue_full_event_on;
#endif /* HAVE_REPLICATION_THREADS */
/* Statistics. */
@@ -419,12 +470,16 @@ typedef struct __rep { /* SHARED */
#define REP_C_2SITE_STRICT 0x00001 /* Don't cheat on elections. */
#define REP_C_AUTOINIT 0x00002 /* Auto initialization. */
#define REP_C_AUTOROLLBACK 0x00004 /* Discard client txns: sync. */
-#define REP_C_BULK 0x00008 /* Bulk transfer. */
-#define REP_C_DELAYCLIENT 0x00010 /* Delay client sync-up. */
-#define REP_C_ELECTIONS 0x00020 /* Repmgr to use elections. */
-#define REP_C_INMEM 0x00040 /* In-memory replication. */
-#define REP_C_LEASE 0x00080 /* Leases configured. */
-#define REP_C_NOWAIT 0x00100 /* Immediate error return. */
+#define REP_C_AUTOTAKEOVER 0x00008 /* Auto listener take over. */
+#define REP_C_BULK 0x00010 /* Bulk transfer. */
+#define REP_C_DELAYCLIENT 0x00020 /* Delay client sync-up. */
+#define REP_C_ELECT_LOGLENGTH 0x00040 /* Log length wins election. */
+#define REP_C_ELECTIONS 0x00080 /* Repmgr to use elections. */
+#define REP_C_INMEM 0x00100 /* In-memory replication. */
+#define REP_C_LEASE 0x00200 /* Leases configured. */
+#define REP_C_NOWAIT 0x00400 /* Immediate error return. */
+#define REP_C_PREFMAS_CLIENT 0x00800 /* Preferred master client. */
+#define REP_C_PREFMAS_MASTER 0x01000 /* Preferred master site. */
u_int32_t config; /* Configuration flags. */
/* Election. */
@@ -455,15 +510,17 @@ typedef struct __rep { /* SHARED */
#define REP_F_CLIENT 0x00000008 /* Client replica. */
#define REP_F_DELAY 0x00000010 /* Delaying client sync-up. */
#define REP_F_GROUP_ESTD 0x00000020 /* Rep group is established. */
-#define REP_F_INUPDREQ 0x00000040 /* Thread in rep_update_req. */
-#define REP_F_LEASE_EXPIRED 0x00000080 /* Leases guaranteed expired. */
-#define REP_F_MASTER 0x00000100 /* Master replica. */
-#define REP_F_MASTERELECT 0x00000200 /* Master elect. */
-#define REP_F_NEWFILE 0x00000400 /* Newfile in progress. */
-#define REP_F_NIMDBS_LOADED 0x00000800 /* NIMDBs are materialized. */
-#define REP_F_SKIPPED_APPLY 0x00001000 /* Skipped applying a record. */
-#define REP_F_START_CALLED 0x00002000 /* Rep_start called. */
-#define REP_F_SYS_DB_OP 0x00004000 /* Operation in progress. */
+#define REP_F_HOLD_GEN 0x00000040 /* PrefMas startup hold gen. */
+#define REP_F_INUPDREQ 0x00000080 /* Thread in rep_update_req. */
+#define REP_F_LEASE_EXPIRED 0x00000100 /* Leases guaranteed expired. */
+#define REP_F_MASTER 0x00000200 /* Master replica. */
+#define REP_F_MASTERELECT 0x00000400 /* Master elect. */
+#define REP_F_NEWFILE 0x00000800 /* Newfile in progress. */
+#define REP_F_NIMDBS_LOADED 0x00001000 /* NIMDBs are materialized. */
+#define REP_F_READONLY_MASTER 0x00002000 /* PrefMas readonly master. */
+#define REP_F_SKIPPED_APPLY 0x00004000 /* Skipped applying a record. */
+#define REP_F_START_CALLED 0x00008000 /* Rep_start called. */
+#define REP_F_SYS_DB_OP 0x00010000 /* Operation in progress. */
u_int32_t flags;
} REP;
@@ -525,7 +582,7 @@ do { \
/*
* REP_F_EPHASE0 is not a *real* election phase. It is used for
* master leases and allowing the client to find the master or
- * expire its lease. However, EPHASE0 is cleared by __rep_elect_done.
+ * expire its lease.
*/
#define IN_ELECTION(R) \
FLD_ISSET((R)->elect_flags, REP_E_PHASE1 | REP_E_PHASE2)
@@ -594,6 +651,22 @@ do { \
} while (0)
+/* Macros to determine current replication configuration options. */
+#define REP_CONFIG_IS_SET(env, flags) \
+ (REP_ON(env) ? \
+ FLD_ISSET(((env)->rep_handle->region)->config, flags) : \
+ FLD_ISSET(((env)->rep_handle)->config, flags))
+#ifdef HAVE_REPLICATION_THREADS
+#define PREFMAS_IS_SET(env) \
+ (REP_CONFIG_IS_SET(env, \
+ (REP_C_PREFMAS_MASTER | REP_C_PREFMAS_CLIENT)))
+#else
+#define PREFMAS_IS_SET(env) 0
+#endif
+#define IS_PREFMAS_MODE(env) \
+ (REP_ON(env) && PREFMAS_IS_SET(env) && \
+ ((env)->rep_handle->region)->config_nsites < 3)
+
/*
* Gap processing flags. These provide control over the basic
* gap processing algorithm for some special cases.
@@ -603,11 +676,28 @@ do { \
/* REREQUEST is a superset of FORCE. */
/*
+ * Internal options for rep_start_int(). These are used by preferred master
+ * mode to help coordinate between the sites during changes of master.
+ */
+#define REP_START_FORCE_ROLECHG 0x001 /* Force role change to advance gen. */
+#define REP_START_HOLD_CLIGEN 0x002 /* Hold client gen before doing
+ * lsnhist match. */
+#define REP_START_WAIT_LOCKMSG 0x004 /* Wait for REP_LOCKOUT_MSG. */
+
+/*
* Flags indicating what kind of record we want to back up to, in the log.
*/
-#define REP_REC_COMMIT 0x001 /* Most recent commit record. */
-#define REP_REC_PERM 0x002 /* Most recent perm record. */
+#define REP_REC_COMMIT 0x001 /* Most recent commit record. */
+#define REP_REC_PERM 0x002 /* Most recent perm record. */
/* PERM is a superset of COMMIT. */
+#define REP_REC_PERM_DEL 0x004 /* Most recent PERM, or fail if a
+ * file delete is found first. */
+
+/*
+ * Permanent record types.
+ */
+#define IS_PERM_RECTYPE(rectype) \
+ ((rectype) == DB___txn_regop || (rectype) == DB___txn_ckp)
/*
* Basic pre/post-amble processing.
@@ -692,7 +782,7 @@ do { \
* machine instruction. A single 32-bit integer value is safe without a
* mutex, but most other types of value should use a mutex.
*
- * Any use of a mutex must be inside a matched pair of ENV_ENTER() and
+ * Use of a db_mutex_t mutex must be inside a matched pair of ENV_ENTER() and
* ENV_LEAVE() macros. This ensures that if a thread dies while holding
* a lock (i.e. a mutex), recovery can clean it up so that it does not
* indefinitely block other threads.
@@ -727,6 +817,9 @@ struct __db_rep {
/*
* End of shared configuration information.
*/
+ int (*partial) /* View/partial replication function. */
+ __P((DB_ENV *, const char *, int *, u_int32_t));
+
int (*send) /* Send function. */
__P((DB_ENV *, const DBT *, const DBT *,
const DB_LSN *, int, u_int32_t));
@@ -745,6 +838,7 @@ struct __db_rep {
DB_MPOOLFILE *file_mpf; /* Mpoolfile for current database. */
DB *file_dbp; /* This file's page info. */
DBC *queue_dbc; /* Dbc for a queue file. */
+ DB *blob_dbp; /* Blob file database. */
/*
* Please change __rep_print_all (rep_stat.c) to track any changes made
@@ -759,6 +853,7 @@ struct __db_rep {
/*
* Replication Framework (repmgr) per-process information.
*/
+ int config_nthreads;/* Configured msg processing threads. */
u_int nthreads; /* Msg processing threads. */
u_int athreads; /* Space allocated for msg threads. */
u_int non_rep_th; /* Threads in GMDB or channel msgs. */
@@ -771,10 +866,13 @@ struct __db_rep {
db_timeout_t connection_retry_wait;
db_timeout_t heartbeat_frequency; /* Max period between msgs. */
db_timeout_t heartbeat_monitor_timeout;
+ u_int32_t inqueue_max_gbytes;
+ u_int32_t inqueue_max_bytes;
/* Thread synchronization. */
REPMGR_RUNNABLE *selector, **messengers, **elect_threads;
REPMGR_RUNNABLE *preferred_elect_thr;
+ REPMGR_RUNNABLE *takeover_thread;
db_timespec repstart_time;
mgr_mutex_t *mutex;
cond_var_t check_election, gmdb_idle, msg_avail;
@@ -799,12 +897,18 @@ struct __db_rep {
CONNECTION_LIST connections;
RETRY_Q_HEADER retries; /* Sites needing connection retry. */
struct {
- int size;
+ u_int32_t gbytes;
+ u_int32_t bytes;
STAILQ_HEAD(__repmgr_q_header, __repmgr_message) header;
} input_queue;
socket_t listen_fd;
db_timespec last_bcast; /* Time of last broadcast msg. */
+ db_timespec last_hbeat; /* Time of last heartbeat (prefmas). */
+ db_timespec l_listener_chk; /* Time to check local listener. */
+ db_timeout_t l_listener_wait;/* Timeout to check local listener. */
+ db_timespec m_listener_chk; /* Time to check master listener. */
+ db_timeout_t m_listener_wait;/* Timeout to check master listener. */
/*
* Status of repmgr. It is ready when repmgr is not yet started. It
@@ -813,12 +917,15 @@ struct __db_rep {
*/
enum { ready, running, stopped } repmgr_status;
int new_connection; /* Since last master seek attempt. */
+ int demotion_pending; /* We're being demoted to a view. */
int takeover_pending; /* We've been elected master. */
+ int rejoin_pending; /* Join group retry after rejection. */
int gmdb_busy;
int client_intent; /* Will relinquish master role. */
int gmdb_dirty;
int have_gmdb;
int seen_repmsg;
+ int view_mismatch; /* View callback and gmdb don't match. */
/*
* Flag to show what kind of transaction is currently in progress.
@@ -854,6 +961,16 @@ struct __db_rep {
u_int8_t *restored_list;
size_t restored_list_length;
+ /*
+ * Preferred master mode indicator for a pending action. A
+ * master_switch is initiated when the preferred master site is
+ * ready to take over as master. A start_temp_master is initiated
+ * when the client site needs to start as the temporary master.
+ */
+ enum { no_action, master_switch, start_temp_master } prefmas_pending;
+ /* The LSN at the very beginning of preferred master site startup. */
+ DB_LSN prefmas_init_lsn;
+
/* Application's message dispatch call-back function. */
void (*msg_dispatch) __P((DB_ENV *, DB_CHANNEL *,
DBT *, u_int32_t, u_int32_t));
@@ -920,6 +1037,10 @@ struct __db_rep {
} else if (!F_ISSET((env)->rep_handle, DBREP_APP_REPMGR)) \
F_SET((env)->rep_handle, DBREP_APP_BASEAPI); \
} while (0)
+#define ADJUST_AUTOTAKEOVER_WAITS(db_rep, timeout) do { \
+ (db_rep)->l_listener_wait = timeout; \
+ (db_rep)->m_listener_wait = 3 * timeout; \
+} while (0)
#else
/*
@@ -935,6 +1056,9 @@ struct __db_rep {
#define APP_SET_BASEAPI(env) do { \
; \
} while (0)
+#define ADJUST_AUTOTAKEOVER_WAITS(db_rep, timeout) do { \
+ ; \
+} while (0)
#endif /* HAVE_REPLICATION_THREADS */
/*
@@ -945,22 +1069,27 @@ struct __db_rep {
* compatibility with old versions, these values must be reserved explicitly in
* the list of flag values (below)
*/
-#define DB_LOG_PERM_42_44 0x20
-#define DB_LOG_RESEND_42_44 0x40
-#define REPCTL_INIT_45 0x02 /* Back compatible flag value. */
-
-#define REPCTL_ELECTABLE 0x01 /* Upgraded client is electable. */
-#define REPCTL_FLUSH 0x02 /* Record should be flushed. */
-#define REPCTL_GROUP_ESTD 0x04 /* Message from site in a group. */
-#define REPCTL_INIT 0x08 /* Internal init message. */
-#define REPCTL_LEASE 0x10 /* Lease related message.. */
+#define DB_LOG_PERM_42_44 0x020
+#define DB_LOG_RESEND_42_44 0x040
+#define REPCTL_INIT_45 0x002 /* Back compatible flag value. */
+
+/*
+ * Add new REPCTL flags to the end of this list to preserve compatibility
+ * with old versions.
+ */
+#define REPCTL_ELECTABLE 0x001 /* Upgraded client is electable. */
+#define REPCTL_FLUSH 0x002 /* Record should be flushed. */
+#define REPCTL_GROUP_ESTD 0x004 /* Message from site in a group. */
+#define REPCTL_INIT 0x008 /* Internal init message. */
+#define REPCTL_LEASE 0x010 /* Lease related message. */
/*
* Skip over reserved values 0x20
* and 0x40, as explained above.
*/
-#define REPCTL_LOG_END 0x80 /* Approximate end of group-wide log. */
+#define REPCTL_LOG_END 0x080 /* Approximate end of group-wide log. */
#define REPCTL_PERM DB_LOG_PERM_42_44
#define REPCTL_RESEND DB_LOG_RESEND_42_44
+#define REPCTL_INMEM_ONLY 0x100 /* In-memory databases only. */
/*
* File info flags for internal init. The per-database (i.e., file) flag
@@ -1094,6 +1223,20 @@ typedef struct {
DBT *objs;
} linfo_t;
+/*
+ * Used to store information on the child transaction that opens a blob meta
+ * database. In partial replication processing the child transaction of the
+ * blob meta database must be delayed until after processing the child
+ * transaction that opens the database that owns the BMD.
+ */
+typedef struct {
+ db_seq_t blob_file_id;
+ DB_LSN lsn;
+ u_int32_t child;
+ void *next;
+ void *prev;
+} DELAYED_BLOB_LIST;
+
#if defined(__cplusplus)
}
#endif