# # # add_dir "tests/db_check_file_sizes" # # add_file "tests/db_check_file_sizes/__driver__.lua" # content [8debc0b99538799548fe1b8b7b568db25de7991d] # # patch "database.cc" # from [4e54afc9d9e44de2a37e576c9cafad9adddd8477] # to [36047ea6f5fbab77f8899b0ae197e0576736f21b] # # patch "database.hh" # from [bd01ca183d77f325835ea588f38a7f6505cc32e0] # to [18a9504000bb0856b693577e3de47861d7a7f5e0] # # patch "database_check.cc" # from [ae542ecb0c5c74e73bc900a9307de9ceaaffc5a0] # to [be43b97248cdb1bcadfe6b0543c712e673fbc5eb] # ============================================================ --- database.cc 4e54afc9d9e44de2a37e576c9cafad9adddd8477 +++ database.cc 36047ea6f5fbab77f8899b0ae197e0576736f21b @@ -2339,6 +2339,12 @@ bool } bool +database::file_size_exists(file_id const & ident) +{ + return imp->table_has_entry(ident.inner(), "id", "file_sizes"); +} + +bool database::roster_version_exists(revision_id const & id) { return delta_exists(id.inner(), "roster_deltas") ============================================================ --- database.hh bd01ca183d77f325835ea588f38a7f6505cc32e0 +++ database.hh 18a9504000bb0856b693577e3de47861d7a7f5e0 @@ -119,6 +119,7 @@ public: // public: bool file_version_exists(file_id const & ident); + bool file_size_exists(file_id const & ident); bool revision_exists(revision_id const & ident); bool roster_link_exists_for_revision(revision_id const & ident); bool roster_exists_for_revision(revision_id const & ident); ============================================================ --- database_check.cc ae542ecb0c5c74e73bc900a9307de9ceaaffc5a0 +++ database_check.cc be43b97248cdb1bcadfe6b0543c712e673fbc5eb @@ -172,10 +172,19 @@ check_files(database & db, map static void report_files(map const & checked_files, size_t & missing_files, - size_t & unreferenced_files) + size_t & unreferenced_files, + size_t & missing_or_invalid_file_sizes) { for (map::const_iterator i = checked_files.begin(); i != checked_files.end(); ++i) @@ -702,6 +712,11 @@ report_files(map P(F("file %s unreferenced") % i->first); } + if (file.size_ok == false) + { + missing_or_invalid_file_sizes++; + P(F("file %s has a missing or invalid file size") % i->first); + } } } @@ -1015,6 +1030,7 @@ check_db(database & db) size_t missing_files = 0; size_t unreferenced_files = 0; + size_t missing_or_invalid_file_sizes = 0; size_t missing_rosters = 0; size_t unreferenced_rosters = 0; @@ -1061,7 +1077,8 @@ check_db(database & db) check_heights_relation(db, checked_heights); check_branch_leaves(db, checked_branches); - report_files(checked_files, missing_files, unreferenced_files); + report_files(checked_files, missing_files, unreferenced_files, + missing_or_invalid_file_sizes); report_rosters(checked_rosters, unreferenced_rosters, @@ -1095,6 +1112,8 @@ check_db(database & db) W(F("%d missing files") % missing_files); if (unreferenced_files > 0) W(F("%d unreferenced files") % unreferenced_files); + if (missing_or_invalid_file_sizes > 0) + W(F("%d missing or invalid file sizes") % missing_or_invalid_file_sizes); if (unreferenced_rosters > 0) W(F("%d unreferenced rosters") % unreferenced_rosters); @@ -1163,7 +1182,7 @@ check_db(database & db) // unreferenced files and rosters and mismatched certs are not actually // serious errors; odd, but nothing will break. - size_t serious = missing_files + + size_t serious = missing_files + missing_or_invalid_file_sizes + incomplete_rosters + missing_rosters + missing_revisions + incomplete_revisions + non_parseable_revisions + non_normalized_revisions + ============================================================ --- /dev/null +++ tests/db_check_file_sizes/__driver__.lua 8debc0b99538799548fe1b8b7b568db25de7991d @@ -0,0 +1,40 @@ +mtn_setup() + +addfile("test1", "not more than 33 bytes of content") +addfile("test2", "some 29 bytes of junk content") +commit() + +check(mtn("au", "identify", "test1"), 0, true, false) +local fileid1 = string.sub(readfile("stdout"), 1, -2) +check(mtn("au", "identify", "test2"), 0, true, false) +local fileid2 = string.sub(readfile("stdout"), 1, -2) + +-- db should be ok +check(mtn("db", "check"), 0, false, false) + +-- change the file size +check(mtn("db", "execute", "update file_sizes set size='20' where id=x'" .. fileid1 .. "';"), 0, false, false) + +-- check +check(mtn("db", "check"), 1, false, true) +check(qgrep('1 missing or invalid file sizes', 'stderr')) +check(qgrep(fileid1, 'stderr')) +check(qgrep('serious problems detected', 'stderr')) + +-- drop the second +check(mtn("db", "execute", "delete from file_sizes where id=x'" .. fileid2 .. "';"), 0, false, false) + +-- check again +check(mtn("db", "check"), 1, false, true) +check(qgrep('2 missing or invalid file sizes', 'stderr')) +check(qgrep(fileid1, 'stderr')) +check(qgrep(fileid2, 'stderr')) +check(qgrep('serious problems detected', 'stderr')) + +-- insert / fix everything again +check(mtn("db", "execute", "insert or replace into file_sizes values(x'" .. fileid1 .. "','33');"), 0, false, false) +check(mtn("db", "execute", "insert into file_sizes values(x'" .. fileid2 .. "','29');"), 0, false, false) + +-- ... and everything is back to normal +check(mtn("db", "check"), 0, false, false) +