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 06:15:36 +0000 (16:15 +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>
(cherry picked from commit 2fc6b6403707a292d134140fc0b9145b454992c5)

client/ctdb_client.c

index 7782369bcaa7d913a6e60a743862e0db7fd84400..cfabdaf83b39ca283cdc389cdeb0901f144898f0 100644 (file)
@@ -1738,11 +1738,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);