]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph, librados, rados.py, librados tests: pass cmd as array
authorDan Mick <dan.mick@inktank.com>
Fri, 7 Jun 2013 00:40:28 +0000 (17:40 -0700)
committerDan Mick <dan.mick@inktank.com>
Fri, 7 Jun 2013 01:46:53 +0000 (18:46 -0700)
Using ceph to pass commands to the old monitor requires the
message to have words in a vector; this means that we need to pass
the command as an array to rados_mon_command.  Really, all of the
rados_X_command functions should take an array for flexibility and
parallel structure, so change them all, and the Python bindings,
and the test programs that use them.

Signed-off-by: Dan Mick <dan.mick@inktank.com>
src/ceph
src/include/rados/librados.h
src/librados/librados.cc
src/pybind/rados.py
src/test/librados/cmd.cc

index c045220b32434c38de15e48ff659a338f0f877aa..678d8348486058b40d8597f29eff2abe415bbb4b 100755 (executable)
--- a/src/ceph
+++ b/src/ceph
@@ -1455,8 +1455,7 @@ def main():
         # send command to old monitor
         if verbose:
             print '{0} to old monitor'.format(' '.join(childargs))
-        ret, outbuf, outs = cluster_handle.mon_command(' '.join(childargs),
-                                                       inbuf)
+        ret, outbuf, outs = cluster_handle.mon_command(childargs, inbuf)
     elif ret:
         if ret < 0:
             ret = -ret
index 7e40021c45db841ba790b01bfd97d05bc045013c..739c29eeaf494dcecf96708f43478c3ba46d4442 100644 (file)
@@ -1616,7 +1616,8 @@ int rados_notify(rados_ioctx_t io, const char *o, uint64_t ver, const char *buf,
  * not filled in.
  *
  * @param cluster cluster handle
- * @param cmd the command string (in JSON)
+ * @param cmd an array of char *'s representing the command
+ * @param cmdlen count of valid entries in cmd
  * @param inbuf any bulk input data (crush map, etc.)
  * @param outbuf double pointer to output buffer
  * @param outbuflen pointer to output buffer length
@@ -1624,7 +1625,7 @@ int rados_notify(rados_ioctx_t io, const char *o, uint64_t ver, const char *buf,
  * @param outslen pointer to status string length
  * @returns 0 on success, negative error code on failure
  */
-int rados_mon_command(rados_t cluster, const char *cmd,
+int rados_mon_command(rados_t cluster, const char **cmd, size_t cmdlen,
                      const char *inbuf, size_t inbuflen,
                      char **outbuf, size_t *outbuflen,
                      char **outs, size_t *outslen);
@@ -1638,12 +1639,14 @@ int rados_mon_command(rados_t cluster, const char *cmd,
  */
 void rados_buffer_free(char *buf);
 
-int rados_osd_command(rados_t cluster, int osdid, const char *cmd,
+int rados_osd_command(rados_t cluster, int osdid, const char **cmd,
+                     size_t cmdlen,
                      const char *inbuf, size_t inbuflen,
                      char **outbuf, size_t *outbuflen,
                      char **outs, size_t *outslen);
 
-int rados_pg_command(rados_t cluster, const char *pgstr, const char *cmd,
+int rados_pg_command(rados_t cluster, const char *pgstr, const char **cmd,
+                    size_t cmdlen,
                     const char *inbuf, size_t inbuflen,
                     char **outbuf, size_t *outbuflen,
                     char **outs, size_t *outslen);
index e624eebea8237a4f1e0d902f7195e778b4bc5b79..2e6666992406970d0a3c2876dca9f46e0e390dd4 100644 (file)
@@ -1751,7 +1751,8 @@ static void do_out_buffer(string& outbl, char **outbuf, size_t *outbuflen)
     *outbuflen = outbl.length();
 }
 
-extern "C" int rados_mon_command(rados_t cluster, const char *cmd,
+extern "C" int rados_mon_command(rados_t cluster, const char **cmd,
+                                size_t cmdlen,
                                 const char *inbuf, size_t inbuflen,
                                 char **outbuf, size_t *outbuflen,
                                 char **outs, size_t *outslen)
@@ -1762,8 +1763,9 @@ extern "C" int rados_mon_command(rados_t cluster, const char *cmd,
   string outstring;
   vector<string> cmdvec;
 
-  get_str_vec(string(cmd), cmdvec);
-  cmdvec.push_back(cmd);
+  for (size_t i = 0; i < cmdlen; i++)
+    cmdvec.push_back(cmd[i]);
+
   inbl.append(inbuf, inbuflen);
   int ret = client->mon_command(cmdvec, inbl, &outbl, &outstring);
 
@@ -1772,7 +1774,8 @@ extern "C" int rados_mon_command(rados_t cluster, const char *cmd,
   return ret;
 }
 
-extern "C" int rados_osd_command(rados_t cluster, int osdid, const char *cmd,
+extern "C" int rados_osd_command(rados_t cluster, int osdid, const char **cmd,
+                                size_t cmdlen,
                                 const char *inbuf, size_t inbuflen,
                                 char **outbuf, size_t *outbuflen,
                                 char **outs, size_t *outslen)
@@ -1783,7 +1786,9 @@ extern "C" int rados_osd_command(rados_t cluster, int osdid, const char *cmd,
   string outstring;
   vector<string> cmdvec;
 
-  get_str_vec(string(cmd), cmdvec);
+  for (size_t i = 0; i < cmdlen; i++)
+    cmdvec.push_back(cmd[i]);
+
   inbl.append(inbuf, inbuflen);
   int ret = client->osd_command(osdid, cmdvec, inbl, &outbl, &outstring);
 
@@ -1795,7 +1800,7 @@ extern "C" int rados_osd_command(rados_t cluster, int osdid, const char *cmd,
 
 
 extern "C" int rados_pg_command(rados_t cluster, const char *pgstr,
-                               const char *cmd,
+                               const char **cmd, size_t cmdlen,
                                const char *inbuf, size_t inbuflen,
                                char **outbuf, size_t *outbuflen,
                                char **outs, size_t *outslen)
@@ -1807,7 +1812,9 @@ extern "C" int rados_pg_command(rados_t cluster, const char *pgstr,
   pg_t pgid;
   vector<string> cmdvec;
 
-  get_str_vec(string(cmd), cmdvec);
+  for (size_t i = 0; i < cmdlen; i++)
+    cmdvec.push_back(cmd[i]);
+
   inbl.append(inbuf, inbuflen);
   if (!pgid.parse(pgstr))
     return -EINVAL;
index a260323a92510f961f96ad6aee97b4d2e4365286..34ac4ae8ade19b873b2352398b6eba2149c89c68 100644 (file)
@@ -529,9 +529,10 @@ Rados object in state %s." % (self.state))
         outbuflen = c_long()
         outsp = pointer(pointer(c_char()))
         outslen = c_long()
+        cmdarr = (c_char_p * len(cmd))(*cmd)
 
         ret = run_in_thread(self.librados.rados_mon_command,
-                            (self.cluster, c_char_p(cmd),
+                            (self.cluster, cmdarr, len(cmd),
                             c_char_p(inbuf), len(inbuf),
                             outbufp, byref(outbuflen), outsp, byref(outslen)),
                             timeout)
@@ -561,8 +562,9 @@ Rados object in state %s." % (self.state))
         outbuflen = c_long()
         outsp = pointer(pointer(c_char()))
         outslen = c_long()
+        cmdarr = (c_char_p * len(cmd))(*cmd)
         ret = run_in_thread(self.librados.rados_osd_command,
-                            (self.cluster, osdid, c_char_p(cmd),
+                            (self.cluster, osdid, cmdarr, len(cmd),
                             c_char_p(inbuf), len(inbuf),
                             outbufp, byref(outbuflen), outsp, byref(outslen)),
                             timeout)
@@ -592,8 +594,9 @@ Rados object in state %s." % (self.state))
         outbuflen = c_long()
         outsp = pointer(pointer(c_char()))
         outslen = c_long()
+        cmdarr = (c_char_p * len(cmd))(*cmd)
         ret = run_in_thread(self.librados.rados_pg_command,
-                            (self.cluster, c_char_p(pgid), c_char_p(cmd),
+                            (self.cluster, c_char_p(pgid), cmdarr, len(cmd),
                             c_char_p(inbuf), len(inbuf),
                             outbufp, byref(outbuflen), outsp, byref(outslen)),
                             timeout)
index 31abd9cb99ac55b795b01b2546dd39f33f5d7a56..66702b02d24358cdd07022e9dbb9ec1098bab973 100644 (file)
@@ -27,21 +27,28 @@ TEST(LibRadosCmd, MonDescribe) {
 
   char *buf, *st;
   size_t buflen, stlen;
+  char *cmd[2];
 
-  ASSERT_EQ(0, rados_mon_command(cluster, "{\"prefix\":\"get_command_descriptions\"}", "", 0, &buf, &buflen, &st, &stlen));
+  cmd[1] = NULL;
+
+  cmd[0] = (char *)"{\"prefix\":\"get_command_descriptions\"}";
+  ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
   ASSERT_LT(0u, buflen);
   rados_buffer_free(buf);
   rados_buffer_free(st);
 
-  ASSERT_EQ(-EINVAL, rados_mon_command(cluster, "get_command_descriptions", "", 0, &buf, &buflen, &st, &stlen));
+  cmd[0] = (char *)"get_command_descriptions";
+  ASSERT_EQ(-EINVAL, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
   rados_buffer_free(buf);
   rados_buffer_free(st);
 
-  ASSERT_EQ(-EINVAL, rados_mon_command(cluster, "asdfqwer", "{}", 2, &buf, &buflen, &st, &stlen));
+  cmd[0] = (char *)"asdfqwer";
+  ASSERT_EQ(-EINVAL, rados_mon_command(cluster, (const char **)cmd, 1, "{}", 2, &buf, &buflen, &st, &stlen));
   rados_buffer_free(buf);
   rados_buffer_free(st);
 
-  ASSERT_EQ(0, rados_mon_command(cluster, "{\"prefix\":\"mon_status\"}", "", 0, &buf, &buflen, &st, &stlen));
+  cmd[0] = (char *)"{\"prefix\":\"mon_status\"}";
+  ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
   ASSERT_LT(0u, buflen);
   //ASSERT_LT(0u, stlen);
   rados_buffer_free(buf);
@@ -49,7 +56,7 @@ TEST(LibRadosCmd, MonDescribe) {
 
   ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster));
 }
-/*
+
 TEST(LibRadosCmd, OSDCmd) {
   rados_t cluster;
   std::string pool_name = get_temp_pool_name();
@@ -57,10 +64,15 @@ TEST(LibRadosCmd, OSDCmd) {
 
   char *buf, *st;
   size_t buflen, stlen;
-
-  ASSERT_EQ(-22, rados_osd_command(cluster, 0, "asdfasdf", "", &buf, &buflen, &st, &stlen));
-  ASSERT_EQ(-22, rados_osd_command(cluster, 0, "version", "", &buf, &buflen, &st, &stlen));
-  ASSERT_EQ(0, rados_osd_command(cluster, 0, "{prefix:\"version\"}", "", &buf, &buflen, &st, &stlen));
+  char *cmd[2];
+  cmd[1] = NULL;
+
+  cmd[0] = (char *)"asdfasdf";
+  ASSERT_EQ(-22, rados_osd_command(cluster, 0, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
+  cmd[0] = (char *)"version";
+  ASSERT_EQ(-22, rados_osd_command(cluster, 0, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
+  cmd[0] = (char *)"{\"prefix\":\"version\"}";
+  ASSERT_EQ(0, rados_osd_command(cluster, 0, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
   ASSERT_LT(0u, buflen);
   rados_buffer_free(buf);
   rados_buffer_free(st);
@@ -75,21 +87,26 @@ TEST(LibRadosCmd, PGCmd) {
 
   char *buf, *st;
   size_t buflen, stlen;
+  char *cmd[2];
+  cmd[1] = NULL;
 
   int64_t poolid = rados_pool_lookup(cluster, pool_name.c_str());
   ASSERT_LT(0, poolid);
 
   string pgid = stringify(poolid) + ".0";
 
-  ASSERT_EQ(-22, rados_pg_command(cluster, pgid.c_str(), "asdfasdf", "", &buf, &buflen, &st, &stlen));
-  ASSERT_EQ(0, rados_pg_command(cluster, pgid.c_str(), "query", "", &buf, &buflen, &st, &stlen));
+  cmd[0] = (char *)"asdfasdf";
+  ASSERT_EQ(-22, rados_pg_command(cluster, pgid.c_str(), (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
+  string qstr = "{\"prefix\":\"pg\", \"cmd\":\"query\", \"pgid\":\"" +  pgid + "\"}";
+  cmd[0] = (char *)qstr.c_str();
+  ASSERT_EQ(0, rados_pg_command(cluster, pgid.c_str(), (const char **)cmd, 1, "", 0,  &buf, &buflen, &st, &stlen));
   ASSERT_LT(0u, buflen);
   rados_buffer_free(buf);
   rados_buffer_free(st);
 
   ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster));
 }
-*/
+
 struct Log {
   list<string> log;
   Cond cond;
@@ -125,11 +142,14 @@ TEST(LibRadosCmd, WatchLog) {
   ASSERT_EQ("", create_one_pool(pool_name, &cluster));
 
   char *buf, *st;
+  char *cmd[2];
+  cmd[1] = NULL;
   size_t buflen, stlen;
   Log l;
 
   ASSERT_EQ(0, rados_monitor_log(cluster, "info", log_cb, &l));
-  ASSERT_EQ(0, rados_mon_command(cluster, "{\"prefix\":\"log\", \"logtext\":[\"onexx\"]}", "", 0, &buf, &buflen, &st, &stlen));
+  cmd[0] = (char *)"{\"prefix\":\"log\", \"logtext\":[\"onexx\"]}";
+  ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
   for (int i=0; !l.contains("onexx"); i++) {
     ASSERT_TRUE(i<100);
     sleep(1);
@@ -139,25 +159,27 @@ TEST(LibRadosCmd, WatchLog) {
   /*
     changing the subscribe level is currently broken.
 
+  cmd[0] = (char *)"{\"prefix\":\"log\", \"logtext\":[\"twoxx\"]}";
   ASSERT_EQ(0, rados_monitor_log(cluster, "err", log_cb, &l));
-  ASSERT_EQ(0, rados_mon_command(cluster, "{\"prefix\":\"log\", \"logtext\":[\"twoxx\"]}", "", 0, &buf, &buflen, &st, &stlen));
+  ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
   sleep(2);
   ASSERT_FALSE(l.contains("twoxx"));
   */
 
   ASSERT_EQ(0, rados_monitor_log(cluster, "info", log_cb, &l));
-  ASSERT_EQ(0, rados_mon_command(cluster, "{\"prefix\":\"log\", \"logtext\":[\"threexx\"]}", "", 0, &buf, &buflen, &st, &stlen));
+  cmd[0] = (char *)"{\"prefix\":\"log\", \"logtext\":[\"threexx\"]}";
+  ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
   for (int i=0; !l.contains("threexx"); i++) {
     ASSERT_TRUE(i<100);
     sleep(1);
   }
 
   ASSERT_EQ(0, rados_monitor_log(cluster, "info", NULL, NULL));
-  ASSERT_EQ(0, rados_mon_command(cluster, "{\"prefix\":\"log\", \"logtext\":[\"fourxx\"]}", "", 0, &buf, &buflen, &st, &stlen));
+  cmd[0] = (char *)"{\"prefix\":\"log\", \"logtext\":[\"fourxx\"]}";
+  ASSERT_EQ(0, rados_mon_command(cluster, (const char **)cmd, 1, "", 0, &buf, &buflen, &st, &stlen));
   sleep(2);
   ASSERT_FALSE(l.contains("fourxx"));
 
 
   ASSERT_EQ(0, destroy_one_pool(pool_name, &cluster));
 }