rep.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 2001-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #ifndef _REP_H_
  8. #define _REP_H_
  9. #define REP_ALIVE 1 /* I am alive message. */
  10. #define REP_ALIVE_REQ 2 /* Request for alive messages. */
  11. #define REP_ALL_REQ 3 /* Request all log records greater than LSN. */
  12. #define REP_ELECT 4 /* Indicates that all listeners should */
  13. /* begin master election */
  14. #define REP_FILE 6 /* Page of a database file. */
  15. #define REP_FILE_REQ 7 /* Request for a database file. */
  16. #define REP_LOG 8 /* Log record. */
  17. #define REP_LOG_MORE 9 /* There are more log records to request. */
  18. #define REP_LOG_REQ 10 /* Request for a log record. */
  19. #define REP_MASTER_REQ 11 /* Who is the master */
  20. #define REP_NEWCLIENT 12 /* Announces the presence of a new client. */
  21. #define REP_NEWFILE 13 /* Announce a log file change. */
  22. #define REP_NEWMASTER 14 /* Announces who the master is. */
  23. #define REP_NEWSITE 15 /* Announces that a site has heard from a new
  24.  * site; like NEWCLIENT, but indirect.  A
  25.  * NEWCLIENT message comes directly from the new
  26.  * client while a NEWSITE comes indirectly from
  27.  * someone who heard about a NEWSITE.
  28.  */
  29. #define REP_PAGE 16 /* Database page. */
  30. #define REP_PAGE_REQ 17 /* Request for a database page. */
  31. #define REP_PLIST 18 /* Database page list. */
  32. #define REP_PLIST_REQ 19 /* Request for a page list. */
  33. #define REP_VERIFY 20 /* A log record for verification. */
  34. #define REP_VERIFY_FAIL 21 /* The client is outdated. */
  35. #define REP_VERIFY_REQ 22 /* Request for a log record to verify. */
  36. #define REP_VOTE1 23 /* Send out your information for an election. */
  37. #define REP_VOTE2 24 /* Send a "you are master" vote. */
  38. /* Used to consistently designate which messages ought to be received where. */
  39. #define MASTER_ONLY(dbenv)
  40. if (!F_ISSET(dbenv, DB_ENV_REP_MASTER)) return (EINVAL)
  41. #define CLIENT_ONLY(dbenv)
  42. if (!F_ISSET(dbenv, DB_ENV_REP_CLIENT)) return (EINVAL)
  43. #define ANYSITE(dbenv)
  44. /* Shared replication structure. */
  45. typedef struct __rep {
  46. /*
  47.  * Due to alignment constraints on some architectures (e.g. HP-UX),
  48.  * DB_MUTEXes must be the first element of shalloced structures,
  49.  * and as a corollary there can be only one per structure.  Thus,
  50.  * db_mutex_off points to a mutex in a separately-allocated chunk.
  51.  */
  52. DB_MUTEX mutex; /* Region lock. */
  53. roff_t db_mutex_off; /* Client database mutex. */
  54. u_int32_t tally_off; /* Offset of the tally region. */
  55. int eid; /* Environment id. */
  56. int master_id; /* ID of the master site. */
  57. u_int32_t gen; /* Replication generation number */
  58. int asites; /* Space allocated for sites. */
  59. int nsites; /* Number of sites in group. */
  60. int priority; /* My priority in an election. */
  61. u_int32_t gbytes; /* Limit on data sent in single... */
  62. u_int32_t bytes; /* __rep_process_message call. */
  63. #define DB_REP_REQUEST_GAP 4
  64. #define DB_REP_MAX_GAP 128
  65. u_int32_t request_gap; /* # of records to receive before we
  66.  * request a missing log record. */
  67. u_int32_t max_gap; /* Maximum number of records before
  68.  * requesting a missing log record. */
  69. /* Vote tallying information. */
  70. int sites; /* Sites heard from. */
  71. int winner; /* Current winner. */
  72. int w_priority; /* Winner priority. */
  73. u_int32_t w_gen; /* Winner generation. */
  74. DB_LSN w_lsn; /* Winner LSN. */
  75. int w_tiebreaker; /* Winner tiebreaking value. */
  76. int votes; /* Number of votes for this site. */
  77. /* Statistics. */
  78. DB_REP_STAT stat;
  79. #define REP_F_EPHASE1 0x01 /* In phase 1 of election. */
  80. #define REP_F_EPHASE2 0x02 /* In phase 2 of election. */
  81. #define REP_F_LOGSONLY 0x04 /* Log-site only; cannot be upgraded. */
  82. #define REP_F_MASTER 0x08 /* Master replica. */
  83. #define REP_F_RECOVER 0x10
  84. #define REP_F_UPGRADE 0x20 /* Upgradeable replica. */
  85. #define REP_ISCLIENT (REP_F_UPGRADE | REP_F_LOGSONLY)
  86. u_int32_t flags;
  87. } REP;
  88. #define IN_ELECTION(R) F_ISSET((R), REP_F_EPHASE1 | REP_F_EPHASE2)
  89. #define ELECTION_DONE(R) F_CLR((R), REP_F_EPHASE1 | REP_F_EPHASE2)
  90. /*
  91.  * Per-process replication structure.
  92.  */
  93. struct __db_rep {
  94. DB_MUTEX *mutexp;
  95. DB_MUTEX *db_mutexp; /* Mutex for bookkeeping database. */
  96. DB *rep_db; /* Bookkeeping database. */
  97. REP *region; /* In memory structure. */
  98. int (*rep_send) /* Send function. */
  99.     __P((DB_ENV *,
  100.     const DBT *, const DBT *, int, u_int32_t));
  101. };
  102. /*
  103.  * Control structure for replication communication infrastructure.
  104.  *
  105.  * Note that the version information should be at the beginning of the
  106.  * structure, so that we can rearrange the rest of it while letting the
  107.  * version checks continue to work.  DB_REPVERSION should be revved any time
  108.  * the rest of the structure changes.
  109.  */
  110. typedef struct __rep_control {
  111. #define DB_REPVERSION 1
  112. u_int32_t rep_version; /* Replication version number. */
  113. u_int32_t log_version; /* Log version number. */
  114. DB_LSN lsn; /* Log sequence number. */
  115. u_int32_t rectype; /* Message type. */
  116. u_int32_t gen; /* Generation number. */
  117. u_int32_t flags; /* log_put flag value. */
  118. } REP_CONTROL;
  119. /* Election vote information. */
  120. typedef struct __rep_vote {
  121. int priority; /* My site's priority. */
  122. int nsites; /* Number of sites I've been in
  123.  * communication with. */
  124. int tiebreaker; /* Tie-breaking quasi-random int. */
  125. } REP_VOTE_INFO;
  126. /*
  127.  * This structure takes care of representing a transaction.
  128.  * It holds all the records, sorted by page number so that
  129.  * we can obtain locks and apply updates in a deadlock free
  130.  * order.
  131.  */
  132. typedef struct __lsn_page {
  133. DB_LSN lsn;
  134. u_int32_t fid;
  135. DB_LOCK_ILOCK pgdesc;
  136. #define LSN_PAGE_NOLOCK 0x0001 /* No lock necessary for log rec. */
  137. u_int32_t flags;
  138. } LSN_PAGE;
  139. typedef struct __txn_recs {
  140. int npages;
  141. int nalloc;
  142. LSN_PAGE *array;
  143. u_int32_t txnid;
  144. u_int32_t lockid;
  145. } TXN_RECS;
  146. typedef struct __lsn_collection {
  147. int nlsns;
  148. int nalloc;
  149. DB_LSN *array;
  150. } LSN_COLLECTION;
  151. /*
  152.  * This is used by the page-prep routines to do the lock_vec call to
  153.  * apply the updates for a single transaction or a collection of
  154.  * transactions.
  155.  */
  156. typedef struct _linfo {
  157. int n;
  158. DB_LOCKREQ *reqs;
  159. DBT *objs;
  160. } linfo_t;
  161. #include "dbinc_auto/rep_ext.h"
  162. #endif /* !_REP_H_ */