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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1999-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: tcl_rep.c,v 11.85 2002/08/06 04:45:44 bostic Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <tcl.h>
  16. #endif
  17. #include "db_int.h"
  18. #include "dbinc/tcl_db.h"
  19. #if CONFIG_TEST
  20. /*
  21.  * tcl_RepElect --
  22.  * Call DB_ENV->rep_elect().
  23.  *
  24.  * PUBLIC: int tcl_RepElect
  25.  * PUBLIC:     __P((Tcl_Interp *, int, Tcl_Obj * CONST *, DB_ENV *));
  26.  */
  27. int
  28. tcl_RepElect(interp, objc, objv, dbenv)
  29. Tcl_Interp *interp; /* Interpreter */
  30. int objc; /* How many arguments? */
  31. Tcl_Obj *CONST objv[]; /* The argument objects */
  32. DB_ENV *dbenv; /* Environment pointer */
  33. {
  34. int eid, nsites, pri, result, ret;
  35. u_int32_t timeout;
  36. if (objc != 5) {
  37. Tcl_WrongNumArgs(interp, 5, objv, "nsites pri timeout");
  38. return (TCL_ERROR);
  39. }
  40. if ((result = Tcl_GetIntFromObj(interp, objv[2], &nsites)) != TCL_OK)
  41. return (result);
  42. if ((result = Tcl_GetIntFromObj(interp, objv[3], &pri)) != TCL_OK)
  43. return (result);
  44. if ((result = _GetUInt32(interp, objv[4], &timeout)) != TCL_OK)
  45. return (result);
  46. _debug_check();
  47. if ((ret = dbenv->rep_elect(dbenv, nsites, pri, timeout, &eid)) != 0)
  48. return (_ReturnSetup(interp, ret, DB_RETOK_STD(ret),
  49.     "env rep_elect"));
  50. Tcl_SetObjResult(interp, Tcl_NewIntObj(eid));
  51. return (TCL_OK);
  52. }
  53. #endif
  54. #if CONFIG_TEST
  55. /*
  56.  * tcl_RepFlush --
  57.  * Call DB_ENV->rep_flush().
  58.  *
  59.  * PUBLIC: int tcl_RepFlush
  60.  * PUBLIC:     __P((Tcl_Interp *, int, Tcl_Obj * CONST *, DB_ENV *));
  61.  */
  62. int
  63. tcl_RepFlush(interp, objc, objv, dbenv)
  64. Tcl_Interp *interp;
  65. int objc;
  66. Tcl_Obj *CONST objv[];
  67. DB_ENV *dbenv;
  68. {
  69. int ret;
  70. if (objc != 2) {
  71. Tcl_WrongNumArgs(interp, 2, objv, "");
  72. return TCL_ERROR;
  73. }
  74. _debug_check();
  75. ret = dbenv->rep_flush(dbenv);
  76. return (_ReturnSetup(interp, ret, DB_RETOK_STD(ret), "env rep_flush"));
  77. }
  78. #endif
  79. #if CONFIG_TEST
  80. /*
  81.  * tcl_RepLimit --
  82.  * Call DB_ENV->set_rep_limit().
  83.  *
  84.  * PUBLIC: int tcl_RepLimit
  85.  * PUBLIC:     __P((Tcl_Interp *, int, Tcl_Obj * CONST *, DB_ENV *));
  86.  */
  87. int
  88. tcl_RepLimit(interp, objc, objv, dbenv)
  89. Tcl_Interp *interp; /* Interpreter */
  90. int objc; /* How many arguments? */
  91. Tcl_Obj *CONST objv[]; /* The argument objects */
  92. DB_ENV *dbenv; /* Environment pointer */
  93. {
  94. int result, ret;
  95. u_int32_t bytes, gbytes;
  96. if (objc != 4) {
  97. Tcl_WrongNumArgs(interp, 4, objv, "gbytes bytes");
  98. return (TCL_ERROR);
  99. }
  100. if ((result = _GetUInt32(interp, objv[2], &gbytes)) != TCL_OK)
  101. return (result);
  102. if ((result = _GetUInt32(interp, objv[3], &bytes)) != TCL_OK)
  103. return (result);
  104. _debug_check();
  105. if ((ret = dbenv->set_rep_limit(dbenv, gbytes, bytes)) != 0)
  106. return (_ReturnSetup(interp, ret, DB_RETOK_STD(ret),
  107.     "env set_rep_limit"));
  108. return (_ReturnSetup(interp,
  109.     ret, DB_RETOK_STD(ret), "env set_rep_limit"));
  110. }
  111. #endif
  112. #if CONFIG_TEST
  113. /*
  114.  * tcl_RepRequest --
  115.  * Call DB_ENV->set_rep_request().
  116.  *
  117.  * PUBLIC: int tcl_RepRequest
  118.  * PUBLIC:     __P((Tcl_Interp *, int, Tcl_Obj * CONST *, DB_ENV *));
  119.  */
  120. int
  121. tcl_RepRequest(interp, objc, objv, dbenv)
  122. Tcl_Interp *interp; /* Interpreter */
  123. int objc; /* How many arguments? */
  124. Tcl_Obj *CONST objv[]; /* The argument objects */
  125. DB_ENV *dbenv; /* Environment pointer */
  126. {
  127. int result, ret;
  128. u_int32_t min, max;
  129. if (objc != 4) {
  130. Tcl_WrongNumArgs(interp, 4, objv, "min max");
  131. return (TCL_ERROR);
  132. }
  133. if ((result = _GetUInt32(interp, objv[2], &min)) != TCL_OK)
  134. return (result);
  135. if ((result = _GetUInt32(interp, objv[3], &max)) != TCL_OK)
  136. return (result);
  137. _debug_check();
  138. if ((ret = dbenv->set_rep_request(dbenv, min, max)) != 0)
  139. return (_ReturnSetup(interp, ret, DB_RETOK_STD(ret),
  140.     "env set_rep_request"));
  141. return (_ReturnSetup(interp,
  142.     ret, DB_RETOK_STD(ret), "env set_rep_request"));
  143. }
  144. #endif
  145. #if CONFIG_TEST
  146. /*
  147.  * tcl_RepStart --
  148.  * Call DB_ENV->rep_start().
  149.  *
  150.  * PUBLIC: int tcl_RepStart
  151.  * PUBLIC:     __P((Tcl_Interp *, int, Tcl_Obj * CONST *, DB_ENV *));
  152.  *
  153.  * Note that this normally can/should be achieved as an argument to
  154.  * berkdb env, but we need to test forcible upgrading of clients, which
  155.  * involves calling this on an open environment handle.
  156.  */
  157. int
  158. tcl_RepStart(interp, objc, objv, dbenv)
  159. Tcl_Interp *interp; /* Interpreter */
  160. int objc; /* How many arguments? */
  161. Tcl_Obj *CONST objv[]; /* The argument objects */
  162. DB_ENV *dbenv;
  163. {
  164. static char *tclrpstrt[] = {
  165. "-client",
  166. "-master",
  167. NULL
  168. };
  169. enum tclrpstrt {
  170. TCL_RPSTRT_CLIENT,
  171. TCL_RPSTRT_MASTER
  172. };
  173. char *arg;
  174. int i, optindex, ret;
  175. u_int32_t flag;
  176. flag = 0;
  177. if (objc != 3) {
  178. Tcl_WrongNumArgs(interp, 3, objv, "[-master/-client]");
  179. return (TCL_ERROR);
  180. }
  181. i = 2;
  182. while (i < objc) {
  183. if (Tcl_GetIndexFromObj(interp, objv[i], tclrpstrt,
  184.     "option", TCL_EXACT, &optindex) != TCL_OK) {
  185. arg = Tcl_GetStringFromObj(objv[i], NULL);
  186. if (arg[0] == '-')
  187. return (IS_HELP(objv[i]));
  188. else
  189. Tcl_ResetResult(interp);
  190. break;
  191. }
  192. i++;
  193. switch ((enum tclrpstrt)optindex) {
  194. case TCL_RPSTRT_CLIENT:
  195. flag |= DB_REP_CLIENT;
  196. break;
  197. case TCL_RPSTRT_MASTER:
  198. flag |= DB_REP_MASTER;
  199. break;
  200. }
  201. }
  202. _debug_check();
  203. ret = dbenv->rep_start(dbenv, NULL, flag);
  204. return (_ReturnSetup(interp, ret, DB_RETOK_STD(ret), "env rep_start"));
  205. }
  206. #endif
  207. #if CONFIG_TEST
  208. /*
  209.  * tcl_RepProcessMessage --
  210.  * Call DB_ENV->rep_process_message().
  211.  *
  212.  * PUBLIC: int tcl_RepProcessMessage
  213.  * PUBLIC:     __P((Tcl_Interp *, int, Tcl_Obj * CONST *, DB_ENV *));
  214.  */
  215. int
  216. tcl_RepProcessMessage(interp, objc, objv, dbenv)
  217. Tcl_Interp *interp; /* Interpreter */
  218. int objc; /* How many arguments? */
  219. Tcl_Obj *CONST objv[]; /* The argument objects */
  220. DB_ENV *dbenv; /* Environment pointer */
  221. {
  222. DBT control, rec;
  223. Tcl_Obj *res;
  224. void *ctmp, *rtmp;
  225. int eid;
  226. int freectl, freerec, result, ret;
  227. if (objc != 5) {
  228. Tcl_WrongNumArgs(interp, 5, objv, "id control rec");
  229. return (TCL_ERROR);
  230. }
  231. freectl = freerec = 0;
  232. memset(&control, 0, sizeof(control));
  233. memset(&rec, 0, sizeof(rec));
  234. if ((result = Tcl_GetIntFromObj(interp, objv[2], &eid)) != TCL_OK)
  235. return (result);
  236. ret = _CopyObjBytes(interp, objv[3], &ctmp,
  237.     &control.size, &freectl);
  238. if (ret != 0) {
  239. result = _ReturnSetup(interp, ret,
  240.     DB_RETOK_REPPMSG(ret), "rep_proc_msg");
  241. return (result);
  242. }
  243. control.data = ctmp;
  244. ret = _CopyObjBytes(interp, objv[4], &rtmp,
  245.     &rec.size, &freerec);
  246. if (ret != 0) {
  247. result = _ReturnSetup(interp, ret,
  248.     DB_RETOK_REPPMSG(ret), "rep_proc_msg");
  249. goto out;
  250. }
  251. rec.data = rtmp;
  252. _debug_check();
  253. ret = dbenv->rep_process_message(dbenv, &control, &rec, &eid);
  254. result = _ReturnSetup(interp, ret, DB_RETOK_REPPMSG(ret),
  255.     "env rep_process_message");
  256. /*
  257.  * If we have a new master, return its environment ID.
  258.  *
  259.  * XXX
  260.  * We should do something prettier to differentiate success
  261.  * from an env ID, and figure out how to represent HOLDELECTION.
  262.  */
  263. if (result == TCL_OK && ret == DB_REP_NEWMASTER) {
  264. res = Tcl_NewIntObj(eid);
  265. Tcl_SetObjResult(interp, res);
  266. }
  267. out:
  268. if (freectl)
  269. (void)__os_free(NULL, ctmp);
  270. if (freerec)
  271. (void)__os_free(NULL, rtmp);
  272. return (result);
  273. }
  274. #endif
  275. #if CONFIG_TEST
  276. /*
  277.  * tcl_RepStat --
  278.  * Call DB_ENV->rep_stat().
  279.  *
  280.  * PUBLIC: int tcl_RepStat
  281.  * PUBLIC:     __P((Tcl_Interp *, int, Tcl_Obj * CONST *, DB_ENV *));
  282.  */
  283. int
  284. tcl_RepStat(interp, objc, objv, dbenv)
  285. Tcl_Interp *interp; /* Interpreter */
  286. int objc; /* How many arguments? */
  287. Tcl_Obj *CONST objv[]; /* The argument objects */
  288. DB_ENV *dbenv;
  289. {
  290. DB_REP_STAT *sp;
  291. Tcl_Obj *myobjv[2], *res, *thislist, *lsnlist;
  292. u_int32_t flag;
  293. int myobjc, result, ret;
  294. char *arg;
  295. result = TCL_OK;
  296. flag = 0;
  297. if (objc > 3) {
  298. Tcl_WrongNumArgs(interp, 2, objv, NULL);
  299. return (TCL_ERROR);
  300. }
  301. if (objc == 3) {
  302. arg = Tcl_GetStringFromObj(objv[2], NULL);
  303. if (strcmp(arg, "-clear") == 0)
  304. flag = DB_STAT_CLEAR;
  305. else {
  306. Tcl_SetResult(interp,
  307.     "db stat: unknown arg", TCL_STATIC);
  308. return (TCL_ERROR);
  309. }
  310. }
  311. _debug_check();
  312. ret = dbenv->rep_stat(dbenv, &sp, flag);
  313. result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret),
  314.     "rep stat");
  315. if (result == TCL_ERROR)
  316. return (result);
  317. /*
  318.  * Have our stats, now construct the name value
  319.  * list pairs and free up the memory.
  320.  */
  321. res = Tcl_NewObj();
  322. /*
  323.  * MAKE_STAT_* assumes 'res' and 'error' label.
  324.  */
  325. MAKE_STAT_LSN("Next LSN expected", &sp->st_next_lsn);
  326. MAKE_STAT_LSN("First missed LSN", &sp->st_waiting_lsn);
  327. MAKE_STAT_LIST("Duplicate master conditions", sp->st_dupmasters);
  328. MAKE_STAT_LIST("Environment ID", sp->st_env_id);
  329. MAKE_STAT_LIST("Environment priority", sp->st_env_priority);
  330. MAKE_STAT_LIST("Generation number", sp->st_gen);
  331. MAKE_STAT_LIST("Duplicate log records received", sp->st_log_duplicated);
  332. MAKE_STAT_LIST("Current log records queued", sp->st_log_queued);
  333. MAKE_STAT_LIST("Maximum log records queued", sp->st_log_queued_max);
  334. MAKE_STAT_LIST("Total log records queued", sp->st_log_queued_total);
  335. MAKE_STAT_LIST("Log records received", sp->st_log_records);
  336. MAKE_STAT_LIST("Log records requested", sp->st_log_requested);
  337. MAKE_STAT_LIST("Master environment ID", sp->st_master);
  338. MAKE_STAT_LIST("Master changes", sp->st_master_changes);
  339. MAKE_STAT_LIST("Messages with bad generation number",
  340.     sp->st_msgs_badgen);
  341. MAKE_STAT_LIST("Messages processed", sp->st_msgs_processed);
  342. MAKE_STAT_LIST("Messages ignored for recovery", sp->st_msgs_recover);
  343. MAKE_STAT_LIST("Message send failures", sp->st_msgs_send_failures);
  344. MAKE_STAT_LIST("Messages sent", sp->st_msgs_sent);
  345. MAKE_STAT_LIST("New site messages", sp->st_newsites);
  346. MAKE_STAT_LIST("Transmission limited", sp->st_nthrottles);
  347. MAKE_STAT_LIST("Outdated conditions", sp->st_outdated);
  348. MAKE_STAT_LIST("Transactions applied", sp->st_txns_applied);
  349. MAKE_STAT_LIST("Elections held", sp->st_elections);
  350. MAKE_STAT_LIST("Elections won", sp->st_elections_won);
  351. MAKE_STAT_LIST("Election phase", sp->st_election_status);
  352. MAKE_STAT_LIST("Election winner", sp->st_election_cur_winner);
  353. MAKE_STAT_LIST("Election generation number", sp->st_election_gen);
  354. MAKE_STAT_LSN("Election max LSN", &sp->st_election_lsn);
  355. MAKE_STAT_LIST("Election sites", sp->st_election_nsites);
  356. MAKE_STAT_LIST("Election priority", sp->st_election_priority);
  357. MAKE_STAT_LIST("Election tiebreaker", sp->st_election_tiebreaker);
  358. MAKE_STAT_LIST("Election votes", sp->st_election_votes);
  359. Tcl_SetObjResult(interp, res);
  360. error:
  361. free(sp);
  362. return (result);
  363. }
  364. #endif