r20919: add a function cluster_tdb_tmp_open() which can be used in a cluster
authorAndrew Tridgell <tridge@samba.org>
Sat, 20 Jan 2007 00:48:31 +0000 (00:48 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:43:52 +0000 (14:43 -0500)
environment for subsystems that have not yet been converted to use
ctdb to get a shared temporary tdb
(This used to be commit 0ed91384497aed6817b2220c31344bfcd45fd033)

source4/cluster/cluster.c
source4/cluster/cluster.h
source4/cluster/cluster_private.h
source4/cluster/ctdb/brlock_ctdb.c
source4/cluster/ctdb/ctdb_cluster.c
source4/cluster/local.c

index 0bd4649376ed2aaab903001a3b19036e101e0370..16de01de072641b3fca10a6569884b1fbf31db7d 100644 (file)
@@ -66,3 +66,13 @@ const char *cluster_id_string(TALLOC_CTX *mem_ctx, struct server_id id)
        cluster_init();
        return ops->cluster_id_string(ops, mem_ctx, id);
 }
+
+
+/*
+  open a temporary tdb in a cluster friendly manner
+*/
+struct tdb_wrap *cluster_tdb_tmp_open(TALLOC_CTX *mem_ctx, const char *dbname, int flags)
+{
+       cluster_init();
+       return ops->cluster_tdb_tmp_open(ops, mem_ctx, dbname, flags);
+}
index 54dfec6259d7d84822a9b5c728f3efc69d0fad52..f56a8e9bb6549fe43d80e64a7f01b579b528eecb 100644 (file)
@@ -31,6 +31,7 @@
 /* prototypes */
 struct server_id cluster_id(uint32_t id);
 const char *cluster_id_string(TALLOC_CTX *mem_ctx, struct server_id id);
+struct tdb_wrap *cluster_tdb_tmp_open(TALLOC_CTX *mem_ctx, const char *dbname, int flags);
 void *cluster_private(void);
 
 #endif
index e5df10060f4a960b2f5f12b021559ccc30302ce9..12d57badd08504a77f8ffadb540cd50390ce43cc 100644 (file)
@@ -27,6 +27,8 @@ struct cluster_ops {
        struct server_id (*cluster_id)(struct cluster_ops *ops, uint32_t id);
        const char *(*cluster_id_string)(struct cluster_ops *ops, 
                                         TALLOC_CTX *, struct server_id );
+       struct tdb_wrap *(*cluster_tdb_tmp_open)(struct cluster_ops *,
+                                                TALLOC_CTX *, const char *, int);
        void *private; /* backend state */
 };
 
index 00fcb0335a2463aa8c3bccb1dc16806fa0a833e1..0ae5c36094100cd0f70bf7784a65e8192af61f4b 100644 (file)
@@ -116,6 +116,9 @@ static struct brl_handle *brl_ctdb_create_handle(TALLOC_CTX *mem_ctx, struct ntv
                return NULL;
        }
 
+       DEBUG(0,("file_key\n"));
+       dump_data(0,file_key->data, file_key->length);
+
        brlh->key = *file_key;
        brlh->ntvfs = ntvfs;
        ZERO_STRUCT(brlh->last_lock);
index 183d5c18313e91a9b509034e67378b497c9241e3..0e7255f0604002f4ab7bcdf959d726cca8312c0c 100644 (file)
@@ -27,6 +27,7 @@
 #include "cluster/cluster_private.h"
 #include "lib/tdb/include/tdb.h"
 #include "cluster/ctdb/include/ctdb.h"
+#include "db_wrap.h"
 
 struct cluster_state {
        struct ctdb_context *ctdb;
@@ -55,9 +56,35 @@ static const char *ctdb_id_string(struct cluster_ops *ops,
        return talloc_asprintf(mem_ctx, "%u.%u", id.node, id.id);
 }
 
+/*
+  this is an interim method for subsystems that have not yet been
+  converted to use the ctdb api. It opens a shared database in the
+  cluster temporary area, using TDB_CLEAR_IF_FIRST which relies on
+  correct operation of fcntl locks on the shared fileystem.
+*/
+static struct tdb_wrap *ctdb_tdb_tmp_open(struct cluster_ops *ops,
+                                         TALLOC_CTX *mem_ctx, const char *dbname, 
+                                         int flags)
+{
+       const char *dir = lp_parm_string(-1, "ctdb", "shared data");
+       char *path;
+       struct tdb_wrap *w;
+       if (dir == NULL) {
+               DEBUG(0,("ERROR: You must set 'ctdb:shared data' to a cluster shared path\n"));
+               return NULL;
+       }
+       path = talloc_asprintf(mem_ctx, "%s/%s", dir, dbname);
+       w = tdb_wrap_open(mem_ctx, path, 0,  
+                         flags | TDB_CLEAR_IF_FIRST,
+                         O_RDWR|O_CREAT, 0600);
+       talloc_free(path);
+       return w;
+}
+
 static struct cluster_ops cluster_ctdb_ops = {
-       .cluster_id        = ctdb_id,
-       .cluster_id_string = ctdb_id_string,
+       .cluster_id           = ctdb_id,
+       .cluster_id_string    = ctdb_id_string,
+       .cluster_tdb_tmp_open = ctdb_tdb_tmp_open,
        .private           = NULL
 };
 
index 2e1ac2035f01914ad758266031fa704e2bb43b8a..28a0576accfebf7ed307a33104888137d91cadf8 100644 (file)
@@ -23,6 +23,9 @@
 #include "includes.h"
 #include "cluster/cluster.h"
 #include "cluster/cluster_private.h"
+#include "lib/tdb/include/tdb.h"
+#include "db_wrap.h"
+#include "system/filesys.h"
 
 /*
   server a server_id for the local node
@@ -45,10 +48,28 @@ static const char *local_id_string(struct cluster_ops *ops,
        return talloc_asprintf(mem_ctx, "%u.%u", id.node, id.id);
 }
 
+
+/*
+  open a tmp tdb for the local node. By using smbd_tmp_path() we don't need
+  TDB_CLEAR_IF_FIRST as the tmp path is wiped at startup
+*/
+static struct tdb_wrap *local_tdb_tmp_open(struct cluster_ops *ops,
+                                          TALLOC_CTX *mem_ctx, const char *dbname, 
+                                          int flags)
+{
+       char *path = smbd_tmp_path(mem_ctx, dbname);
+       struct tdb_wrap *w;
+       w = tdb_wrap_open(mem_ctx, path, 0, flags,
+                         O_RDWR|O_CREAT, 0600);
+       talloc_free(path);
+       return w;
+}
+
 static struct cluster_ops cluster_local_ops = {
-       .cluster_id        = local_id,
-       .cluster_id_string = local_id_string,
-       .private           = NULL
+       .cluster_id           = local_id,
+       .cluster_id_string    = local_id_string,
+       .cluster_tdb_tmp_open = local_tdb_tmp_open,
+       .private              = NULL
 };
 
 void cluster_local_init(void)