From e943ff0b8f22ac346b82d3f45351695aa8944121 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Mon, 13 Aug 2018 09:56:04 +0800 Subject: [PATCH] tools/cephfs: make cephfs-data-scan prints the max used ino Fixes: http://tracker.ceph.com/issues/26925 Signed-off-by: "Yan, Zheng" --- doc/cephfs/disaster-recovery-experts.rst | 8 +++++++ src/tools/cephfs/DataScan.cc | 28 +++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/doc/cephfs/disaster-recovery-experts.rst b/doc/cephfs/disaster-recovery-experts.rst index 23dd6138c0b04..8db85a88611f0 100644 --- a/doc/cephfs/disaster-recovery-experts.rst +++ b/doc/cephfs/disaster-recovery-experts.rst @@ -183,6 +183,14 @@ The example below shows how to run 4 workers simultaneously: It is **important** to ensure that all workers have completed the scan_extents phase before any workers enter the scan_inodes phase. +Output of 'scan_links' command includes max used inode number for each +MDS rank. You may need to update InoTables of each MDS rank. + +:: + cephfs-table-tool recovery-fs:x show inode + cephfs-table-tool recovery-fs:x take_inos used_inos; + interval_set used_inos; map remote_links; struct link_info_t { @@ -1035,6 +1035,28 @@ int DataScan::scan_links() } } } + + map max_ino_map; + { + auto prev_max_ino = (uint64_t)1 << 40; + for (auto p = used_inos.begin(); p != used_inos.end(); ++p) { + auto cur_max = p.get_start() + p.get_len() - 1; + if (cur_max < prev_max_ino) + continue; // system inodes + + if ((prev_max_ino >> 40) != (cur_max >> 40)) { + unsigned rank = (prev_max_ino >> 40) - 1; + max_ino_map[rank] = prev_max_ino; + } else if ((p.get_start() >> 40) != (cur_max >> 40)) { + unsigned rank = (p.get_start() >> 40) - 1; + max_ino_map[rank] = ((uint64_t)(rank + 2) << 40) - 1; + } + prev_max_ino = cur_max; + } + unsigned rank = (prev_max_ino >> 40) - 1; + max_ino_map[rank] = prev_max_ino; + } + used_inos.clear(); for (auto& p : dup_primaries) { @@ -1109,6 +1131,10 @@ int DataScan::scan_links() return r; } + for (auto& p : max_ino_map) { + std::cout << "mds." << p.first << " max used ino " << p.second << std::endl; + } + return 0; } -- 2.39.5