recoverd: Use TDB_INCOMPATIBLE_HASH when creating volatile databases
authorAmitay Isaacs <amitay@gmail.com>
Tue, 13 Aug 2013 04:02:46 +0000 (14:02 +1000)
committerAmitay Isaacs <amitay@gmail.com>
Wed, 14 Aug 2013 05:54:48 +0000 (15:54 +1000)
When creating missing databases either locally or remotely, recovery
master calls ctdb_ctrl_createdb().  Recovery master always passes 0
for tdb_flags.  For volatile databases, if TDB_INCOMPATIBLE_HASH is not
specified, then they will be attached without using jenkins hash causing
database corruption.

Signed-off-by: Amitay Isaacs <amitay@gmail.com>
(This used to be ctdb commit 2fc6b6403707a292d134140fc0b9145b454992c5)

ctdb/client/ctdb_client.c

index e801c0138eebdb91e2ab684f6719706a3d77b50c..764404edfddfcc1b7f949e516a223b9e0c918039 100644 (file)
@@ -1787,11 +1787,17 @@ int ctdb_ctrl_createdb(struct ctdb_context *ctdb, struct timeval timeout, uint32
        int ret;
        int32_t res;
        TDB_DATA data;
+       uint64_t tdb_flags = 0;
 
        data.dptr = discard_const(name);
        data.dsize = strlen(name)+1;
 
-       ret = ctdb_control(ctdb, destnode, 0, 
+       /* Make sure that volatile databases use jenkins hash */
+       if (!persistent) {
+               tdb_flags = TDB_INCOMPATIBLE_HASH;
+       }
+
+       ret = ctdb_control(ctdb, destnode, tdb_flags,
                           persistent?CTDB_CONTROL_DB_ATTACH_PERSISTENT:CTDB_CONTROL_DB_ATTACH, 
                           0, data, 
                           mem_ctx, &data, &res, &timeout, NULL);