diff options
author | Ajeet Jha <ajha@redhat.com> | 2014-08-23 19:06:45 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2014-08-26 03:16:53 -0700 |
commit | acabde2c297c4175946565017ba17a251ad3fb1c (patch) | |
tree | 45a48a9f1c68b1966ce9c68dbb456997f62bdc63 /xlators/features/changelog/src/changelog-helpers.c | |
parent | b56751b3b9a9ed3cceb2f0d221fa40ef94a8d516 (diff) |
features/changelog: Crash consistency of changelog wrt snapshot
This patch introduces call-path fop details logging for data operations
in CHANGELOG.SNAP. This feature is enabled with barrier-enable
notification and disabled with barrier-disable notification.
Change-Id: Ib548d34203eb99cea478a6baff402e82251c73a4
BUG: 1128093
Signed-off-by: Ajeet Jha <ajha@redhat.com>
Reviewed-on: http://review.gluster.org/8533
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/features/changelog/src/changelog-helpers.c')
-rw-r--r-- | xlators/features/changelog/src/changelog-helpers.c | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/xlators/features/changelog/src/changelog-helpers.c b/xlators/features/changelog/src/changelog-helpers.c index 07c6096dce5..9dccf45187c 100644 --- a/xlators/features/changelog/src/changelog-helpers.c +++ b/xlators/features/changelog/src/changelog-helpers.c @@ -337,6 +337,101 @@ out: return ret; } +/* Description: + * Opens the snap changelog to log call path fops in it. + * This changelos name is "CHANGELOG.SNAP", stored in + * path ".glusterfs/changelogs/csnap". + * Returns: + * 0 : On success. + * -1 : On failure. + */ +int +changelog_snap_open (xlator_t *this, + changelog_priv_t *priv) +{ + int fd = -1; + int ret = 0; + int flags = 0; + char buffer[1024] = {0,}; + char c_snap_path[PATH_MAX] = {0,}; + char csnap_dir_path[PATH_MAX] = {0,}; + + CHANGELOG_FILL_CSNAP_DIR(priv->changelog_dir, csnap_dir_path); + + (void) snprintf (c_snap_path, PATH_MAX, + "%s/"CSNAP_FILE_NAME, + csnap_dir_path); + + flags |= (O_CREAT | O_RDWR | O_TRUNC); + + fd = open (c_snap_path, flags, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + if (fd < 0) { + gf_log (this->name, GF_LOG_ERROR, + "unable to open %s file " + "reason:(%s)", c_snap_path, strerror (errno)); + ret = -1; + goto out; + } + priv->c_snap_fd = fd; + + (void) snprintf (buffer, 1024, CHANGELOG_HEADER, + CHANGELOG_VERSION_MAJOR, + CHANGELOG_VERSION_MINOR, + priv->ce->encoder); + ret = changelog_snap_write_change (priv, buffer, strlen (buffer)); + if (ret < 0) { + close (priv->c_snap_fd); + priv->c_snap_fd = -1; + goto out; + } + +out: + return ret; +} + +/* + * Description: + * Starts logging fop details in CSNAP journal. + * Returns: + * 0 : On success. + * -1 : On Failure. + */ +int +changelog_snap_logging_start (xlator_t *this, + changelog_priv_t *priv) +{ + int ret = 0; + + ret = changelog_snap_open (this, priv); + gf_log (this->name, GF_LOG_INFO, + "Now starting to log in call path"); + + return ret; +} + +/* + * Description: + * Stops logging fop details in CSNAP journal. + * Returns: + * 0 : On success. + * -1 : On Failure. + */ +int +changelog_snap_logging_stop (xlator_t *this, + changelog_priv_t *priv) +{ + int ret = 0; + + close (priv->c_snap_fd); + priv->c_snap_fd = -1; + + gf_log (this->name, GF_LOG_INFO, + "Stopped to log in call path"); + + return ret; +} + int changelog_open (xlator_t *this, changelog_priv_t *priv) @@ -424,11 +519,72 @@ changelog_fill_rollover_data (changelog_log_data_t *cld, gf_boolean_t is_last) } int +changelog_snap_write_change (changelog_priv_t *priv, char *buffer, size_t len) +{ + return changelog_write (priv->c_snap_fd, buffer, len); +} + +int changelog_write_change (changelog_priv_t *priv, char *buffer, size_t len) { return changelog_write (priv->changelog_fd, buffer, len); } +/* + * Descriptions: + * Writes fop details in ascii format to CSNAP. + * Issues: + * Not Encoding agnostic. + * Returns: + * 0 : On Success. + * -1 : On Failure. + */ +int +changelog_snap_handle_ascii_change (xlator_t *this, + changelog_log_data_t *cld) +{ + size_t off = 0; + size_t gfid_len = 0; + char *gfid_str = NULL; + char *buffer = NULL; + changelog_priv_t *priv = NULL; + int ret = 0; + + if (this == NULL) { + ret = -1; + goto out; + } + + priv = this->private; + + if (priv == NULL) { + ret = -1; + goto out; + } + + gfid_str = uuid_utoa (cld->cld_gfid); + gfid_len = strlen (gfid_str); + + /* extra bytes for decorations */ + buffer = alloca (gfid_len + cld->cld_ptr_len + 10); + CHANGELOG_STORE_ASCII (priv, buffer, + off, gfid_str, gfid_len, cld); + + CHANGELOG_FILL_BUFFER (buffer, off, "\0", 1); + + ret = changelog_snap_write_change (priv, buffer, off); + + if (ret < 0) { + gf_log (this->name, GF_LOG_ERROR, + "error writing csnap to disk"); + } + gf_log (this->name, GF_LOG_INFO, + "Successfully wrote to csnap"); + ret = 0; +out: + return ret; +} + inline int changelog_handle_change (xlator_t *this, changelog_priv_t *priv, changelog_log_data_t *cld) |