diff options
author | Susant Palai <spalai@redhat.com> | 2018-05-03 17:41:16 +0530 |
---|---|---|
committer | Amar Tumballi <amarts@redhat.com> | 2018-05-22 07:48:38 +0000 |
commit | 3ec6ae1c1fb103df077f44b18604e768fea00ddc (patch) | |
tree | 77a4bea667cf50bbb751348016fe5d730a7aeac7 /xlators/features/cloudsync/src | |
parent | 985a1d15db910e012ddc1dcdc2e333cc28a9968b (diff) |
features/cloudsync: Make plugins configurable
This patch brings the configuration option for plugins.
For new plugins, an entry has to be created in to cs_plugin structure e.g.
struct cs_plugin plugins[] = {
{
.name = "amazons3",
.library = "libamazons3.so",
.description = "amazon s3 store."
},
{.name = NULL},
};
Library field describes the name of the shared library for the plugin.
To configure plugin type "feature.cloudsync-storetype" option need
to be set to the remote-store type. e.g.
gluster volume set VOLNAME cloudsync-storetype amazons3. This should be same
as the ".name" field in cs_plugin structure.
cs_init will pick this up in run time to load the plugin.
Change-Id: I2cec10b206f71ac4e71d472631a3a5badf278b59
fixes: bz#1576842
Signed-off-by: Susant Palai <spalai@redhat.com>
Diffstat (limited to 'xlators/features/cloudsync/src')
-rw-r--r-- | xlators/features/cloudsync/src/cloudsync.c | 54 | ||||
-rw-r--r-- | xlators/features/cloudsync/src/cloudsync.h | 6 |
2 files changed, 54 insertions, 6 deletions
diff --git a/xlators/features/cloudsync/src/cloudsync.c b/xlators/features/cloudsync/src/cloudsync.c index 48e27c372b6..e14fc544957 100644 --- a/xlators/features/cloudsync/src/cloudsync.c +++ b/xlators/features/cloudsync/src/cloudsync.c @@ -34,15 +34,27 @@ cs_cleanup_private (cs_private_t *priv) return; } +struct cs_plugin plugins[] = { + { + .name = "amazons3", + .library = "libamazons3.so", + .description = "amazon s3 store." + }, + + {.name = NULL}, +}; + int cs_init (xlator_t *this) { cs_private_t *priv = NULL; gf_boolean_t per_vol = _gf_false; int ret = 0; - char *libpath = ("libaws.so"); + char *libpath = NULL; store_methods_t *store_methods = NULL; void *handle = NULL; + char *temp_str = NULL; + int index = 0; priv = GF_CALLOC (1, sizeof (*priv), gf_cs_mt_cs_private_t); if (!priv) { @@ -66,7 +78,25 @@ cs_init (xlator_t *this) per_vol = _gf_true; if (per_vol) { - /*TODO:Need to make it configurable. This is a temp workaround*/ + if (dict_get_str (this->options, "cloudsync-storetype", + &temp_str) == 0) { + for (index = 0; plugins[index].name; index++) { + if (!strcmp (temp_str, plugins[index].name)) { + libpath = plugins[index].library; + break; + } + } + } else { + ret = 0; + } + + if (!libpath) { + gf_msg (this->name, GF_LOG_WARNING, 0, 0, + "no plugin enabled"); + ret = 0; + goto out; + } + handle = dlopen (libpath, RTLD_NOW); if (!handle) { gf_msg (this->name, GF_LOG_ERROR, 0, 0, "could not load" @@ -848,15 +878,23 @@ cs_download_task (void *arg) priv = this->private; - local = frame->local; - retval = GF_CALLOC (1, sizeof(int), gf_common_mt_int); if (!retval) { - gf_log (this->name, GF_LOG_ERROR, "insufficient memory"); + gf_msg (this->name, GF_LOG_ERROR, 0, 0, "insufficient memory"); + ret = -1; + goto out; + } + + if (!priv->stores) { + gf_msg (this->name, GF_LOG_ERROR, 0, 0, "No remote store " + "plugins found"); ret = -1; goto out; } + local = frame->local; + + if (local->fd) fd = fd_anonymous (local->fd->inode); else @@ -1656,7 +1694,11 @@ struct xlator_dumpops cs_dumpops = { }; struct volume_options cs_options[] = { - { .key = {NULL} }, + { .key = {"cloudsync-storetype"}, + .type = GF_OPTION_TYPE_STR, + .description = "Defines which remote store is enabled" + }, + { .key = {NULL} }, }; xlator_api_t xlator_api = { diff --git a/xlators/features/cloudsync/src/cloudsync.h b/xlators/features/cloudsync/src/cloudsync.h index bd54d760864..18840a6523d 100644 --- a/xlators/features/cloudsync/src/cloudsync.h +++ b/xlators/features/cloudsync/src/cloudsync.h @@ -34,6 +34,12 @@ typedef struct cs_inode_ctx { gf_cs_obj_state state; } cs_inode_ctx_t; +struct cs_plugin { + char *name; /* store name */ + char *library; /* library to load for the given store */ + char *description; /* description about the store */ +}; + cs_local_t * cs_local_init (xlator_t *this, call_frame_t *frame, loc_t *loc, fd_t *fd, glusterfs_fop_t fop); |