From: Dan Mick Date: Fri, 7 Jun 2013 00:40:28 +0000 (-0700) Subject: ceph, librados, rados.py, librados tests: pass cmd as array X-Git-Tag: v0.65~136^2^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=24a5212d3ec3e244f4e49a88e50191827fe0d44e;p=ceph.git ceph, librados, rados.py, librados tests: pass cmd as array 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 --- diff --git a/src/ceph b/src/ceph index c045220b3243..678d83484860 100755 --- 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 diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h index 7e40021c45db..739c29eeaf49 100644 --- a/src/include/rados/librados.h +++ b/src/include/rados/librados.h @@ -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); diff --git a/src/librados/librados.cc b/src/librados/librados.cc index e624eebea823..2e6666992406 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -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 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 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 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; diff --git a/src/pybind/rados.py b/src/pybind/rados.py index a260323a9251..34ac4ae8ade1 100644 --- a/src/pybind/rados.py +++ b/src/pybind/rados.py @@ -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) diff --git a/src/test/librados/cmd.cc b/src/test/librados/cmd.cc index 31abd9cb99ac..66702b02d243 100644 --- a/src/test/librados/cmd.cc +++ b/src/test/librados/cmd.cc @@ -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 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)); } -