core: add dht_is_linkfile helper procedure.

components other than distribute (like marker to exclude linkfiles
from being accounted) also need awareness of what constitutes a
linkfile. Hence its good to separate out this functionality into
core.

Change-Id: Ib944eeacc991bb1de464c9e73ee409fc7a689ff1
BUG: 1022995
Signed-off-by: Raghavendra G <rgowdapp@redhat.com>
Reviewed-on: http://review.gluster.org/6152
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
This commit is contained in:
Raghavendra G 2013-11-14 17:10:09 +05:30 committed by Anand Avati
parent 3f1ebe0298
commit 1a2f51144f
5 changed files with 51 additions and 7 deletions

View File

@ -3111,3 +3111,34 @@ out:
fclose (file);
return running;
}
static inline int
dht_is_linkfile_key (dict_t *this, char *key, data_t *value, void *data)
{
gf_boolean_t *linkfile_key_found = NULL;
if (!data)
goto out;
linkfile_key_found = data;
*linkfile_key_found = _gf_true;
out:
return 0;
}
inline gf_boolean_t
dht_is_linkfile (struct iatt *buf, dict_t *dict)
{
gf_boolean_t linkfile_key_found = _gf_false;
if (!IS_DHT_LINKFILE_MODE (buf))
return _gf_false;
dict_foreach_fnmatch (dict, "*."DHT_LINKFILE_STR, dht_is_linkfile_key,
&linkfile_key_found);
return linkfile_key_found;
}

View File

@ -619,4 +619,11 @@ gf_boolean_t
gf_is_service_running (char *pidfile, int *pid);
int
gf_skip_header_section (int fd, int header_len);
struct iatt;
struct _dict;
inline gf_boolean_t
dht_is_linkfile (struct iatt *buf, struct _dict *dict);
#endif /* _COMMON_UTILS_H */

View File

@ -171,6 +171,16 @@
*/
#define DEFAULT_GLUSTERD_SOCKFILE DATADIR "/run/glusterd.socket"
/* features/marker-quota also needs to have knowledge of link-files so as to
* exclude them from accounting.
*/
#define DHT_LINKFILE_MODE (S_ISVTX)
#define IS_DHT_LINKFILE_MODE(iabuf) ((st_mode_from_ia ((iabuf)->ia_prot, \
(iabuf)->ia_type) & ~S_IFMT)\
== DHT_LINKFILE_MODE)
#define DHT_LINKFILE_STR "linkto"
/* NOTE: add members ONLY at the end (just before _MAXVALUE) */
typedef enum {
GF_FOP_NULL = 0,

View File

@ -332,12 +332,7 @@ typedef enum {
#define DHT_MIGRATION_IN_PROGRESS 1
#define DHT_MIGRATION_COMPLETED 2
#define DHT_LINKFILE_MODE (S_ISVTX)
#define check_is_linkfile(i,s,x,n) ( \
((st_mode_from_ia ((s)->ia_prot, (s)->ia_type) & ~S_IFMT) \
== DHT_LINKFILE_MODE) && \
dict_get (x, n))
#define check_is_linkfile(i,s,x,n) (IS_DHT_LINKFILE_MODE (s) && dict_get (x, n))
#define IS_DHT_MIGRATION_PHASE2(buf) ( \
IA_ISREG ((buf)->ia_type) && \

View File

@ -607,7 +607,8 @@ dht_init (xlator_t *this)
}
GF_OPTION_INIT ("xattr-name", conf->xattr_name, str, err);
gf_asprintf (&conf->link_xattr_name, "%s.linkto", conf->xattr_name);
gf_asprintf (&conf->link_xattr_name, "%s."DHT_LINKFILE_STR,
conf->xattr_name);
gf_asprintf (&conf->wild_xattr_name, "%s*", conf->xattr_name);
if (!conf->link_xattr_name || !conf->wild_xattr_name) {
goto err;