Whamcloud - gitweb
LU-1458 test: enable lustre_rsync debug log dump
[fs/lustre-release.git] / lustre / utils / lustre_rsync.c
index e352a45..c05a19e 100644 (file)
@@ -198,6 +198,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'},
@@ -215,7 +217,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 */
@@ -233,18 +236,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);
 }
 
 
@@ -814,7 +830,7 @@ int lr_create(struct lr_info *info)
                 if (rc1)
                         rc = rc1;
         }
-        return rc;
+       return rc;
 }
 
 /* Replicate a file remove (rmdir/unlink) operation */
@@ -855,7 +871,7 @@ int lr_remove(struct lr_info *info)
                         continue;
                 }
         }
-        return rc;
+       return rc;
 }
 
 /* Replicate a rename/move operation. */
@@ -893,47 +909,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 */
@@ -1005,7 +1030,7 @@ int lr_link(struct lr_info *info)
                 if (rc1)
                         rc = rc1;
         }
-        return rc;
+       return rc;
 }
 
 /* Replicate file attributes */
@@ -1037,7 +1062,7 @@ int lr_setattr(struct lr_info *info)
                 if (rc1)
                         rc = rc1;
         }
-        return rc;
+       return rc;
 }
 
 /* Replicate xattrs */
@@ -1067,7 +1092,7 @@ int lr_setxattr(struct lr_info *info)
                         rc = rc1;
         }
 
-        return rc;
+       return rc;
 }
 
 /* Parse a line of changelog entry */
@@ -1465,6 +1490,8 @@ int lr_replicate()
                 if (dryrun)
                         continue;
 
+               DEBUG_ENTRY(info);
+
                 switch(info->type) {
                 case CL_CREATE:
                 case CL_MKDIR:
@@ -1498,6 +1525,7 @@ int lr_replicate()
                 default:
                         break;
                 }
+               DEBUG_EXIT(info, rc);
                 if (rc && rc != -ENOENT) {
                         lr_print_failure(info, rc);
                         errors++;
@@ -1552,8 +1580,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 */
@@ -1643,6 +1671,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]);
@@ -1689,5 +1726,7 @@ int main(int argc, char *argv[])
 
         rc = lr_replicate();
 
-        return rc;
+       if (debug_log != NULL)
+               fclose(debug_log);
+       return rc;
 }