X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Flustre_rsync.c;h=8a6f2555fb4343b9e4ba1a580fec2ff84ca06eb6;hb=08aa217ce49aba1ded52e0f7adb8a607035123fd;hp=43fa7b4cb7dd54af983b4382cc60adaafcb4c260;hpb=7efcf4cd0e261389bcd1b5c222325c823845da7c;p=fs%2Flustre-release.git diff --git a/lustre/utils/lustre_rsync.c b/lustre/utils/lustre_rsync.c index 43fa7b4..8a6f255 100644 --- a/lustre/utils/lustre_rsync.c +++ b/lustre/utils/lustre_rsync.c @@ -26,6 +26,8 @@ /* * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2012, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -119,9 +121,8 @@ #include #include -#include #include -#include +#include #include #include "lustre_rsync.h" @@ -200,6 +201,8 @@ char rsync[PATH_MAX]; char rsync_ver[PATH_MAX]; struct lr_parent_child_list *parents; +FILE *debug_log; + /* Command line options */ struct option long_opts[] = { {"source", required_argument, 0, 's'}, @@ -217,7 +220,8 @@ struct option long_opts[] = { {"start-recno", required_argument, 0, 'n'}, {"abort-on-err",no_argument, 0, 'a'}, {"debug", required_argument, 0, 'd'}, - {0, 0, 0, 0} + {"debuglog", required_argument, 0, 'D'}, + {0, 0, 0, 0} }; /* Command line usage */ @@ -235,18 +239,31 @@ void lr_usage() "\t--dry-run don't write anything\n"); } +#define DEBUG_ENTRY(info) \ + lr_debug(D_TRACE, "***** Start %lld %s (%d) %s %s %s *****\n", \ + (info)->recno, changelog_type2str((info)->type), \ + (info)->type, (info)->tfid, (info)->pfid, (info)->name); + +#define DEBUG_EXIT(info, rc) \ + lr_debug(D_TRACE, "##### End %lld %s (%d) %s %s %s rc=%d #####\n", \ + (info)->recno, changelog_type2str((info)->type), \ + (info)->type, (info)->tfid, (info)->pfid, (info)->name, rc); + /* Print debug information. This is controlled by the value of the global variable 'debug' */ void lr_debug(int level, const char *fmt, ...) { - va_list ap; + va_list ap; - if (level > debug) - return; + if (level > debug) + return; - va_start(ap, fmt); - vprintf(fmt, ap); - va_end(ap); + va_start(ap, fmt); + if (debug_log != NULL) + vfprintf(debug_log, fmt, ap); + else + vfprintf(stdout, fmt, ap); + va_end(ap); } @@ -816,7 +833,7 @@ int lr_create(struct lr_info *info) if (rc1) rc = rc1; } - return rc; + return rc; } /* Replicate a file remove (rmdir/unlink) operation */ @@ -857,7 +874,7 @@ int lr_remove(struct lr_info *info) continue; } } - return rc; + return rc; } /* Replicate a rename/move operation. */ @@ -895,47 +912,56 @@ int lr_move(struct lr_info *info) status->ls_targets[info->target_no], info->path, info->name); } + lr_debug(DINFO, "dest path %s rc_dest=%d\n", info->dest, + rc_dest); } if (rc_dest == -ENOENT) { snprintf(info->dest, PATH_MAX, "%s/%s/%s", status->ls_targets[info->target_no], SPECIAL_DIR, info->sfid); special_dest = 1; + lr_debug(DINFO, "special dest %s\n", info->dest); } - if (!rc_src) - snprintf(info->src, PATH_MAX, "%s/%s/%s", - status->ls_targets[info->target_no], + if (!rc_src) { + snprintf(info->src, PATH_MAX, "%s/%s/%s", + status->ls_targets[info->target_no], srcpath, info->sname); + lr_debug(DINFO, "src path %s rc_src=%d\n", info->src, + rc_src); + } if (rc_src == -ENOENT || (access(info->src, F_OK) != 0 && errno == ENOENT)) { snprintf(info->src, PATH_MAX, "%s/%s/%s", status->ls_targets[info->target_no], SPECIAL_DIR, info->sfid); special_src = 1; + lr_debug(DINFO, "special src %s\n", info->src); } rc1 = 0; + errno = 0; if (strcmp(info->src, info->dest) != 0) { rc1 = rename(info->src, info->dest); if (rc1 == -1) rc1 = -errno; + lr_debug(DINFO, "rename returns %d\n", rc1); } if (special_src) { - lr_remove_pc(info->spfid, info->sfid); + rc1 = lr_remove_pc(info->spfid, info->sfid); if (!special_dest) lr_cascade_move(info->sfid, info->dest, info); } if (special_dest) - lr_add_pc(info->pfid, info->sfid, info->name); + rc1 = lr_add_pc(info->pfid, info->sfid, info->name); lr_debug(DINFO, "move: %s [to] %s rc1=%d, errno=%d\n", info->src, info->dest, rc1, errno); if (rc1) rc = rc1; } - return rc; + return rc; } /* Replicate a hard link */ @@ -1007,7 +1033,7 @@ int lr_link(struct lr_info *info) if (rc1) rc = rc1; } - return rc; + return rc; } /* Replicate file attributes */ @@ -1039,7 +1065,7 @@ int lr_setattr(struct lr_info *info) if (rc1) rc = rc1; } - return rc; + return rc; } /* Replicate xattrs */ @@ -1069,7 +1095,7 @@ int lr_setxattr(struct lr_info *info) rc = rc1; } - return rc; + return rc; } /* Parse a line of changelog entry */ @@ -1114,7 +1140,7 @@ int lr_parse_line(void *priv, struct lr_info *info) /* Initialize the replication parameters */ int lr_init_status() { - size_t size = sizeof(struct lustre_rsync_status) + PATH_MAX; + size_t size = sizeof(struct lustre_rsync_status) + PATH_MAX + 1; if (status != NULL) return 0; @@ -1193,7 +1219,7 @@ int lr_read_log() struct lustre_rsync_status *s; int fd = -1; size_t size; - size_t read_size = sizeof(struct lustre_rsync_status) + PATH_MAX; + size_t read_size = sizeof(struct lustre_rsync_status) + PATH_MAX + 1; int rc = 0; if (statuslog == NULL) @@ -1240,7 +1266,7 @@ int lr_read_log() } status->ls_num_targets = s->ls_num_targets; memcpy(status->ls_targets, s->ls_targets, - PATH_MAX * s->ls_num_targets); + (PATH_MAX + 1) * s->ls_num_targets); } if (status->ls_last_recno == -1) status->ls_last_recno = s->ls_last_recno; @@ -1386,7 +1412,7 @@ int lr_replicate() { void *changelog_priv; struct lr_info *info; - struct lr_info *ext; + struct lr_info *ext = NULL; time_t start; int xattr_not_supp; int i; @@ -1402,15 +1428,17 @@ int lr_replicate() if (rc) { fprintf(stderr, "Source path is not a valid Lustre client " "mountpoint.\n"); - return rc; + goto out; } if (status->ls_mdt_device[0] == '\0') snprintf(status->ls_mdt_device, LR_NAME_MAXLEN, "%s%s", status->ls_source_fs, DEFAULT_MDT); ext = calloc(1, sizeof(struct lr_info)); - if (ext == NULL) - return -ENOMEM; + if (ext == NULL) { + rc = -ENOMEM; + goto out; + } for (i = 0, xattr_not_supp = 0; i < status->ls_num_targets; i++) { snprintf(info->dest, PATH_MAX, "%s/%s", status->ls_targets[i], @@ -1419,7 +1447,8 @@ int lr_replicate() if (rc == -1 && errno != EEXIST) { fprintf(stderr, "Error writing to target path %s.\n", status->ls_targets[i]); - return -errno; + rc = -errno; + goto out; } rc = llistxattr(info->src, info->xlist, info->xsize); if (rc == -1 && errno == ENOTSUP) { @@ -1440,7 +1469,7 @@ int lr_replicate() if (rc < 0) { fprintf(stderr, "Error opening changelog file for fs %s.\n", status->ls_source_fs); - return rc; + goto out; } while (!quit && lr_parse_line(changelog_priv, info) == 0) { @@ -1464,6 +1493,8 @@ int lr_replicate() if (dryrun) continue; + DEBUG_ENTRY(info); + switch(info->type) { case CL_CREATE: case CL_MKDIR: @@ -1497,6 +1528,7 @@ int lr_replicate() default: break; } + DEBUG_EXIT(info, rc); if (rc && rc != -ENOENT) { lr_print_failure(info, rc); errors++; @@ -1523,7 +1555,15 @@ int lr_replicate() printf("Changelog records consumed: %lld\n", rec_count); } - return 0; + rc = 0; + +out: + if (info != NULL) + free(info); + if (ext != NULL) + free(ext); + + return rc; } void @@ -1543,8 +1583,8 @@ int main(int argc, char *argv[]) if ((rc = lr_init_status()) != 0) return rc; - while ((rc = getopt_long(argc, argv, "as:t:m:u:l:vx:zc:ry:n:d:", - long_opts, NULL)) >= 0) { + while ((rc = getopt_long(argc, argv, "as:t:m:u:l:vx:zc:ry:n:d:D:", + long_opts, NULL)) >= 0) { switch (rc) { case 'a': /* Assume absolute paths */ @@ -1566,7 +1606,7 @@ int main(int argc, char *argv[]) status->ls_num_targets = numtargets; } newsize = sizeof (struct lustre_rsync_status) + - (status->ls_num_targets * PATH_MAX); + (status->ls_num_targets * (PATH_MAX + 1)); if (status->ls_size != newsize) { status->ls_size = newsize; status = lr_grow_buf(status, newsize); @@ -1634,6 +1674,15 @@ int main(int argc, char *argv[]) if (debug < 0 || debug > 2) debug = 0; break; + case 'D': + /* Undocumented option debug log file */ + debug_log = fopen(optarg, "a"); + if (debug_log == NULL) { + printf("Cannot open %s for debug log\n", + optarg); + return -1; + } + break; default: fprintf(stderr, "error: %s: option '%s' " "unrecognized.\n", argv[0], argv[optind - 1]); @@ -1680,5 +1729,7 @@ int main(int argc, char *argv[]) rc = lr_replicate(); - return rc; + if (debug_log != NULL) + fclose(debug_log); + return rc; }