summaryrefslogtreecommitdiffstats
path: root/xlators/features/changelog/lib/src/gf-changelog-process.c
diff options
context:
space:
mode:
authorVenky Shankar <vshankar@redhat.com>2014-02-19 20:47:46 +0530
committerVenky Shankar <vshankar@redhat.com>2014-05-14 05:10:15 -0700
commitd2db585ce7e26851178104433fa9422482d8719e (patch)
tree2e52f15cf261906debd8ec54106ffe9f84af881e /xlators/features/changelog/lib/src/gf-changelog-process.c
parentbfde478cedda8267134ee3807c8db5e042115eae (diff)
features/changelog : historical journal consumption.
Facilitates Glusterfs with the ability to detect file-operations happened in past by scanning the back-end(brick-level) glusterfs journal (changelog). Design: * List of changelogs produces in one perfectly running session are stored in htime file which also holds necessary information about the session start and end time. * Involves fixed sized seeks to identify N'th changelog in the list. * Requires O(log n), (where n is number of changelogs in the list), time to identify the end changelog for the given start-end time interval. Currently the background processing of changelogs is sub optimal. BZ 1097041 tracks the development effort. For complete design, refer the below link: http://lists.nongnu.org/archive/html/gluster-devel/2014-02/msg00206.html Change-Id: I27e49f75e492e843084d0ecaf9130224d08462a0 BUG: 1091961 Signed-off-by: Ajeet Jha <ajha@redhat.com> Signed-off-by: Venky Shankar <vshankar@redhat.com> Signed-off-by: Ajeet Jha <ajha@redhat.com> Reviewed-on: http://review.gluster.org/6930 Reviewed-by: Kotresh HR <khiremat@redhat.com> Tested-by: Gluster Build System <jenkins@build.gluster.com>
Diffstat (limited to 'xlators/features/changelog/lib/src/gf-changelog-process.c')
-rw-r--r--xlators/features/changelog/lib/src/gf-changelog-process.c57
1 files changed, 53 insertions, 4 deletions
diff --git a/xlators/features/changelog/lib/src/gf-changelog-process.c b/xlators/features/changelog/lib/src/gf-changelog-process.c
index 3ea2700c62b..3b8d2683672 100644
--- a/xlators/features/changelog/lib/src/gf-changelog-process.c
+++ b/xlators/features/changelog/lib/src/gf-changelog-process.c
@@ -459,8 +459,49 @@ gf_changelog_decode (xlator_t *this, gf_changelog_t *gfc, int from_fd,
return ret;
}
-static int
-gf_changelog_consume (xlator_t *this, gf_changelog_t *gfc, char *from_path)
+int
+gf_changelog_publish (xlator_t *this, gf_changelog_t *gfc, char *from_path)
+{
+ int ret = 0;
+ char dest[PATH_MAX] = {0,};
+ char to_path[PATH_MAX] = {0,};
+ struct stat stbuf = {0,};
+
+ (void) snprintf (to_path, PATH_MAX, "%s%s",
+ gfc->gfc_current_dir, basename (from_path));
+
+ /* handle zerob file that wont exist in current */
+ ret = stat (from_path, &stbuf);
+ if (ret)
+ goto out;
+
+ if (stbuf.st_size == 0) {
+ ret = unlink (from_path);
+ if (ret)
+ gf_log (this->name, GF_LOG_ERROR,
+ "could not unlink %s (reason %s)",
+ from_path, strerror (errno));
+ goto out;
+ }
+
+ (void) snprintf (dest, PATH_MAX, "%s%s",
+ gfc->gfc_processing_dir, basename (from_path));
+
+ ret = rename (to_path, dest);
+ if (ret){
+ gf_log (this->name, GF_LOG_ERROR,
+ "error moving %s to processing dir"
+ " (reason: %s)", to_path, strerror (errno));
+ }
+
+out:
+ return ret;
+}
+
+int
+gf_changelog_consume (xlator_t *this,
+ gf_changelog_t *gfc,
+ char *from_path, gf_boolean_t no_publish)
{
int ret = -1;
int fd1 = 0;
@@ -472,6 +513,7 @@ gf_changelog_consume (xlator_t *this, gf_changelog_t *gfc, char *from_path)
ret = stat (from_path, &stbuf);
if (ret || !S_ISREG(stbuf.st_mode)) {
+ ret = -1;
gf_log (this->name, GF_LOG_ERROR,
"stat failed on changelog file: %s", from_path);
goto out;
@@ -506,6 +548,8 @@ gf_changelog_consume (xlator_t *this, gf_changelog_t *gfc, char *from_path)
if (!ret) {
/* move it to processing on a successfull
decode */
+ if (no_publish == _gf_true)
+ goto close_fd;
ret = rename (to_path, dest);
if (ret)
gf_log (this->name, GF_LOG_ERROR,
@@ -516,10 +560,15 @@ gf_changelog_consume (xlator_t *this, gf_changelog_t *gfc, char *from_path)
/* remove it from .current if it's an empty file */
if (zerob) {
+ if (no_publish == _gf_true) {
+ ret = 0;
+ goto close_fd;
+ }
+
ret = unlink (to_path);
if (ret)
gf_log (this->name, GF_LOG_ERROR,
- "could not unlink %s (reason: %s",
+ "could not unlink %s (reason: %s)",
to_path, strerror (errno));
}
}
@@ -546,7 +595,7 @@ gf_changelog_ext_change (xlator_t *this,
alo = 1;
gf_log (this->name, GF_LOG_DEBUG,
"processing changelog: %s", path);
- ret = gf_changelog_consume (this, gfc, path);
+ ret = gf_changelog_consume (this, gfc, path, _gf_false);
}
if (ret)