From 52fe52baf920c672ac7f63a3087dcd31137891b6 Mon Sep 17 00:00:00 2001 From: Xiaoxi Chen Date: Tue, 10 Jan 2017 19:11:08 -0700 Subject: [PATCH] mds/server: skip unwanted dn in handle_client_readdir We can skip unwanted dn which < (offset_key, snap) via map.lower_bound, rather than iterate across them. Previously we iterate and skip dn which < (offset_key, dn->last), as dn->last >= snap means (offset_key, dn->last) >= (offset_key, snap), and such iterate_and_skip logic still keep, so this commit doesnt change code logic but an optimization. Signed-off-by: Xiaoxi Chen --- src/mds/CDir.h | 1 + src/mds/Server.cc | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mds/CDir.h b/src/mds/CDir.h index edd5434eba307..8eb2cbc27e8c0 100644 --- a/src/mds/CDir.h +++ b/src/mds/CDir.h @@ -428,6 +428,7 @@ protected: map_t::iterator begin() { return items.begin(); } map_t::iterator end() { return items.end(); } + map_t::iterator lower_bound(dentry_key_t key) { return items.lower_bound(key); } unsigned get_num_head_items() const { return num_head_items; } unsigned get_num_head_null() const { return num_head_null; } diff --git a/src/mds/Server.cc b/src/mds/Server.cc index b8655cd4c2ae6..30cad75c1d4d4 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -3416,7 +3416,9 @@ void Server::handle_client_readdir(MDRequestRef& mdr) bufferlist dnbl; __u32 numfiles = 0; bool end = (dir->begin() == dir->end()); - for (CDir::map_t::iterator it = dir->begin(); + // skip all dns < dentry_key_t(snapid, offset_str, offset_hash) + dentry_key_t skip_key(snapid, offset_str.c_str(), offset_hash); + for (CDir::map_t::iterator it = offset_str.empty() ? dir->begin() : dir->lower_bound(skip_key); !end && numfiles < max; end = (it == dir->end())) { CDentry *dn = it->second; -- 2.39.5