From 3aa31813980d22719277a04797df48310acdff66 Mon Sep 17 00:00:00 2001 From: Jonas Jelten Date: Mon, 15 Mar 2021 23:21:07 +0100 Subject: [PATCH] os/bluestore: strip trailing slash for directory listings Calls to BlueRocksEnv::GetChildren may contain a trailing / in the queried directory, which is stripped away with this patch. If it's not stripped, the directory entry is not found in BlueFS: ``` 10 bluefs readdir db/ 20 bluefs readdir dir db/ not found 3 rocksdb: [db/db_impl/db_impl_open.cc:1785] Persisting Option File error: OK ``` Fixes: https://tracker.ceph.com/issues/49815 Signed-off-by: Jonas Jelten --- src/os/bluestore/BlueFS.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/os/bluestore/BlueFS.cc b/src/os/bluestore/BlueFS.cc index ea39626aef..62b9d27f58 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -3493,9 +3493,14 @@ int BlueFS::readdir(const string& dirname, vector *ls) { + std::string dname = dirname; + // dirname may contain a trailing / + if (!dname.empty() && dname.back() == '/') { + dname.pop_back(); + } std::lock_guard l(lock); - dout(10) << __func__ << " " << dirname << dendl; - if (dirname.empty()) { + dout(10) << __func__ << " " << dname << dendl; + if (dname.empty()) { // list dirs ls->reserve(dir_map.size() + 2); for (auto& q : dir_map) { @@ -3503,9 +3508,9 @@ } } else { // list files in dir - map::iterator p = dir_map.find(dirname); + map::iterator p = dir_map.find(dname); if (p == dir_map.end()) { - dout(20) << __func__ << " dir " << dirname << " not found" << dendl; + dout(20) << __func__ << " dir " << dname << " not found" << dendl; return -ENOENT; } DirRef dir = p->second; -- 2.26.2