From d2db585ce7e26851178104433fa9422482d8719e Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Wed, 19 Feb 2014 20:47:46 +0530 Subject: 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 Signed-off-by: Venky Shankar Signed-off-by: Ajeet Jha Reviewed-on: http://review.gluster.org/6930 Reviewed-by: Kotresh HR Tested-by: Gluster Build System --- .../changelog/lib/examples/c/get-history.c | 109 +++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 xlators/features/changelog/lib/examples/c/get-history.c (limited to 'xlators/features/changelog/lib/examples/c') diff --git a/xlators/features/changelog/lib/examples/c/get-history.c b/xlators/features/changelog/lib/examples/c/get-history.c new file mode 100644 index 00000000000..33eb8c32d4d --- /dev/null +++ b/xlators/features/changelog/lib/examples/c/get-history.c @@ -0,0 +1,109 @@ +/* + Copyright (c) 2013 Red Hat, Inc. + This file is part of GlusterFS. + + This file is licensed to you under your choice of the GNU Lesser + General Public License, version 3 or any later version (LGPLv3 or + later), or the GNU General Public License, version 2 (GPLv2), in all + cases as published by the Free Software Foundation. +*/ + +/** + * get set of new changes every 10 seconds (just print the file names) + * + * Compile it using: + * gcc -o gethistory `pkg-config --cflags libgfchangelog` get-history.c \ + * `pkg-config --libs libgfchangelog` + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "changelog.h" + +#define handle_error(fn) \ + printf ("%s (reason: %s)\n", fn, strerror (errno)) + +int +main (int argc, char ** argv) +{ + int i = 0; + int ret = 0; + ssize_t nr_changes = 0; + ssize_t changes = 0; + char fbuf[PATH_MAX] = {0,}; + unsigned long end_ts = 0; + + ret = gf_changelog_register ("/export1/v1/b1", + "/tmp/scratch_v1", "/tmp/scratch_v1/changes.log", + 9, 5); + if (ret) { + handle_error ("register failed"); + goto out; + } + + int a, b; + printf ("give the two numbers start and end\t"); + scanf ("%d%d", &a, &b); + ret = gf_history_changelog ("/export1/v1/b1/.glusterfs/changelogs",a, b, 3, &end_ts); + if (ret == -1) { + printf ("history failed"); + goto out; + } + + printf ("end time till when changelog available : %d , ret(%d) \t", end_ts, ret); + fflush(stdout); + + while (1) { + nr_changes = gf_history_changelog_scan (); + printf ("scanned, nr_changes : %d\n",nr_changes); + if (nr_changes < 0) { + handle_error ("scan(): "); + break; + } + + if (nr_changes == 0) { + printf ("done scanning \n"); + goto out; + } + + printf ("Got %ld changelog files\n", nr_changes); + + while ( (changes = + gf_history_changelog_next_change (fbuf, PATH_MAX)) > 0) { + printf ("changelog file [%d]: %s\n", ++i, fbuf); + + /* process changelog */ + /* ... */ + /* ... */ + /* ... */ + /* done processing */ + + ret = gf_history_changelog_done (fbuf); + if (ret) + handle_error ("gf_changelog_done"); + } + /* + if (changes == -1) + handle_error ("gf_changelog_next_change"); + if (nr_changes ==1){ + printf("continue scanning\n"); + } + + if(nr_changes == 0){ + printf("done scanning \n"); + goto out; + } + */ + } + + +out: + return ret; +} -- cgit