// -- eversion_t --
string eversion_t::get_key_name() const
{
- char key[32];
- // Below is equivalent of sprintf("%010u.%020llu");
- key[31] = 0;
- ritoa<uint64_t, 10, 20>(version, key + 31);
- key[10] = '.';
- ritoa<uint32_t, 10, 10>(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
{
// -- 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
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<uint64_t, 10, 20>(version, key + 31);
+ key[10] = '.';
+ ritoa<uint32_t, 10, 10>(epoch, key + 10);
+ }
+
void encode(bufferlist &bl) const {
#if defined(CEPH_LITTLE_ENDIAN)
bl.append((char *)this, sizeof(version_t) + sizeof(epoch_t));
}
}
+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=*.* "