From b5726e111b9206ddc77a303c3655eb5389c6d3a9 Mon Sep 17 00:00:00 2001 From: Colin Patrick McCabe Date: Tue, 17 May 2011 11:18:52 -0700 Subject: [PATCH] librgw: make API reentrant By passing in the configuration, we can use multiple librgw instances in parallel-- or will be able to, once g_conf is de-globalized. Signed-off-by: Colin McCabe --- src/include/rados/librgw.h | 12 ++++++++---- src/rgw/librgw.cc | 38 ++++++++++++++++++++++++++++++++++---- src/test/librgw.cc | 28 +++++++++++++++++++++------- 3 files changed, 63 insertions(+), 15 deletions(-) diff --git a/src/include/rados/librgw.h b/src/include/rados/librgw.h index 21c70544edfaf..a14cabf5f518b 100644 --- a/src/include/rados/librgw.h +++ b/src/include/rados/librgw.h @@ -19,10 +19,14 @@ extern "C" { #endif -int librgw_acl_bin2xml(const char *bin, int bin_len, char **xml); -void librgw_free_xml(char *xml); -int librgw_acl_xml2bin(const char *xml, char **bin, int *bin_len); -void librgw_free_bin(char *bin); +struct md_config_t; +typedef struct md_config_t* librgw_t; +int librgw_create(librgw_t *rgw, const char * const id); +int librgw_acl_bin2xml(librgw_t rgw, const char *bin, int bin_len, char **xml); +void librgw_free_xml(librgw_t rgw, char *xml); +int librgw_acl_xml2bin(librgw_t rgw, const char *xml, char **bin, int *bin_len); +void librgw_free_bin(librgw_t rgw, char *bin); +void librgw_shutdown(librgw_t rgw); #ifdef __cplusplus } diff --git a/src/rgw/librgw.cc b/src/rgw/librgw.cc index 24e1276f66c34..fca0554230294 100644 --- a/src/rgw/librgw.cc +++ b/src/rgw/librgw.cc @@ -16,6 +16,8 @@ #include "include/rados/librgw.h" #include "rgw/rgw_acl.h" #include "rgw_acl.h" +#include "common/ceph_argparse.h" +#include "common/common_init.h" #include "common/config.h" #include @@ -24,7 +26,30 @@ #define RGW_LOG(x) pdout(x, g_conf.rgw_log) -int librgw_acl_bin2xml(const char *bin, int bin_len, char **xml) +static Mutex librgw_init_mutex("librgw_init"); +static int librgw_initialized = 0; + +int librgw_create(librgw_t *rgw, const char * const id) +{ + librgw_init_mutex.Lock(); + if (!librgw_initialized) { + CephInitParameters iparams(CEPH_ENTITY_TYPE_CLIENT, CEPH_CONF_FILE_DEFAULT); + iparams.conf_file = ""; + if (id) { + iparams.name.set(CEPH_ENTITY_TYPE_CLIENT, id); + } + md_config_t *conf = common_preinit(iparams, CODE_ENVIRONMENT_LIBRARY, 0); + conf->parse_env(); // environment variables override + conf->apply_changes(); + + ++librgw_initialized; + } + librgw_init_mutex.Unlock(); + *rgw = &g_conf; + return 0; +} + +int librgw_acl_bin2xml(librgw_t rgw, const char *bin, int bin_len, char **xml) { try { // convert to bufferlist @@ -56,12 +81,12 @@ int librgw_acl_bin2xml(const char *bin, int bin_len, char **xml) } } -void librgw_free_xml(char *xml) +void librgw_free_xml(librgw_t rgw, char *xml) { free(xml); } -int librgw_acl_xml2bin(const char *xml, char **bin, int *bin_len) +int librgw_acl_xml2bin(librgw_t rgw, const char *xml, char **bin, int *bin_len) { char *bin_ = NULL; try { @@ -103,7 +128,12 @@ int librgw_acl_xml2bin(const char *xml, char **bin, int *bin_len) return -2000; } -void librgw_free_bin(char *bin) +void librgw_free_bin(librgw_t rgw, char *bin) { free(bin); } + +void librgw_shutdown(librgw_t rgw) +{ + // TODO: free configuration, etc. +} diff --git a/src/test/librgw.cc b/src/test/librgw.cc index 76b5106577b8a..5a360a7b4100b 100644 --- a/src/test/librgw.cc +++ b/src/test/librgw.cc @@ -54,26 +54,38 @@ TEST(LibRGW, FromBin) { int ret; const char *bin = (const char*)VERSION1_BIN; int len = sizeof(VERSION1_BIN) / sizeof(VERSION1_BIN[0]); + librgw_t rgw; + + ret = librgw_create(&rgw, NULL); + ASSERT_EQ(ret, 0); char *xml = NULL; - ret = librgw_acl_bin2xml(bin, len, &xml); + ret = librgw_acl_bin2xml(rgw, bin, len, &xml); ASSERT_EQ(ret, 0); + + librgw_shutdown(rgw); } TEST(LibRGW, RoundTrip) { + int ret; char *bin = NULL; int bin_len = 0; - ret = librgw_acl_xml2bin(SAMPLE_XML_1, &bin, &bin_len); + librgw_t rgw; + + ret = librgw_create(&rgw, NULL); + ASSERT_EQ(ret, 0); + + ret = librgw_acl_xml2bin(rgw, SAMPLE_XML_1, &bin, &bin_len); ASSERT_EQ(ret, 0); char *xml2 = NULL; - ret = librgw_acl_bin2xml(bin, bin_len, &xml2); + ret = librgw_acl_bin2xml(rgw, bin, bin_len, &xml2); ASSERT_EQ(ret, 0); char *bin2 = NULL; int bin_len2 = 0; - ret = librgw_acl_xml2bin(xml2, &bin2, &bin_len2); + ret = librgw_acl_xml2bin(rgw, xml2, &bin2, &bin_len2); ASSERT_EQ(ret, 0); // the serialized representation should be the same. @@ -83,7 +95,9 @@ TEST(LibRGW, RoundTrip) { // Free memory // As you can see, we ignore freeing memory on test failures // Don't do this in your real programs! - librgw_free_bin(bin); - librgw_free_xml(xml2); - librgw_free_bin(bin2); + librgw_free_bin(rgw, bin); + librgw_free_xml(rgw, xml2); + librgw_free_bin(rgw, bin2); + + librgw_shutdown(rgw); } -- 2.39.5