2 #include "tdb1-lock-tracking.h"
3 #define fcntl fcntl_with_lockcheck1
4 #include "tdb2-source.h"
5 #include <ccan/tap/tap.h>
6 #undef fcntl_with_lockcheck
10 #include "tdb1-external-agent.h"
13 static struct agent
*agent
;
15 static bool correct_key(TDB_DATA key
)
17 return key
.dsize
== strlen("hi")
18 && memcmp(key
.dptr
, "hi", key
.dsize
) == 0;
21 static bool correct_data(TDB_DATA data
)
23 return data
.dsize
== strlen("world")
24 && memcmp(data
.dptr
, "world", data
.dsize
) == 0;
27 static int traverse(struct tdb_context
*tdb
, TDB_DATA key
, TDB_DATA data
,
30 ok1(correct_key(key
));
31 ok1(correct_data(data
));
35 int main(int argc
, char *argv
[])
37 struct tdb_context
*tdb
;
39 union tdb_attribute hsize
;
41 hsize
.base
.attr
= TDB_ATTRIBUTE_TDB1_HASHSIZE
;
42 hsize
.base
.next
= &tap_log_attr
;
43 hsize
.tdb1_hashsize
.hsize
= 1024;
46 agent
= prepare_external_agent1();
48 err(1, "preparing agent");
50 tdb
= tdb1_open("run-traverse-in-transaction.tdb",
51 TDB_DEFAULT
, O_CREAT
|O_TRUNC
|O_RDWR
,
55 key
.dsize
= strlen("hi");
56 key
.dptr
= (void *)"hi";
57 data
.dptr
= (void *)"world";
58 data
.dsize
= strlen("world");
60 ok1(tdb1_store(tdb
, key
, data
, TDB_INSERT
) == 0);
62 ok1(external_agent_operation1(agent
, OPEN
, tdb
->name
) == SUCCESS
);
64 ok1(tdb1_transaction_start(tdb
) == 0);
65 ok1(external_agent_operation1(agent
, TRANSACTION_START
, tdb
->name
)
66 == WOULD_HAVE_BLOCKED
);
67 tdb1_traverse(tdb
, traverse
, NULL
);
69 /* That should *not* release the transaction lock! */
70 ok1(external_agent_operation1(agent
, TRANSACTION_START
, tdb
->name
)
71 == WOULD_HAVE_BLOCKED
);
72 tdb1_traverse_read(tdb
, traverse
, NULL
);
74 /* That should *not* release the transaction lock! */
75 ok1(external_agent_operation1(agent
, TRANSACTION_START
, tdb
->name
)
76 == WOULD_HAVE_BLOCKED
);
77 ok1(tdb1_transaction_commit(tdb
) == 0);
78 /* Now we should be fine. */
79 ok1(external_agent_operation1(agent
, TRANSACTION_START
, tdb
->name
)