diff --git a/docs/internal/tglogutils_for_log-0.6.md b/docs/internal/tglogutils_for_log-0.6.md index c1c030f9..6cd1e5c5 100644 --- a/docs/internal/tglogutils_for_log-0.6.md +++ b/docs/internal/tglogutils_for_log-0.6.md @@ -300,3 +300,61 @@ MAX_EPOCH_ID 0 +## 対応状況 + +### 未対応 + +* おそらくdetached pwalがオフラインコンパクションの対象になっている。 + * たんにローテーションしただけのPWALはオフラインコンパクションの対象 + * コンパクション済みのPWALは、コンパクションの対象外 + * オフラインコンパクションが遅くなる + * 一部のファイルだけデタッチしている場合に、データが破損する可能性がある。 + * オフラインコンパクションの対象外にすべき + * inspectについては、議論の余地がある。 + * 現在の使用だと、detached pwalは対象外にすべき + * detached pwalの破損を調べられないのは、制限事項とする。 +* inspectで表示される、persistent-format-version:が不正 => マニフェストファイルを見ていないのではないか + + +* コンパクションにより、エポックIDが0になることに起因する問題。 + * => 実際には、オフラインコンパクションを行うとコンパクションカタログのエポックIDが0になるという問題だった。 + * オフラインコンパクションを行ったときに、コピー先にepcho_idが0のコンパクションカタログが生成される。 + * その後、コンパクションカタログに対する操作が行われずに、残っていた。 + * 必要な対応 + * from ディレクトリの version確認 + * version2の場合、コンパクションカタログを読み、コンパクション対象がファイルを取得 + * コンパクション対象外ファイルをコンパクションする + * コンパクションカタログをアップデートする。 + +* tglogutilsを用いたとき、ターゲットディレクトリを無条件にv1からv2にアップグレードしてしまう。 + + + +### LOG-0.6では対応しない + +* ローテート済みのPWALとコンパクション済みのPWALがrepairの対象にならない + * こららのファイルが破損したときに修復ができない + + +### 終了済み + +* 意図したファイルがローテーションされたかtsurugidbのログで確認できない。 + * 現状でも次のログが出ているので確認可能 + +``` +I0822 18:41:39.092664 161657 parse_wal_file.cpp:212] /:limestone:internal:dblog_scan:scan_one_pwal_file processing pwal file: pwal_0000.01724319699070.0 +I0822 18:41:39.092842 161656 parse_wal_file.cpp:212] /:limestone:internal:dblog_scan:scan_one_pwal_file processing pwal file: pwal_0001.01724319699070.0 +I0822 18:41:39.092876 161658 parse_wal_file.cpp:212] /:limestone:internal:dblog_scan:scan_one_pwal_file processing pwal file: pwal_0002.01724319699070.0 +I0822 18:41:39.092902 161659 parse_wal_file.cpp:212] /:limestone:internal:dblog_scan:scan_one_pwal_file processing pwal file: pwal_0003.01724319699070.0 +I0822 18:41:39.139019 161659 parse_wal_file.cpp:477] /:limestone:internal:dblog_scan:scan_one_pwal_file fixed: 0 +I0822 18:41:39.139031 161659 dblog_scan.cpp:138] OK: "/home/umegane/tsurugi/tsurugi/var/data/log/pwal_0003.01724319699070.0" +I0822 18:41:39.257598 161658 parse_wal_file.cpp:477] /:limestone:internal:dblog_scan:scan_one_pwal_file fixed: 0 +I0822 18:41:39.257611 161658 dblog_scan.cpp:138] OK: "/home/umegane/tsurugi/tsurugi/var/data/log/pwal_0002.01724319699070.0" +I0822 18:41:39.264319 161656 parse_wal_file.cpp:477] /:limestone:internal:dblog_scan:scan_one_pwal_file fixed: 0 +I0822 18:41:39.264328 161656 dblog_scan.cpp:138] OK: "/home/umegane/tsurugi/tsurugi/var/data/log/pwal_0001.01724319699070.0" +I0822 18:41:39.265872 161657 parse_wal_file.cpp:477] /:limestone:internal:dblog_scan:scan_one_pwal_file fixed: 0 +I0822 18:41:39.265877 161657 dblog_scan.cpp:138] OK: "/home/umegane/tsurugi/tsurugi/var/data/log/pwal_0000.01724319699070.0" +I0822 18:41:39.266139 160984 datastore_snapshot.cpp:205] /:limestone:internal:create_compact_pwal generating compacted pwal file: "/home/umegane/tsurugi/tsurugi/var/data/log/compaction_temp/pwal_0000.compacted" +``` + + diff --git a/src/limestone/dblogutil/dblogutil.cpp b/src/limestone/dblogutil/dblogutil.cpp index c1b0d524..d2c76246 100644 --- a/src/limestone/dblogutil/dblogutil.cpp +++ b/src/limestone/dblogutil/dblogutil.cpp @@ -25,6 +25,7 @@ #include "internal.h" #include "log_entry.h" + using namespace limestone::api; using namespace limestone::internal; @@ -181,7 +182,7 @@ static boost::filesystem::path make_backup_dir_next_to(const boost::filesystem:: return make_tmp_dir_next_to(target_dir, ".backup_XXXXXX"); } -void compaction(dblog_scan &ds, std::optional epoch) { +void compaction(dblog_scan &ds, std::optional epoch, compaction_catalog &catalog) { epoch_id_type ld_epoch{}; if (epoch.has_value()) { ld_epoch = epoch.value(); @@ -260,6 +261,9 @@ void compaction(dblog_scan &ds, std::optional epoch) { VLOG_LP(log_info) << "renaming " << tmp << " to " << from_dir; boost::filesystem::rename(tmp, from_dir); + std::set compacted_files = {compacted_file_info(catalog.get_compacted_filename(), 1)}; + std::set detached_pwals; + catalog.update_catalog_file(ld_epoch, compacted_files, detached_pwals); std::cout << "compaction was successfully completed: " << from_dir << std::endl; } @@ -293,11 +297,20 @@ int main(char *dir, subcommand mode) { // NOLINT } try { check_and_migrate_logdir_format(p); - dblog_scan ds(p); + compaction_catalog catalog = compaction_catalog::from_catalog_file(p); + const auto& detached_pwals = catalog.get_detached_pwals(); + std::set non_detached_files; + for (const auto& entry : boost::filesystem::directory_iterator(p)) { + auto file_name = entry.path().filename().string(); + if (detached_pwals.find(file_name) == detached_pwals.end()) { + non_detached_files.insert(file_name); + } + } + dblog_scan ds(p, non_detached_files); ds.set_thread_num(FLAGS_thread_num); if (mode == cmd_inspect) inspect(ds, opt_epoch); if (mode == cmd_repair) repair(ds, opt_epoch); - if (mode == cmd_compaction) compaction(ds, opt_epoch); + if (mode == cmd_compaction) compaction(ds, opt_epoch, catalog); } catch (std::runtime_error& e) { LOG(ERROR) << e.what(); log_and_exit(64);