db_checkpoint.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996, 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char copyright[] =
  10.     "Copyright (c) 1996-2000nSleepycat Software Inc.  All rights reserved.n";
  11. static const char revid[] =
  12.     "$Id: db_checkpoint.c,v 11.25 2001/01/18 18:36:57 bostic Exp $";
  13. #endif
  14. #ifndef NO_SYSTEM_INCLUDES
  15. #include <sys/types.h>
  16. #if TIME_WITH_SYS_TIME
  17. #include <sys/time.h>
  18. #include <time.h>
  19. #else
  20. #if HAVE_SYS_TIME_H
  21. #include <sys/time.h>
  22. #else
  23. #include <time.h>
  24. #endif
  25. #endif
  26. #include <limits.h>
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <unistd.h>
  30. #endif
  31. #include "db_int.h"
  32. #include "db_page.h"
  33. #include "btree.h"
  34. #include "hash.h"
  35. #include "qam.h"
  36. #include "common_ext.h"
  37. #include "clib_ext.h"
  38. char *check __P((DB_ENV *, long, long));
  39. int  main __P((int, char *[]));
  40. void  usage __P((void));
  41. void  version_check __P((void));
  42. DB_ENV *dbenv;
  43. const char
  44. *progname = "db_checkpoint"; /* Program name. */
  45. int
  46. main(argc, argv)
  47. int argc;
  48. char *argv[];
  49. {
  50. extern char *optarg;
  51. extern int optind;
  52. time_t now;
  53. long argval;
  54. u_int32_t flags, kbytes, minutes, seconds;
  55. int ch, e_close, exitval, once, ret, verbose;
  56. char *home, *logfile;
  57. version_check();
  58. /*
  59.  * !!!
  60.  * Don't allow a fully unsigned 32-bit number, some compilers get
  61.  * upset and require it to be specified in hexadecimal and so on.
  62.  */
  63. #define MAX_UINT32_T 2147483647
  64. kbytes = minutes = 0;
  65. e_close = exitval = once = verbose = 0;
  66. flags = 0;
  67. home = logfile = NULL;
  68. while ((ch = getopt(argc, argv, "1h:k:L:p:Vv")) != EOF)
  69. switch (ch) {
  70. case '1':
  71. once = 1;
  72. flags = DB_FORCE;
  73. break;
  74. case 'h':
  75. home = optarg;
  76. break;
  77. case 'k':
  78. (void)__db_getlong(NULL, progname,
  79.     optarg, 1, (long)MAX_UINT32_T, &argval);
  80. kbytes = argval;
  81. break;
  82. case 'L':
  83. logfile = optarg;
  84. break;
  85. case 'p':
  86. (void)__db_getlong(NULL, progname,
  87.     optarg, 1, (long)MAX_UINT32_T, &argval);
  88. minutes = argval;
  89. break;
  90. case 'V':
  91. printf("%sn", db_version(NULL, NULL, NULL));
  92. exit(0);
  93. case 'v':
  94. verbose = 1;
  95. break;
  96. case '?':
  97. default:
  98. usage();
  99. goto shutdown;
  100. }
  101. argc -= optind;
  102. argv += optind;
  103. if (argc != 0)
  104. usage();
  105. if (once == 0 && kbytes == 0 && minutes == 0) {
  106. (void)fprintf(stderr,
  107.     "%s: at least one of -1, -k and -p must be specifiedn",
  108.     progname);
  109. exit (1);
  110. }
  111. /* Handle possible interruptions. */
  112. __db_util_siginit();
  113. /* Log our process ID. */
  114. if (logfile != NULL && __db_util_logset(progname, logfile))
  115. goto shutdown;
  116. /*
  117.  * Create an environment object and initialize it for error
  118.  * reporting.
  119.  */
  120. if ((ret = db_env_create(&dbenv, 0)) != 0) {
  121. fprintf(stderr,
  122.     "%s: db_env_create: %sn", progname, db_strerror(ret));
  123. goto shutdown;
  124. }
  125. e_close = 1;
  126. dbenv->set_errfile(dbenv, stderr);
  127. dbenv->set_errpfx(dbenv, progname);
  128. /* Initialize the environment. */
  129. if ((ret = dbenv->open(dbenv,
  130.     home, DB_JOINENV | DB_USE_ENVIRON, 0)) != 0) {
  131. dbenv->err(dbenv, ret, "open");
  132. goto shutdown;
  133. }
  134. /* Register the standard pgin/pgout functions, in case we do I/O. */
  135. if ((ret =
  136.     memp_register(dbenv, DB_FTYPE_SET, __db_pgin, __db_pgout)) != 0) {
  137. dbenv->err(dbenv, ret,
  138.     "failed to register access method functions");
  139. goto shutdown;
  140. }
  141. /*
  142.  * If we have only a time delay, then we'll sleep the right amount
  143.  * to wake up when a checkpoint is necessary.  If we have a "kbytes"
  144.  * field set, then we'll check every 30 seconds.
  145.  */
  146. seconds = kbytes != 0 ? 30 : minutes * 60;
  147. while (!__db_util_interrupted()) {
  148. if (verbose) {
  149. (void)time(&now);
  150. dbenv->errx(dbenv, "checkpoint: %s", ctime(&now));
  151. }
  152. ret = txn_checkpoint(dbenv, kbytes, minutes, flags);
  153. while (ret == DB_INCOMPLETE) {
  154. if (verbose)
  155. dbenv->errx(dbenv,
  156.     "checkpoint did not finish, retryingn");
  157. (void)__os_sleep(dbenv, 2, 0);
  158. ret = txn_checkpoint(dbenv, 0, 0, flags);
  159. }
  160. if (ret != 0) {
  161. dbenv->err(dbenv, ret, "txn_checkpoint");
  162. goto shutdown;
  163. }
  164. if (once)
  165. break;
  166. (void)__os_sleep(dbenv, seconds, 0);
  167. }
  168. if (0) {
  169. shutdown: exitval = 1;
  170. }
  171. /* Clean up the logfile. */
  172. if (logfile != NULL)
  173. remove(logfile);
  174. /* Clean up the environment. */
  175. if (e_close && (ret = dbenv->close(dbenv, 0)) != 0) {
  176. exitval = 1;
  177. fprintf(stderr,
  178.     "%s: dbenv->close: %sn", progname, db_strerror(ret));
  179. }
  180. /* Resend any caught signal. */
  181. __db_util_sigresend();
  182. return (exitval);
  183. }
  184. void
  185. usage()
  186. {
  187. (void)fprintf(stderr,
  188.     "usage: db_checkpoint [-1Vv] [-h home] [-k kbytes] [-L file] [-p min]n");
  189. exit(1);
  190. }
  191. void
  192. version_check()
  193. {
  194. int v_major, v_minor, v_patch;
  195. /* Make sure we're loaded with the right version of the DB library. */
  196. (void)db_version(&v_major, &v_minor, &v_patch);
  197. if (v_major != DB_VERSION_MAJOR ||
  198.     v_minor != DB_VERSION_MINOR || v_patch != DB_VERSION_PATCH) {
  199. fprintf(stderr,
  200. "%s: version %d.%d.%d doesn't match library version %d.%d.%dn",
  201.     progname, DB_VERSION_MAJOR, DB_VERSION_MINOR,
  202.     DB_VERSION_PATCH, v_major, v_minor, v_patch);
  203. exit (1);
  204. }
  205. }