X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=scandir.cc;h=10e908b68e342aaa4bb91786d6aea908ec6257c1;hb=8fb5b2c6e85aece6419c28cef278d1ae4204520f;hp=a2a7a4996be46f3c20e6b83934f8a78cda2c0722;hpb=b1593251f9c7f207027671960d6a25d695c0424b;p=cumulus.git diff --git a/scandir.cc b/scandir.cc index a2a7a49..10e908b 100644 --- a/scandir.cc +++ b/scandir.cc @@ -96,6 +96,8 @@ std::list searches; // Directories we don't want to save, but bool relative_paths = true; +bool flag_rebuild_statcache = false; + /* Whether verbose output is enabled. */ bool verbose = false; @@ -154,7 +156,9 @@ int64_t dumpfile(int fd, dictionary &file_info, const string &path, if (found) old_blocks = metawriter->get_blocks(); - if (found && metawriter->is_unchanged(&stat_buf)) { + if (found + && !flag_rebuild_statcache + && metawriter->is_unchanged(&stat_buf)) { cached = true; /* If any of the blocks in the object have been expired, then we should @@ -285,6 +289,22 @@ int64_t dumpfile(int fd, dictionary &file_info, const string &path, file_info["checksum"] = hash.checksum_str(); } + // Sanity check: if we are rebuilding the statcache, but the file looks + // like it hasn't changed, then the newly-computed checksum should match + // the checksum in the statcache. If not, we have possible disk corruption + // and report a warning. + if (flag_rebuild_statcache) { + if (found && file_info["checksum"] != metawriter->get_checksum()) { + fprintf(stderr, + "Warning: Checksum for %s does not match expected value\n" + " expected: %s\n" + " actual: %s\n", + path.c_str(), + metawriter->get_checksum().c_str(), + file_info["checksum"].c_str()); + } + } + if (verbose && status != NULL) printf(" [%s]\n", status); @@ -639,6 +659,7 @@ int main(int argc, char *argv[]) {"full-metadata", 0, 0, 0}, // 8 {"tmpdir", 1, 0, 0}, // 9 {"upload-script", 1, 0, 0}, // 10 + {"rebuild-statcache", 0, 0, 0}, // 11 // Aliases for short options {"verbose", 0, 0, 'v'}, {NULL, 0, 0, 0}, @@ -690,6 +711,9 @@ int main(int argc, char *argv[]) case 10: // --upload-script backup_script = optarg; break; + case 11: // --rebuild-statcache + flag_rebuild_statcache = true; + break; default: fprintf(stderr, "Unhandled long option!\n"); return 1;