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"  | 
