3 This test just fetch_locks a record bumps the RSN and then writes new content
5 Copyright (C) Ronnie Sahlberg 2009
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, see <http://www.gnu.org/licenses/>.
22 #include "system/filesys.h"
25 #include "ctdb_private.h"
27 static struct ctdb_db_context
*ctdb_db
;
29 #define TESTKEY "testkey"
33 Just try locking/unlocking a single record once
35 static void fetch_lock_once(struct ctdb_context
*ctdb
, struct event_context
*ev
, uint32_t generation
)
37 TALLOC_CTX
*tmp_ctx
= talloc_new(ctdb
);
39 struct ctdb_record_handle
*h
;
40 struct ctdb_ltdb_header
*header
;
43 key
.dptr
= discard_const(TESTKEY
);
44 key
.dsize
= strlen(TESTKEY
);
46 printf("Trying to fetch lock the record ...\n");
48 h
= ctdb_fetch_lock(ctdb_db
, tmp_ctx
, key
, &data
);
50 printf("Failed to fetch record '%s' on node %d\n",
51 (const char *)key
.dptr
, ctdb_get_pnn(ctdb
));
56 printf("Record fetchlocked.\n");
57 header
= talloc_memdup(tmp_ctx
, ctdb_header_from_record_handle(h
), sizeof(*header
));
58 printf("RSN:%d\n", (int)header
->rsn
);
60 printf("Record released.\n");
62 printf("Write new record with RSN+10\n");
64 data
.dptr
= (void *)talloc_asprintf(tmp_ctx
, "%d", (int)header
->rsn
);
65 data
.dsize
= strlen((char *)data
.dptr
);
67 ret
= ctdb_ctrl_updaterecord(ctdb
, ctdb
, timeval_zero(), CTDB_CURRENT_NODE
, ctdb_db
, key
, header
, data
);
69 printf("Failed to writerecord, ret==%d\n", ret
);
73 printf("re-fetch the record\n");
74 h
= ctdb_fetch_lock(ctdb_db
, tmp_ctx
, key
, &data
);
76 printf("Failed to fetch record '%s' on node %d\n",
77 (const char *)key
.dptr
, ctdb_get_pnn(ctdb
));
82 printf("Record fetchlocked.\n");
83 header
= talloc_memdup(tmp_ctx
, ctdb_header_from_record_handle(h
), sizeof(*header
));
84 printf("RSN:%d\n", (int)header
->rsn
);
86 printf("Record released.\n");
94 int main(int argc
, const char *argv
[])
96 struct ctdb_context
*ctdb
;
98 struct poptOption popt_options
[] = {
104 const char **extra_argv
;
107 struct event_context
*ev
;
108 struct ctdb_vnn_map
*vnnmap
=NULL
;
110 pc
= poptGetContext(argv
[0], argc
, argv
, popt_options
, POPT_CONTEXT_KEEP_FIRST
);
112 while ((opt
= poptGetNextOpt(pc
)) != -1) {
115 fprintf(stderr
, "Invalid option %s: %s\n",
116 poptBadOption(pc
, 0), poptStrerror(opt
));
121 /* setup the remaining options for the main program to use */
122 extra_argv
= poptGetArgs(pc
);
125 while (extra_argv
[extra_argc
]) extra_argc
++;
128 ev
= event_context_init(NULL
);
130 ctdb
= ctdb_cmdline_client(ev
, timeval_current_ofs(5, 0));
135 /* attach to a specific database */
136 ctdb_db
= ctdb_attach(ctdb
, timeval_current_ofs(5, 0), "test.tdb", false, 0);
138 printf("ctdb_attach failed - %s\n", ctdb_errstr(ctdb
));
142 printf("Waiting for cluster\n");
145 ctdb_ctrl_getrecmode(ctdb
, ctdb
, timeval_zero(), CTDB_CURRENT_NODE
, &recmode
);
146 if (recmode
== 0) break;
151 if (ctdb_ctrl_getvnnmap(ctdb
, timeval_zero(), CTDB_CURRENT_NODE
, ctdb
, &vnnmap
) != 0) {
152 printf("Unable to get vnnmap from local node\n");
155 printf("Current Generation %d\n", (int)vnnmap
->generation
);
157 fetch_lock_once(ctdb
, ev
, vnnmap
->generation
);