diff options
author | Pranith Kumar K <pkarampu@redhat.com> | 2014-05-01 10:29:54 +0530 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2014-05-05 13:52:51 -0700 |
commit | 3a35f975fceb89c5ae0e8e3e189545f6fceaf6e5 (patch) | |
tree | 089844750210ac0e0899c3455740412e871181dc /libglusterfs/src | |
parent | 4cf348fcb683ff8c5b85233610dc9aa8835bd532 (diff) |
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 <pkarampu@redhat.com>
Reviewed-on: http://review.gluster.org/7370
Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com>
Reviewed-by: Raghavendra Bhat <raghavendra@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'libglusterfs/src')
-rw-r--r-- | libglusterfs/src/store.c | 22 | ||||
-rw-r--r-- | libglusterfs/src/store.h | 1 |
2 files changed, 19 insertions, 4 deletions
diff --git a/libglusterfs/src/store.c b/libglusterfs/src/store.c index 5beafaf3551..55a2ab459e2 100644 --- a/libglusterfs/src/store.c +++ b/libglusterfs/src/store.c @@ -59,20 +59,19 @@ gf_store_handle_create_on_absence (gf_store_handle_t **shandle, int32_t gf_store_mkstemp (gf_store_handle_t *shandle) { - int fd = -1; char tmppath[PATH_MAX] = {0,}; GF_VALIDATE_OR_GOTO ("store", shandle, out); GF_VALIDATE_OR_GOTO ("store", shandle->path, out); snprintf (tmppath, sizeof (tmppath), "%s.tmp", shandle->path); - fd = open (tmppath, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, 0600); - if (fd <= 0) { + shandle->tmp_fd = open (tmppath, O_RDWR | O_CREAT | O_TRUNC, 0600); + if (shandle->tmp_fd < 0) { gf_log ("", GF_LOG_ERROR, "Failed to open %s, error: %s", tmppath, strerror (errno)); } out: - return fd; + return shandle->tmp_fd; } int @@ -130,6 +129,12 @@ gf_store_rename_tmppath (gf_store_handle_t *shandle) GF_VALIDATE_OR_GOTO ("store", shandle, out); GF_VALIDATE_OR_GOTO ("store", shandle->path, out); + ret = fsync (shandle->tmp_fd); + if (ret) { + gf_log (THIS->name, GF_LOG_ERROR, "Failed to fsync %s, " + "error: %s", shandle->path, strerror (errno)); + goto out; + } snprintf (tmppath, sizeof (tmppath), "%s.tmp", shandle->path); ret = rename (tmppath, shandle->path); if (ret) { @@ -140,6 +145,10 @@ gf_store_rename_tmppath (gf_store_handle_t *shandle) ret = gf_store_sync_direntry (tmppath); out: + if (shandle && shandle->tmp_fd >= 0) { + close (shandle->tmp_fd); + shandle->tmp_fd = -1; + } return ret; } @@ -161,6 +170,10 @@ gf_store_unlink_tmppath (gf_store_handle_t *shandle) ret = 0; } out: + if (shandle && shandle->tmp_fd >= 0) { + close (shandle->tmp_fd); + shandle->tmp_fd = -1; + } return ret; } @@ -390,6 +403,7 @@ gf_store_handle_new (char *path, gf_store_handle_t **handle) shandle->path = spath; shandle->locked = F_ULOCK; *handle = shandle; + shandle->tmp_fd = -1; ret = 0; out: diff --git a/libglusterfs/src/store.h b/libglusterfs/src/store.h index 337103ff73e..beb17ac4a2f 100644 --- a/libglusterfs/src/store.h +++ b/libglusterfs/src/store.h @@ -20,6 +20,7 @@ struct gf_store_handle_ { char *path; int fd; + int tmp_fd; FILE *read; int locked; /* state of lockf() */ }; |