From 366de90de175ab3f088931ebbdff173d97ff4f71 Mon Sep 17 00:00:00 2001 From: Dan Mick Date: Wed, 5 Jun 2013 18:11:51 -0700 Subject: [PATCH] librados, rados.py: rados_create2: add clustername and future flags rados.py also gets "conf_defaults" dict for things you might want to default in your app differently before ceph.conf gets to them; currently used for ceph CLI to be able to set log_to_stderr/err_to_stderr true, among others. Signed-off-by: Dan Mick --- src/include/rados/librados.h | 9 ++++++--- src/include/rados/librados.hpp | 3 ++- src/librados/librados.cc | 28 ++++++++++++++++++++-------- src/pybind/rados.py | 18 +++++++++++------- 4 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h index bb86d5b4a49ef..7e40021c45db8 100644 --- a/src/include/rados/librados.h +++ b/src/include/rados/librados.h @@ -198,10 +198,13 @@ void rados_version(int *major, int *minor, int *extra); int rados_create(rados_t *cluster, const char * const id); /** - * As in rados_create, but don't assume 'client.'+id; allow full - * specification of name + * Like rados_create, but + * 1) don't assume 'client.'+id; allow full specification of name + * 2) allow specification of cluster name + * 3) flags for future expansion */ -int rados_create2(rados_t *cluster, const char * const name); +int rados_create2(rados_t *pcluster, const char *const clustername, + const char * const name, uint64_t flags); /** * Initialize a cluster handle from an existing configuration. diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index 8ed8c5ddcfcc5..8768d4438379e 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -649,7 +649,8 @@ namespace librados ~Rados(); int init(const char * const id); - int init2(const char * const name); + int init2(const char * const name, const char * const clustername, + uint64_t flags); int init_with_context(config_t cct_); config_t cct(); int connect(); diff --git a/src/librados/librados.cc b/src/librados/librados.cc index 6901a0c5b1a3a..2ba7ee3d24977 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -1203,9 +1203,10 @@ int librados::Rados::init(const char * const id) return rados_create((rados_t *)&client, id); } -int librados::Rados::init2(const char * const name) +int librados::Rados::init2(const char * const name, + const char * const clustername, uint64_t flags) { - return rados_create2((rados_t *)&client, name); + return rados_create2((rados_t *)&client, clustername, name, flags); } int librados::Rados::init_with_context(config_t cct_) @@ -1463,9 +1464,15 @@ librados::ObjectOperation::~ObjectOperation() ///////////////////////////// C API ////////////////////////////// static -int rados_create_common(rados_t *pcluster, CephInitParameters *iparams) +int rados_create_common(rados_t *pcluster, + const char * const clustername, + CephInitParameters *iparams) { + // missing things compared to global_init: + // g_ceph_context, g_conf, g_lockdep, signal handlers CephContext *cct = common_preinit(*iparams, CODE_ENVIRONMENT_LIBRARY, 0); + if (clustername) + cct->_conf->cluster = clustername; cct->_conf->parse_env(); // environment variables override cct->_conf->apply_changes(NULL); @@ -1482,21 +1489,26 @@ extern "C" int rados_create(rados_t *pcluster, const char * const id) if (id) { iparams.name.set(CEPH_ENTITY_TYPE_CLIENT, id); } - return rados_create_common(pcluster, &iparams); + return rados_create_common(pcluster, "ceph", &iparams); } -// as above, but don't assume 'client.'; name is a full type.id namestr -extern "C" int rados_create2(rados_t *pcluster, const char * const name) +// as above, but +// 1) don't assume 'client.'; name is a full type.id namestr +// 2) allow setting clustername +// 3) flags is for future expansion (maybe some of the global_init() +// behavior is appropriate for some consumers of librados, for instance) + +extern "C" int rados_create2(rados_t *pcluster, const char *const clustername, + const char * const name, uint64_t flags) { // client is assumed, but from_str will override CephInitParameters iparams(CEPH_ENTITY_TYPE_CLIENT); if (name) { iparams.name.from_str(name); } - return rados_create_common(pcluster, &iparams); + return rados_create_common(pcluster, clustername, &iparams); } - /* This function is intended for use by Ceph daemons. These daemons have * already called global_init and want to use that particular configuration for * their cluster. diff --git a/src/pybind/rados.py b/src/pybind/rados.py index 02e0969b5ab58..bc8b1b5a5e400 100644 --- a/src/pybind/rados.py +++ b/src/pybind/rados.py @@ -182,30 +182,34 @@ class Rados(object): raise RadosStateError("You cannot perform that operation on a \ Rados object in state %s." % (self.state)) - def __init__(self, rados_id=None, conf=None, conffile=None, name=None): + def __init__(self, rados_id=None, name=None, clustername='ceph', + conf_defaults=None, conffile=None, conf=None, flags=0): self.librados = CDLL('librados.so.2') self.cluster = c_void_p() self.rados_id = rados_id if rados_id and not isinstance(rados_id, str): raise TypeError('rados_id must be a string or None') - if conffile and not isinstance(conffile, str): + if conffile is not None and not isinstance(conffile, str): raise TypeError('conffile must be a string or None') if rados_id and name: raise Error("Rados(): can't supply both rados_id and name") - fn = self.librados.rados_create - if name: - fn = self.librados.rados_create2 - ret = run_in_thread(fn, (byref(self.cluster), c_char_p(rados_id))) + ret = run_in_thread(self.librados.rados_create2, + (byref(self.cluster), c_char_p(clustername), + c_char_p(rados_id), c_uint64(flags))) if ret != 0: raise Error("rados_initialize failed with error code: %d" % ret) self.state = "configuring" + # order is important: conf_defaults, then conffile, then conf + if conf_defaults: + for key, value in conf_defaults.iteritems(): + self.conf_set(key, value) if conffile is not None: # read the default conf file when '' is given if conffile == '': conffile = None self.conf_read_file(conffile) - if conf is not None: + if conf: for key, value in conf.iteritems(): self.conf_set(key, value) -- 2.39.5