diff options
-rw-r--r-- | libglusterfs/src/gfdb/gfdb_data_store.c | 12 | ||||
-rw-r--r-- | libglusterfs/src/gfdb/gfdb_data_store.h | 42 | ||||
-rwxr-xr-x | tests/basic/tier/tier.t | 2 | ||||
-rw-r--r-- | xlators/cluster/dht/src/Makefile.am | 10 | ||||
-rw-r--r-- | xlators/cluster/dht/src/tier.c | 243 | ||||
-rw-r--r-- | xlators/cluster/dht/src/tier.h | 10 | ||||
-rw-r--r-- | xlators/features/changetimerecorder/src/changetimerecorder.c | 1 | ||||
-rw-r--r-- | xlators/features/changetimerecorder/src/ctr-helper.c | 1 |
8 files changed, 262 insertions, 59 deletions
diff --git a/libglusterfs/src/gfdb/gfdb_data_store.c b/libglusterfs/src/gfdb/gfdb_data_store.c index b250ece91e4..ec92f7a4d20 100644 --- a/libglusterfs/src/gfdb/gfdb_data_store.c +++ b/libglusterfs/src/gfdb/gfdb_data_store.c @@ -8,6 +8,7 @@ cases as published by the Free Software Foundation. */ +#include "gfdb_sqlite3.h" #include "gfdb_data_store.h" #include "list.h" @@ -647,3 +648,14 @@ find_recently_changed_files_freq(gfdb_conn_node_t *_conn_node, return ret; } + +void get_gfdb_methods (gfdb_methods_t *methods) +{ + methods->init_db = init_db; + methods->fini_db = fini_db; + methods->find_unchanged_for_time = find_unchanged_for_time; + methods->find_recently_changed_files = find_recently_changed_files; + methods->find_unchanged_for_time_freq = find_unchanged_for_time_freq; + methods->find_recently_changed_files_freq = find_recently_changed_files_freq; + methods->dbpath = strdup(GFDB_SQL_PARAM_DBPATH); +} diff --git a/libglusterfs/src/gfdb/gfdb_data_store.h b/libglusterfs/src/gfdb/gfdb_data_store.h index ffe590b84bd..977794df5cb 100644 --- a/libglusterfs/src/gfdb/gfdb_data_store.h +++ b/libglusterfs/src/gfdb/gfdb_data_store.h @@ -24,7 +24,6 @@ #include <sys/time.h> #include "gfdb_data_store_types.h" -#include "gfdb_sqlite3.h" /* GFDB Connection Node: * ~~~~~~~~~~~~~~~~~~~~ @@ -52,6 +51,8 @@ typedef struct gfdb_conn_node_t gfdb_conn_node_t; gfdb_conn_node_t * init_db(dict_t *arg, gfdb_db_type_t db_type); +typedef gfdb_conn_node_t * (*init_db_t) (dict_t *args, + gfdb_db_type_t gfdb_db_type); @@ -65,6 +66,7 @@ init_db(dict_t *arg, gfdb_db_type_t db_type); int fini_db(gfdb_conn_node_t *); +typedef int (*fini_db_t) (gfdb_conn_node_t *_conn_node); @@ -138,6 +140,11 @@ int find_unchanged_for_time(gfdb_conn_node_t *, gf_query_callback_t query_callback, void *_query_cbk_args, gfdb_time_t *for_time); +typedef int (*find_unchanged_for_time_t) (gfdb_conn_node_t *_conn_node, + gf_query_callback_t query_callback, + void *_query_cbk_args, + gfdb_time_t *for_time); + @@ -157,6 +164,10 @@ int find_recently_changed_files(gfdb_conn_node_t *_conn, gf_query_callback_t query_callback, void *_query_cbk_args, gfdb_time_t *from_time); +typedef int (*find_recently_changed_files_t) (gfdb_conn_node_t *_conn_node, + gf_query_callback_t query_callback, + void *_query_cbk_args, + gfdb_time_t *from_time); @@ -186,6 +197,13 @@ int find_unchanged_for_time_freq(gfdb_conn_node_t *_conn, int read_freq_thresold, gf_boolean_t _clear_counters); +typedef int (*find_unchanged_for_time_freq_t) (gfdb_conn_node_t *_conn_node, + gf_query_callback_t query_callback, + void *_query_cbk_args, + gfdb_time_t *for_time, + int write_freq_thresold, + int read_freq_thresold, + gf_boolean_t _clear_counters); @@ -215,4 +233,26 @@ int find_recently_changed_files_freq(gfdb_conn_node_t *_conn, int read_freq_thresold, gf_boolean_t _clear_counters); +typedef int (*find_recently_changed_files_freq_t) (gfdb_conn_node_t *_conn_node, + gf_query_callback_t query_callback, + void *_query_cbk_args, + gfdb_time_t *from_time, + int write_freq_thresold, + int read_freq_thresold, + gf_boolean_t _clear_counters); + +typedef struct gfdb_methods_s { + init_db_t init_db; + fini_db_t fini_db; + find_unchanged_for_time_t find_unchanged_for_time; + find_recently_changed_files_t find_recently_changed_files; + find_unchanged_for_time_freq_t find_unchanged_for_time_freq; + find_recently_changed_files_freq_t find_recently_changed_files_freq; + char *dbpath; +} gfdb_methods_t; + +void get_gfdb_methods (gfdb_methods_t *methods); + +typedef void (*get_gfdb_methods_t) (gfdb_methods_t *methods); + #endif diff --git a/tests/basic/tier/tier.t b/tests/basic/tier/tier.t index 383d4709798..58846412358 100755 --- a/tests/basic/tier/tier.t +++ b/tests/basic/tier/tier.t @@ -80,6 +80,8 @@ TEST file_on_fast_tier d1/data.txt TEST $CLI volume set $V0 cluster.tier-demote-frequency 4 TEST $CLI volume set $V0 cluster.tier-promote-frequency 4 +TEST $CLI volume set $V0 cluster.read-freq-threshold 0 +TEST $CLI volume set $V0 cluster.write-freq-threshold 0 TEST $CLI volume set $V0 performance.quick-read off TEST $CLI volume set $V0 performance.io-cache off TEST $CLI volume rebalance $V0 tier start diff --git a/xlators/cluster/dht/src/Makefile.am b/xlators/cluster/dht/src/Makefile.am index bbe5cdd8d83..a8e1ec0d286 100644 --- a/xlators/cluster/dht/src/Makefile.am +++ b/xlators/cluster/dht/src/Makefile.am @@ -27,17 +27,19 @@ nufa_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la switch_la_LDFLAGS = -module -avoid-version switch_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la -tier_la_CFLAGS = $(AM_CFLAGS) $(SQLITE_CFLAGS) + tier_la_LDFLAGS = -module -avoid-version -tier_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la\ - $(top_builddir)/libglusterfs/src/gfdb/libgfdb.la +tier_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la noinst_HEADERS = dht-common.h dht-mem-types.h dht-messages.h dht-helper.h tier.h\ $(top_builddir)/xlators/lib/src/libxlator.h AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \ -I$(top_srcdir)/libglusterfs/src/gfdb \ - -I$(top_srcdir)/xlators/lib/src + -I$(top_srcdir)/xlators/lib/src \ + -DDATADIR=\"$(localstatedir)\" \ + -DLIBDIR=\"$(libdir)\" \ + -DLIBGFDB_VERSION=\"$(LIBGFDB_VERSION)\" CLEANFILES = diff --git a/xlators/cluster/dht/src/tier.c b/xlators/cluster/dht/src/tier.c index 51a6a8340e9..bc969422bda 100644 --- a/xlators/cluster/dht/src/tier.c +++ b/xlators/cluster/dht/src/tier.c @@ -12,6 +12,7 @@ #define _CONFIG_H #include "config.h" #endif +#include <dlfcn.h> #include "dht-common.h" #include "tier.h" @@ -23,8 +24,16 @@ static gfdb_db_type_t dht_tier_db_type = GFDB_SQLITE3; /*Mutex for updating the data movement stats*/ static pthread_mutex_t dm_stat_mutex = PTHREAD_MUTEX_INITIALIZER; +static char *promotion_qfile; +static char *demotion_qfile; + +static void *libhandle; +static gfdb_methods_t gfdb_methods; + #define DB_QUERY_RECORD_SIZE 4096 + + static int tier_parse_query_str (char *query_record_str, char *gfid, char *link_buffer, ssize_t *link_size) @@ -64,6 +73,51 @@ out: } static int +tier_check_same_node (xlator_t *this, loc_t *loc, gf_defrag_info_t *defrag) +{ + int ret = -1; + dict_t *dict = NULL; + char *uuid_str = NULL; + uuid_t node_uuid = {0,}; + + GF_VALIDATE_OR_GOTO ("tier", this, out); + GF_VALIDATE_OR_GOTO (this->name, loc, out); + GF_VALIDATE_OR_GOTO (this->name, defrag, out); + + if (syncop_getxattr (this, loc, &dict, GF_XATTR_NODE_UUID_KEY, NULL)) { + gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_LOG_TIER_ERROR, + "Unable to get NODE_UUID_KEY %s %s\n", + loc->name, loc->path); + goto out; + } + + if (dict_get_str (dict, GF_XATTR_NODE_UUID_KEY, &uuid_str) < 0) { + gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_LOG_TIER_ERROR, + "Failed to get node-uuid for %s", loc->path); + goto out; + } + + if (uuid_parse (uuid_str, node_uuid)) { + gf_msg (this->name, GF_LOG_INFO, 0, DHT_MSG_LOG_TIER_ERROR, + "uuid_parse failed for %s", loc->path); + goto out; + } + + if (uuid_compare (node_uuid, defrag->node_uuid)) { + gf_msg (this->name, GF_LOG_INFO, 0, DHT_MSG_LOG_TIER_STATUS, + "%s does not belong to this node", loc->path); + goto out; + } + + ret = 0; +out: + if (dict) + dict_unref(dict); + + return ret; +} + +static int tier_migrate_using_query_file (void *_args) { int ret = -1; @@ -77,7 +131,7 @@ tier_migrate_using_query_file (void *_args) char *link_buffer = NULL; gfdb_query_record_t *query_record = NULL; gfdb_link_info_t *link_info = NULL; - struct iatt par_stbuf = {0,}; + struct iatt par_stbuf = {0,}; struct iatt current = {0,}; loc_t p_loc = {0,}; loc_t loc = {0,}; @@ -104,7 +158,8 @@ tier_migrate_using_query_file (void *_args) goto out; } - query_record->_link_info_str = calloc (DB_QUERY_RECORD_SIZE, 1); + query_record->_link_info_str = GF_CALLOC (1, DB_QUERY_RECORD_SIZE, + gf_common_mt_char); if (!query_record->_link_info_str) { goto out; } @@ -249,6 +304,11 @@ tier_migrate_using_query_file (void *_args) DHT_MSG_LOG_TIER_STATUS, "Tier migrate file %s", loc.name); + if (tier_check_same_node (this, &loc, defrag)) { + per_link_status = -1; + goto error; + } + ret = syncop_setxattr (this, &loc, migrate_data, 0); if (ret) { gf_msg (this->name, GF_LOG_ERROR, 0, @@ -259,16 +319,11 @@ tier_migrate_using_query_file (void *_args) per_link_status = -1; goto error; } - inode_unref (loc.inode); - inode_unref (loc.parent); - inode_unref (p_loc.inode); error: - if (loc.name) { - GF_FREE ((char *) loc.name); - } - if (loc.path) { - GF_FREE ((char *) loc.path); - } + + loc_wipe(&loc); + loc_wipe(&p_loc); + token_str = NULL; token_str = strtok (NULL, delimiter); GF_FREE (link_str); @@ -292,7 +347,7 @@ per_file_out: out: if (link_buffer) - free (link_buffer); + GF_FREE (link_buffer); gfdb_link_info_fini (&link_info); if (migrate_data) dict_unref (migrate_data); @@ -362,11 +417,11 @@ tier_process_brick_cbk (dict_t *brick_dict, char *key, data_t *value, "DB Params cannot initialized!"); goto out; } - SET_DB_PARAM_TO_DICT(this->name, params_dict, GFDB_SQL_PARAM_DBPATH, + SET_DB_PARAM_TO_DICT(this->name, params_dict, gfdb_methods.dbpath, db_path, ret, out); /*Get the db connection*/ - conn_node = init_db((void *)params_dict, dht_tier_db_type); + conn_node = gfdb_methods.init_db((void *)params_dict, dht_tier_db_type); if (!conn_node) { gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_LOG_TIER_ERROR, @@ -388,12 +443,14 @@ tier_process_brick_cbk (dict_t *brick_dict, char *key, data_t *value, if (!gfdb_brick_dict_info->_gfdb_promote) { if (query_cbk_args->defrag->write_freq_threshold == 0 && query_cbk_args->defrag->read_freq_threshold == 0) { - ret = find_unchanged_for_time(conn_node, + ret = gfdb_methods.find_unchanged_for_time ( + conn_node, tier_gf_query_callback, (void *)query_cbk_args, gfdb_brick_dict_info->time_stamp); } else { - ret = find_unchanged_for_time_freq(conn_node, + ret = gfdb_methods.find_unchanged_for_time_freq ( + conn_node, tier_gf_query_callback, (void *)query_cbk_args, gfdb_brick_dict_info->time_stamp, @@ -406,20 +463,21 @@ tier_process_brick_cbk (dict_t *brick_dict, char *key, data_t *value, } else { if (query_cbk_args->defrag->write_freq_threshold == 0 && query_cbk_args->defrag->read_freq_threshold == 0) { - ret = find_recently_changed_files(conn_node, - tier_gf_query_callback, - (void *)query_cbk_args, - gfdb_brick_dict_info->time_stamp); + ret = gfdb_methods.find_recently_changed_files ( + conn_node, + tier_gf_query_callback, + (void *)query_cbk_args, + gfdb_brick_dict_info->time_stamp); } else { - ret = find_recently_changed_files_freq(conn_node, - tier_gf_query_callback, - (void *)query_cbk_args, - gfdb_brick_dict_info->time_stamp, - query_cbk_args->defrag-> - write_freq_threshold, - query_cbk_args->defrag-> - read_freq_threshold, - _gf_false); + ret = gfdb_methods.find_recently_changed_files_freq ( + conn_node, + tier_gf_query_callback, + (void *)query_cbk_args, + gfdb_brick_dict_info->time_stamp, + query_cbk_args->defrag-> + write_freq_threshold, + query_cbk_args->defrag->read_freq_threshold, + _gf_false); } } if (ret) { @@ -434,7 +492,7 @@ out: fclose (query_cbk_args->queryFILE); query_cbk_args->queryFILE = NULL; } - fini_db (conn_node); + gfdb_methods.fini_db (conn_node); return ret; } @@ -538,7 +596,7 @@ tier_demote (void *args) /* Migrate files using the query file */ ret = tier_migrate_files_using_qfile (args, - &query_cbk_args, DEMOTION_QFILE); + &query_cbk_args, demotion_qfile); if (ret) goto out; @@ -574,7 +632,7 @@ static void /* Migrate files using the query file */ ret = tier_migrate_files_using_qfile (args, &query_cbk_args, - PROMOTION_QFILE); + promotion_qfile); if (ret) goto out; @@ -626,7 +684,9 @@ tier_get_bricklist (xlator_t *xl, dict_t *bricklist) goto out; } - sprintf(db_path, "%s/.glusterfs/%s", rv, db_name); + sprintf(db_path, "%s/%s/%s", rv, + GF_HIDDEN_PATH, + db_name); if (dict_add_dynstr_with_alloc(bricklist, "brick", db_path)) goto out; @@ -855,6 +915,43 @@ dht_methods_t tier_methods = { .layout_search = tier_search, }; +static int +tier_load_externals (xlator_t *this) +{ + int ret = -1; + char *libpathfull = (LIBDIR "/libgfdb.so." LIBGFDB_VERSION); + get_gfdb_methods_t get_gfdb_methods; + + GF_VALIDATE_OR_GOTO("this", this, out); + + libhandle = dlopen (libpathfull, RTLD_NOW); + if (!libhandle) { + gf_msg(this->name, GF_LOG_ERROR, 0, + DHT_MSG_LOG_TIER_ERROR, + "Error loading libgfdb.so %s\n", dlerror()); + ret = -1; + goto out; + } + + get_gfdb_methods = dlsym (libhandle, "get_gfdb_methods"); + if (!get_gfdb_methods) { + gf_msg(this->name, GF_LOG_ERROR, 0, + DHT_MSG_LOG_TIER_ERROR, + "Error loading get_gfdb_methods()"); + ret = -1; + goto out; + } + + get_gfdb_methods (&gfdb_methods); + + ret = 0; + +out: + if (ret && libhandle) + dlclose (libhandle); + + return ret; +} int tier_init (xlator_t *this) @@ -889,11 +986,16 @@ tier_init (xlator_t *this) goto out; } - defrag = conf->defrag; + /* if instatiated from server side, load db libraries */ + ret = tier_load_externals(this); + if (ret) { + gf_msg(this->name, GF_LOG_ERROR, 0, + DHT_MSG_LOG_TIER_ERROR, + "Could not load externals. Aborting"); + goto out; + } - GF_OPTION_INIT ("tier-promote-frequency", - defrag->tier_promote_frequency, - int32, out); + defrag = conf->defrag; ret = dict_get_int32 (this->options, "tier-promote-frequency", &freq); @@ -903,10 +1005,6 @@ tier_init (xlator_t *this) defrag->tier_promote_frequency = freq; - GF_OPTION_INIT ("tier-demote-frequency", - defrag->tier_demote_frequency, - int32, out); - ret = dict_get_int32 (this->options, "tier-demote-frequency", &freq); if (ret) { @@ -915,23 +1013,56 @@ tier_init (xlator_t *this) defrag->tier_demote_frequency = freq; - GF_OPTION_INIT ("write-freq-threshold", - defrag->write_freq_threshold, - int32, out); + ret = dict_get_int32 (this->options, + "write-freq-threshold", &freq); + if (ret) { + freq = DEFAULT_WRITE_FREQ_SEC; + } + + defrag->write_freq_threshold = freq; - GF_OPTION_INIT ("read-freq-threshold", - defrag->read_freq_threshold, - int32, out); + ret = dict_get_int32 (this->options, + "read-freq-threshold", &freq); + if (ret) { + freq = DEFAULT_READ_FREQ_SEC; + } + + defrag->read_freq_threshold = freq; + + ret = gf_asprintf(&promotion_qfile, "%s/%s-%d", + DEFAULT_VAR_RUN_DIRECTORY, + PROMOTION_QFILE, + getpid()); + if (ret < 0) + goto out; + + ret = gf_asprintf(&demotion_qfile, "%s/%s-%d", + DEFAULT_VAR_RUN_DIRECTORY, + DEMOTION_QFILE, + getpid()); + if (ret < 0) { + GF_FREE(promotion_qfile); + goto out; + } gf_msg(this->name, GF_LOG_INFO, 0, DHT_MSG_LOG_TIER_STATUS, - "Promote frequency set to %d demote set to %d", + "Promote/demote frequency %d/%d " + "Write/Read freq thresholds %d/%d", defrag->tier_promote_frequency, - defrag->tier_demote_frequency); + defrag->tier_demote_frequency, + defrag->write_freq_threshold, + defrag->read_freq_threshold); + + gf_msg(this->name, GF_LOG_INFO, 0, + DHT_MSG_LOG_TIER_STATUS, + "Promote file %s demote file %s", + promotion_qfile, demotion_qfile); ret = 0; out: + return ret; } @@ -967,9 +1098,21 @@ out: return dht_reconfigure (this, options); } +void +tier_fini (xlator_t *this) +{ + if (libhandle) + dlclose(libhandle); + + GF_FREE(demotion_qfile); + GF_FREE(promotion_qfile); + + dht_fini(this); +} + class_methods_t class_methods = { .init = tier_init, - .fini = dht_fini, + .fini = tier_fini, .reconfigure = tier_reconfigure, .notify = dht_notify }; diff --git a/xlators/cluster/dht/src/tier.h b/xlators/cluster/dht/src/tier.h index 70f50bfccae..6dc830dabfa 100644 --- a/xlators/cluster/dht/src/tier.h +++ b/xlators/cluster/dht/src/tier.h @@ -27,9 +27,11 @@ #define DEFAULT_PROMOTE_FREQ_SEC 120 #define DEFAULT_DEMOTE_FREQ_SEC 120 +#define DEFAULT_WRITE_FREQ_SEC 120 +#define DEFAULT_READ_FREQ_SEC 120 /* - * Size of timer wheel. We would not promote or demote lesd + * Size of timer wheel. We would not promote or demote less * frequently than this number. */ #define TIMER_SECS 3600 @@ -38,11 +40,11 @@ #include <ctype.h> #include <sys/stat.h> -#define DEMOTION_QFILE "/var/run/gluster/demotequeryfile" -#define PROMOTION_QFILE "/var/run/gluster/promotequeryfile" +#define PROMOTION_QFILE "promotequeryfile" +#define DEMOTION_QFILE "demotequeryfile" #define GET_QFILE_PATH(is_promotion)\ - (is_promotion) ? PROMOTION_QFILE : DEMOTION_QFILE + (is_promotion) ? promotion_qfile : demotion_qfile typedef struct _query_cbk_args { xlator_t *this; diff --git a/xlators/features/changetimerecorder/src/changetimerecorder.c b/xlators/features/changetimerecorder/src/changetimerecorder.c index 21772ab1a7e..6be20819107 100644 --- a/xlators/features/changetimerecorder/src/changetimerecorder.c +++ b/xlators/features/changetimerecorder/src/changetimerecorder.c @@ -10,6 +10,7 @@ #include <ctype.h> #include <sys/uio.h> +#include "gfdb_sqlite3.h" #include "ctr-helper.h" /****************************WRITEV********************************************/ diff --git a/xlators/features/changetimerecorder/src/ctr-helper.c b/xlators/features/changetimerecorder/src/ctr-helper.c index 69d64d66690..7341c11d540 100644 --- a/xlators/features/changetimerecorder/src/ctr-helper.c +++ b/xlators/features/changetimerecorder/src/ctr-helper.c @@ -8,6 +8,7 @@ cases as published by the Free Software Foundation. */ +#include "gfdb_sqlite3.h" #include "ctr-helper.h" |