From 3a35f975fceb89c5ae0e8e3e189545f6fceaf6e5 Mon Sep 17 00:00:00 2001 From: Pranith Kumar K Date: Thu, 1 May 2014 10:29:54 +0530 Subject: mgmt/gluster: Use fsync instead of O_SYNC Glusterd uses O_SYNC to write to temp file then performs renames to the actual file and performs fsync on parent directory. Until this rename happens syncing writes to the file can be deferred. In this patch O_SYNC open of temp file is removed and fsync of the fd before rename is done. Change-Id: Ie7da161b0daec845c7dcfab4154cc45c2f49d825 BUG: 908277 Signed-off-by: Pranith Kumar K Reviewed-on: http://review.gluster.org/7370 Reviewed-by: Krishnan Parthasarathi Reviewed-by: Raghavendra Bhat Tested-by: Gluster Build System Reviewed-by: Anand Avati --- xlators/mgmt/glusterd/src/glusterd-store.c | 53 ++++++++++++------------------ 1 file changed, 21 insertions(+), 32 deletions(-) (limited to 'xlators/mgmt/glusterd/src/glusterd-store.c') diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index 26de774e3f5..eda176d1b6b 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -330,8 +330,6 @@ glusterd_store_perform_brick_store (glusterd_brickinfo_t *brickinfo) out: if (ret && (fd > 0)) gf_store_unlink_tmppath (brickinfo->shandle); - if (fd > 0) - close (fd); gf_log (THIS->name, GF_LOG_DEBUG, "Returning %d", ret); return ret; } @@ -1094,8 +1092,6 @@ glusterd_store_perform_rbstate_store (glusterd_volinfo_t *volinfo) out: if (ret && (fd > 0)) gf_store_unlink_tmppath (volinfo->rb_shandle); - if (fd > 0) - close (fd); gf_log (THIS->name, GF_LOG_DEBUG, "Returning %d", ret); return ret; } @@ -1175,8 +1171,6 @@ glusterd_store_perform_node_state_store (glusterd_volinfo_t *volinfo) out: if (ret && (fd > 0)) gf_store_unlink_tmppath (volinfo->node_state_shandle); - if (fd > 0) - close (fd); gf_log (THIS->name, GF_LOG_DEBUG, "Returning %d", ret); return ret; } @@ -1205,8 +1199,6 @@ glusterd_store_perform_volume_store (glusterd_volinfo_t *volinfo) out: if (ret && (fd > 0)) gf_store_unlink_tmppath (volinfo->shandle); - if (fd > 0) - close (fd); gf_log (THIS->name, GF_LOG_DEBUG, "Returning %d", ret); return ret; } @@ -1733,7 +1725,6 @@ out: gf_store_unlink_tmppath (handle); if (handle->fd > 0) { - close (handle->fd); handle->fd = 0; } } @@ -2705,9 +2696,9 @@ glusterd_store_options (xlator_t *this, dict_t *opts) if (ret) goto out; out: + if ((ret < 0) && (fd > 0)) + gf_store_unlink_tmppath (shandle); gf_store_handle_destroy (shandle); - if (fd >=0 ) - close (fd); return ret; } @@ -3455,9 +3446,6 @@ out: ret = -1; } - if (fd > 0) - close (fd); - gf_log (this->name, GF_LOG_TRACE, "Returning %d", ret); return ret; } @@ -3681,8 +3669,6 @@ glusterd_store_perform_peer_store (glusterd_peerinfo_t *peerinfo) out: if (ret && (fd > 0)) gf_store_unlink_tmppath (peerinfo->shandle); - if (fd > 0) - close (fd); gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); return ret; } @@ -4114,28 +4100,28 @@ out: int glusterd_store_save_quota_version_and_cksum (glusterd_volinfo_t *volinfo) { - int ret = -1; - char cksum_path[PATH_MAX] = {0,}; - char path[PATH_MAX] = {0,}; - xlator_t *this = NULL; - glusterd_conf_t *conf = NULL; - char buf[256] = {0,}; - int fd = -1; + gf_store_handle_t *shandle = NULL; + glusterd_conf_t *conf = NULL; + xlator_t *this = NULL; + char path[PATH_MAX] = {0}; + char cksum_path[PATH_MAX] = {0,}; + char buf[256] = {0}; + int fd = -1; + int32_t ret = -1; this = THIS; - GF_ASSERT (this); conf = this->private; - GF_ASSERT (conf); GLUSTERD_GET_VOLUME_DIR (path, volinfo, conf); snprintf (cksum_path, sizeof (cksum_path), "%s/%s", path, GLUSTERD_VOL_QUOTA_CKSUM_FILE); - fd = open (cksum_path, O_RDWR | O_APPEND | O_CREAT| O_TRUNC, 0600); + ret = gf_store_handle_new (cksum_path, &shandle); + if (ret) + goto out; - if (-1 == fd) { - gf_log (this->name, GF_LOG_ERROR, "Unable to open %s," - "Reason: %s", cksum_path, strerror (errno)); + fd = gf_store_mkstemp (shandle); + if (fd <= 0) { ret = -1; goto out; } @@ -4155,10 +4141,13 @@ glusterd_store_save_quota_version_and_cksum (glusterd_volinfo_t *volinfo) goto out; } - ret = 0; + ret = gf_store_rename_tmppath (shandle); + if (ret) + goto out; out: - if (fd != -1) - close (fd); + if ((ret < 0) && (fd > 0)) + gf_store_unlink_tmppath (shandle); + gf_store_handle_destroy (shandle); return ret; } -- cgit