From 643f20ac3177bb74cbec22123397536f7dbe5dbe Mon Sep 17 00:00:00 2001 From: "J. Eric Ivancich" Date: Thu, 17 Aug 2017 14:33:51 -0400 Subject: [PATCH] osd: speed up get_key_name Reduce string manipulation and creation of an extra string by streamlining code for get_key_name in both eversion_t and pg_log_dup_t. Signed-off-by: J. Eric Ivancich --- src/osd/osd_types.cc | 21 +++++++++++---------- src/osd/osd_types.h | 9 +++++++++ src/test/osd/TestPGLog.cc | 14 ++++++++++++++ 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 393cd7097d23f..0fa3919441b32 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -917,16 +917,12 @@ int pg_string_state(const std::string& state) // -- eversion_t -- string eversion_t::get_key_name() const { - char key[32]; - // Below is equivalent of sprintf("%010u.%020llu"); - key[31] = 0; - ritoa(version, key + 31); - key[10] = '.'; - ritoa(epoch, key + 10); - return string(key); + std::string key(32, ' '); + get_key_name(&key[0]); + key.resize(31); // remove the null terminator + return key; } - // -- pool_snap_info_t -- void pool_snap_info_t::dump(Formatter *f) const { @@ -4125,9 +4121,14 @@ ostream& operator<<(ostream& out, const pg_log_entry_t& e) // -- pg_log_dup_t -- -string pg_log_dup_t::get_key_name() const +std::string pg_log_dup_t::get_key_name() const { - return "dup_" + version.get_key_name(); + static const char prefix[] = "dup_"; + std::string key(36, ' '); + memcpy(&key[0], prefix, 4); + version.get_key_name(&key[4]); + key.resize(35); // remove the null terminator + return key; } void pg_log_dup_t::encode(bufferlist &bl) const diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 43d9a98e73753..5c66e478b7da6 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -811,6 +811,15 @@ public: string get_key_name() const; + // key must point to the beginning of a block of 32 chars + inline void get_key_name(char* key) const { + // Below is equivalent of sprintf("%010u.%020llu"); + key[31] = 0; + ritoa(version, key + 31); + key[10] = '.'; + ritoa(epoch, key + 10); + } + void encode(bufferlist &bl) const { #if defined(CEPH_LITTLE_ENDIAN) bl.append((char *)this, sizeof(version_t) + sizeof(epoch_t)); diff --git a/src/test/osd/TestPGLog.cc b/src/test/osd/TestPGLog.cc index 4a87d535aebc1..48c6d8d5473dc 100644 --- a/src/test/osd/TestPGLog.cc +++ b/src/test/osd/TestPGLog.cc @@ -2990,6 +2990,20 @@ TEST_F(PGLogTest, _merge_object_divergent_entries) { } } +TEST(eversion_t, get_key_name) { + eversion_t a(1234, 5678); + std::string a_key_name = a.get_key_name(); + EXPECT_EQ("0000001234.00000000000000005678", a_key_name); +} + +TEST(pg_log_dup_t, get_key_name) { + pg_log_dup_t a(eversion_t(1234, 5678), + 13, + osd_reqid_t(entity_name_t::CLIENT(777), 8, 999), + 15); + std::string a_key_name = a.get_key_name(); + EXPECT_EQ("dup_0000001234.00000000000000005678", a_key_name); +} // Local Variables: // compile-command: "cd ../.. ; make unittest_pglog ; ./unittest_pglog --log-to-stderr=true --debug-osd=20 # --gtest_filter=*.* " -- 2.39.5