1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

r20919: add a function cluster_tdb_tmp_open() which can be used in a cluster

environment for subsystems that have not yet been converted to use
ctdb to get a shared temporary tdb
This commit is contained in:
Andrew Tridgell 2007-01-20 00:48:31 +00:00 committed by Gerald (Jerry) Carter
parent 4bf741b567
commit 0ed9138449
6 changed files with 69 additions and 5 deletions

View 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);
}

View 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

View 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 */
};

View 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);

View 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
};

View 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)