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

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. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: rep_region.c,v 1.29 2002/08/06 04:50:36 bostic Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #endif
  13. #include <string.h>
  14. #include "db_int.h"
  15. #include "dbinc/rep.h"
  16. #include "dbinc/log.h"
  17. /*
  18.  * __rep_region_init --
  19.  * Initialize the shared memory state for the replication system.
  20.  *
  21.  * PUBLIC: int __rep_region_init __P((DB_ENV *));
  22.  */
  23. int
  24. __rep_region_init(dbenv)
  25. DB_ENV *dbenv;
  26. {
  27. REGENV *renv;
  28. REGINFO *infop;
  29. DB_MUTEX *db_mutexp;
  30. DB_REP *db_rep;
  31. REP *rep;
  32. int ret;
  33. db_rep = dbenv->rep_handle;
  34. infop = dbenv->reginfo;
  35. renv = infop->primary;
  36. ret = 0;
  37. MUTEX_LOCK(dbenv, &renv->mutex);
  38. if (renv->rep_off == INVALID_ROFF) {
  39. /* Must create the region. */
  40. if ((ret = __db_shalloc(infop->addr,
  41.     sizeof(REP), MUTEX_ALIGN, &rep)) != 0)
  42. goto err;
  43. memset(rep, 0, sizeof(*rep));
  44. rep->tally_off = INVALID_ROFF;
  45. renv->rep_off = R_OFFSET(infop, rep);
  46. if ((ret = __db_mutex_setup(dbenv, infop, &rep->mutex,
  47.     MUTEX_NO_RECORD)) != 0)
  48. goto err;
  49. /*
  50.  * We must create a place for the db_mutex separately;
  51.  * mutexes have to be aligned to MUTEX_ALIGN, and the only way
  52.  * to guarantee that is to make sure they're at the beginning
  53.  * of a shalloc'ed chunk.
  54.  */
  55. if ((ret = __db_shalloc(infop->addr, sizeof(DB_MUTEX),
  56.     MUTEX_ALIGN, &db_mutexp)) != 0)
  57. goto err;
  58. rep->db_mutex_off = R_OFFSET(infop, db_mutexp);
  59. /*
  60.  * Because we have no way to prevent deadlocks and cannot log
  61.  * changes made to it, we single-thread access to the client
  62.  * bookkeeping database.  This is suboptimal, but it only gets
  63.  * accessed when messages arrive out-of-order, so it should
  64.  * stay small and not be used in a high-performance app.
  65.  */
  66. if ((ret = __db_mutex_setup(dbenv, infop, db_mutexp,
  67.     MUTEX_NO_RECORD)) != 0)
  68. goto err;
  69. /* We have the region; fill in the values. */
  70. rep->eid = DB_EID_INVALID;
  71. rep->master_id = DB_EID_INVALID;
  72. rep->gen = 0;
  73. /*
  74.  * Set default values for the min and max log records that we
  75.  * wait before requesting a missing log record.
  76.  */
  77. rep->request_gap = DB_REP_REQUEST_GAP;
  78. rep->max_gap = DB_REP_MAX_GAP;
  79. } else
  80. rep = R_ADDR(infop, renv->rep_off);
  81. MUTEX_UNLOCK(dbenv, &renv->mutex);
  82. db_rep->mutexp = &rep->mutex;
  83. db_rep->db_mutexp = R_ADDR(infop, rep->db_mutex_off);
  84. db_rep->region = rep;
  85. return (0);
  86. err: MUTEX_UNLOCK(dbenv, &renv->mutex);
  87. return (ret);
  88. }
  89. /*
  90.  * __rep_region_destroy --
  91.  * Destroy any system resources allocated in the replication region.
  92.  *
  93.  * PUBLIC: int __rep_region_destroy __P((DB_ENV *));
  94.  */
  95. int
  96. __rep_region_destroy(dbenv)
  97. DB_ENV *dbenv;
  98. {
  99. DB_REP *db_rep;
  100. int ret, t_ret;
  101. ret = t_ret = 0;
  102. db_rep = (DB_REP *)dbenv->rep_handle;
  103. if (db_rep != NULL) {
  104. if (db_rep->mutexp != NULL)
  105. ret = __db_mutex_destroy(db_rep->mutexp);
  106. if (db_rep->db_mutexp != NULL)
  107. t_ret = __db_mutex_destroy(db_rep->db_mutexp);
  108. }
  109. return (ret == 0 ? t_ret : ret);
  110. }
  111. /*
  112.  * __rep_dbenv_close --
  113.  * Replication-specific destruction of the DB_ENV structure.
  114.  *
  115.  * PUBLIC: int __rep_dbenv_close __P((DB_ENV *));
  116.  */
  117. int
  118. __rep_dbenv_close(dbenv)
  119. DB_ENV *dbenv;
  120. {
  121. DB_REP *db_rep;
  122. db_rep = (DB_REP *)dbenv->rep_handle;
  123. if (db_rep != NULL) {
  124. __os_free(dbenv, db_rep);
  125. dbenv->rep_handle = NULL;
  126. }
  127. return (0);
  128. }
  129. /*
  130.  * __rep_preclose --
  131.  * If we are a client, shut down our client database and, if we're
  132.  * actually closing the environment, close all databases we've opened
  133.  * while applying messages.
  134.  *
  135.  * PUBLIC: int __rep_preclose __P((DB_ENV *, int));
  136.  */
  137. int
  138. __rep_preclose(dbenv, do_closefiles)
  139. DB_ENV *dbenv;
  140. int do_closefiles;
  141. {
  142. DB *dbp;
  143. DB_REP *db_rep;
  144. int ret, t_ret;
  145. ret = t_ret = 0;
  146. /* If replication is not initialized, we have nothing to do. */
  147. if ((db_rep = (DB_REP *)dbenv->rep_handle) == NULL)
  148. return (0);
  149. if ((dbp = db_rep->rep_db) != NULL) {
  150. MUTEX_LOCK(dbenv, db_rep->db_mutexp);
  151. ret = dbp->close(dbp, 0);
  152. db_rep->rep_db = NULL;
  153. MUTEX_UNLOCK(dbenv, db_rep->db_mutexp);
  154. }
  155. if (do_closefiles)
  156. t_ret = __dbreg_close_files(dbenv);
  157. return (ret == 0 ? t_ret : ret);
  158. }