From a1904d84f7a62f0defe195d3c316fbe95adb51e4 Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Mon, 28 May 2012 12:10:04 +0530 Subject: glusterd / geo-rep : fix rotating slave log file Attempt to rotate log files for slave that are local. Remote slaves (identified by the 'ssh' scheme) are ignored. Change-Id: Iff46462c388d39433917159c0e89e7ac9e772c0f BUG: 821443 Signed-off-by: Venky Shankar Reviewed-on: http://review.gluster.com/3459 Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- xlators/mgmt/glusterd/src/glusterd-geo-rep.c | 74 +++++++++++++++++++--------- 1 file changed, 52 insertions(+), 22 deletions(-) (limited to 'xlators/mgmt/glusterd') diff --git a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c index 4d3f5200209..847fed49eb8 100644 --- a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c +++ b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c @@ -410,6 +410,25 @@ glusterd_gsync_get_session_owner (char *master, char *slave, char *session_owner return glusterd_query_extutil (session_owner, &runner); } +/* check whether @slave is local or remote. normalized + * urls starting with ssh are considered to be remote + * @returns + * 1 if slave is remote + * 0 is slave is local + */ +int +glusterd_gsync_slave_is_remote (char *slave) +{ + int ret = 0; + char *ssh_pos = NULL; + + ssh_pos = strstr(slave, "ssh://"); + if ( ssh_pos && ((ssh_pos - slave) == 0) ) + ret = 1; + + return ret; +} + int glusterd_gsync_get_slave_log_file (char *master, char *slave, char *log_file) { @@ -1628,7 +1647,6 @@ int glusterd_send_log_rotate_signal (pid_t pid, char *logfile1, char *logfile2) { int ret = 0; - struct stat stbuf = {0,}; char rlogfile[PATH_MAX] = {0,}; time_t rottime = 0; @@ -1641,24 +1659,19 @@ glusterd_send_log_rotate_signal (pid_t pid, char *logfile1, char *logfile2) if (ret) gf_log ("", GF_LOG_ERROR, "rename failed for geo-rep log file"); - - snprintf (rlogfile, sizeof (rlogfile), "%s.%"PRIu64, logfile2, - (uint64_t) rottime); - ret = stat (logfile2, &stbuf); - if (ret) { - if (errno != ENOENT) - gf_log("", GF_LOG_ERROR, "stat failed for slave log" - " file: %s", logfile2); - else { - gf_log ("", GF_LOG_DEBUG, "Slave is not local, skipping rotation"); - ret = 0; - } + if (!*logfile2) { + gf_log ("", GF_LOG_DEBUG, "Slave is not local," + " skipping rotation"); + ret = 0; goto out; } + (void) snprintf (rlogfile, sizeof (rlogfile), "%s.%"PRIu64, logfile2, + (uint64_t) rottime); ret = rename (logfile2, rlogfile); if (ret) - gf_log ("", GF_LOG_ERROR, "rename failed for geo-rep slave log file"); + gf_log ("", GF_LOG_ERROR, "rename failed for geo-rep slave" + " log file"); out: ret = glusterd_send_sigcont (-pid); @@ -1727,11 +1740,17 @@ glusterd_do_gsync_log_rotate (char *master, char *slave, uuid_t *uuid, char **op if (ret) goto out; - /* slave log file */ + /* check if slave is local or remote */ + ret = glusterd_gsync_slave_is_remote (slave); + if (ret) + goto do_rotate; + + /* slave log file - slave is local and it's log can be rotated */ ret = glusterd_gsync_get_slave_log_file (master, slave, log_file2); if (ret) goto out; + do_rotate: ret = glusterd_send_log_rotate_signal (pid, log_file1, log_file2); out: @@ -1838,12 +1857,13 @@ glusterd_rotate_gsync_all () static int glusterd_rotate_gsync_logs (dict_t *dict, char **op_errstr, dict_t *rsp_dict) { - char *slave = NULL; - char *volname = NULL; - char errmsg[1024] = {0,}; - gf_boolean_t exists = _gf_false; - glusterd_volinfo_t *volinfo = NULL; - int ret = 0; + char *slave = NULL; + char *volname = NULL; + char errmsg[1024] = {0,}; + gf_boolean_t exists = _gf_false; + glusterd_volinfo_t *volinfo = NULL; + char **linearr = NULL; + int ret = 0; ret = dict_get_str (dict, "master", &volname); if (ret < 0) { @@ -1868,8 +1888,18 @@ glusterd_rotate_gsync_logs (dict_t *dict, char **op_errstr, dict_t *rsp_dict) goto out; } - ret = glusterd_do_gsync_log_rotation_mst_slv (volinfo, slave, op_errstr); + /* for the given slave use the normalized url */ + ret = glusterd_urltransform_single (slave, "normalize", &linearr); + if (ret == -1) + goto out; + ret = glusterd_do_gsync_log_rotation_mst_slv (volinfo, linearr[0], + op_errstr); + if (ret) + gf_log ("gsyncd", GF_LOG_ERROR, "gsyncd log-rotate failed for" + " %s & %s", volname, slave); + + glusterd_urltransform_free (linearr, 1); out: return ret; } -- cgit