]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librados, rados.py: rados_create2: add clustername and future flags
authorDan Mick <dan.mick@inktank.com>
Thu, 6 Jun 2013 01:11:51 +0000 (18:11 -0700)
committerDan Mick <dan.mick@inktank.com>
Fri, 7 Jun 2013 01:41:15 +0000 (18:41 -0700)
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 <dan.mick@inktank.com>
src/include/rados/librados.h
src/include/rados/librados.hpp
src/librados/librados.cc
src/pybind/rados.py

index bb86d5b4a49eff4f30054ea5792b634278af207a..7e40021c45db841ba790b01bfd97d05bc045013c 100644 (file)
@@ -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.
index 8ed8c5ddcfcc5e8ef65092b6a37fb54de14e30ec..8768d4438379ed5f522c5ebbe5f02856266ed24f 100644 (file)
@@ -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();
index 6901a0c5b1a3a66dd385204a73b95f822042ae9d..2ba7ee3d24977e1fb2b38498ea50c3701b9f21ca 100644 (file)
@@ -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.
index 02e0969b5ab584f02fbe39dffe056a6741007938..bc8b1b5a5e400f87757b67068986a3259c165706 100644 (file)
@@ -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)