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:
parent
4bf741b567
commit
0ed9138449
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user