From 8462dd88ad3531837ebfccd17a083467faa40227 Mon Sep 17 00:00:00 2001 From: Amar Tumballi Date: Thu, 26 Feb 2009 08:09:25 -0800 Subject: volumefile modification awareness to make sure there are no inconsistencies. Complete (including feature to properly umount) in my sense. Signed-off-by: Anand V. Avati --- xlators/mount/fuse/src/fuse-bridge.c | 40 ++++++++++++++++++++++++----- xlators/mount/fuse/utils/mount.glusterfs.in | 9 ++++++- xlators/mount/fuse/utils/mount_glusterfs.in | 12 ++++++++- 3 files changed, 53 insertions(+), 8 deletions(-) (limited to 'xlators/mount') diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index e876799a2..4affd40d5 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -53,8 +53,9 @@ /* TODO: when supporting posix acl, remove this definition */ #define DISABLE_POSIX_ACL -#define ZR_MOUNTPOINT_OPT "mountpoint" -#define ZR_DIRECT_IO_OPT "direct-io-mode" +#define ZR_MOUNTPOINT_OPT "mountpoint" +#define ZR_DIRECT_IO_OPT "direct-io-mode" +#define ZR_STRICT_VOLFILE_CHECK "strict-volfile-check" #define BIG_FUSE_CHANNEL_SIZE 1048576 @@ -72,7 +73,7 @@ struct fuse_private { uint32_t direct_io_mode; double entry_timeout; double attribute_timeout; - + gf_boolean_t strict_volfile_check; }; typedef struct fuse_private fuse_private_t; @@ -2553,6 +2554,10 @@ int32_t notify (xlator_t *this, int32_t event, void *data, ...) { + int32_t ret = 0; + fuse_private_t *private = NULL; + + private = this->private; switch (event) { @@ -2577,8 +2582,6 @@ notify (xlator_t *this, int32_t event, #endif /* DARWIN */ { - fuse_private_t *private = this->private; - int32_t ret = 0; if (!private->fuse_thread_started) { @@ -2597,6 +2600,21 @@ notify (xlator_t *this, int32_t event, case GF_EVENT_PARENT_UP: { default_notify (this, GF_EVENT_PARENT_UP, data); + break; + } + case GF_EVENT_VOLFILE_MODIFIED: + { + gf_log ("fuse", GF_LOG_CRITICAL, + "remote volume file changed, try re-mounting"); + if (private->strict_volfile_check) { + //fuse_session_remove_chan (private->ch); + //fuse_session_destroy (private->se); + //fuse_unmount (private->mount_point, private->ch); + /* TODO: Above code if works, will be a cleaner way, + but for now, lets just achieve what we want */ + raise (SIGTERM); + } + break; } default: break; @@ -2736,7 +2754,14 @@ init (xlator_t *this_xl) if (value_string) { ret = gf_string2boolean (value_string, &priv->direct_io_mode); } - + + priv->strict_volfile_check = 0; + ret = dict_get_str (options, ZR_STRICT_VOLFILE_CHECK, &value_string); + if (value_string) { + ret = gf_string2boolean (value_string, + &priv->strict_volfile_check); + } + priv->ch = fuse_mount (priv->mount_point, &args); if (priv->ch == NULL) { if (errno == ENOTCONN) { @@ -2851,5 +2876,8 @@ struct volume_options options[] = { { .key = {"entry-timeout"}, .type = GF_OPTION_TYPE_DOUBLE }, + { .key = {"strict-volfile-check"}, + .type = GF_OPTION_TYPE_BOOL + }, { .key = {NULL} }, }; diff --git a/xlators/mount/fuse/utils/mount.glusterfs.in b/xlators/mount/fuse/utils/mount.glusterfs.in index 481fd265f..58da509f1 100755 --- a/xlators/mount/fuse/utils/mount.glusterfs.in +++ b/xlators/mount/fuse/utils/mount.glusterfs.in @@ -66,6 +66,10 @@ start_glusterfs () cmd_line=$(echo "$cmd_line --log-file=$log_file"); fi + if [ -n "$volfile_check" ]; then + cmd_line=$(echo "$cmd_line --volfile-check"); + fi + if [ -n "$direct_io_mode" ]; then cmd_line=$(echo "$cmd_line --direct-io-mode=$direct_io_mode"); fi @@ -115,7 +119,9 @@ main () volume_name=$(echo "$options" | sed -n 's/.*volume-name=\([^,]*\).*/\1/p'); volume_id=$(echo "$options" | sed -n 's/.*volume-id=\([^,]*\).*/\1/p'); - + + volfile_check=$(echo "$options" | sed -n 's/.*volfile-check=\([^,]*\).*/\1/p'); + volfile_loc="$1"; [ -r "$volfile_loc" ] || { @@ -131,6 +137,7 @@ main () -e 's/[,]*log-level=[^,]*//' \ -e 's/[,]*volume-name=[^,]*//' \ -e 's/[,]*direct-io-mode=[^,]*//' \ + -e 's/[,]*volfile-check=[^,]*//' \ -e 's/[,]*transport=[^,]*//' \ -e 's/[,]*volume-id=[^,]*//'); # following line is product of love towards sed diff --git a/xlators/mount/fuse/utils/mount_glusterfs.in b/xlators/mount/fuse/utils/mount_glusterfs.in index 1376a8897..b064e1ead 100755 --- a/xlators/mount/fuse/utils/mount_glusterfs.in +++ b/xlators/mount/fuse/utils/mount_glusterfs.in @@ -66,8 +66,12 @@ start_glusterfs () cmd_line=$(echo "$cmd_line --log-file=$log_file"); fi + if [ -n "$volfile_check" ]; then + cmd_line=$(echo "$cmd_line --volfile-check"); + fi + if [ -n "$direct_io_mode" ]; then - cmd_line=$(echo "$cmd_line --direct-io-mode=$direct_io_mode"); + cmd_line=$(echo "$cmd_line --disable-direct-io-mode"); fi if [ -z "$volfile_loc" ]; then @@ -107,6 +111,7 @@ main () direct_io_mode="" volume_name="" new_fs_options="" + volfile_check="" while getopts o: opt; do case "$opt" in @@ -128,6 +133,10 @@ main () direct_io_mode=$(echo "$options" | sed -n 's/.*direct-io-mode=\([^,]*\).*/\1/p'); } + [ -z $volfile_check ] && { + volfile_check=$(echo "$options" | sed -n 's/.*volfile-check=\([^,]*\).*/\1/p'); + } + [ -z $volume_name ] && { volume_name=$(echo "$options" | sed -n 's/.*volume-name=\([^,]*\).*/\1/p'); } @@ -139,6 +148,7 @@ main () this_option=$(echo "$options" | sed -e 's/[,]*log-file=[^,]*//' \ -e 's/[,]*log-level=[^,]*//' \ -e 's/[,]*volume-name=[^,]*//' \ + -e 's/[,]*volfile-check=[^,]*//' \ -e 's/[,]*direct-io-mode=[^,]*//' \ -e 's/[,]*transport=[^,]*//' \ -e 's/[,]*volume-id=[^,]*//'); -- cgit