return string("-");
}
+const char *num_char_map = "0123456789abcdef";
+template<typename T, const int base>
+static inline
+char* ritoa(T u, char *buf) {
+ if (u < base) {
+ *--buf = num_char_map[u];
+ return buf;
+ }
+
+ while (u) {
+ *--buf = num_char_map[u % base];
+ u /= base;
+ }
+ return buf;
+}
+
void pg_shard_t::encode(bufferlist &bl) const
{
ENCODE_START(1, 1, bl);
return true;
}
+char *spg_t::calc_name(char *buf, const char *suffix_backwords) const
+{
+ while (*suffix_backwords)
+ *--buf = *suffix_backwords++;
+
+ if (!is_no_shard()) {
+ buf = ritoa<int8_t, 10>(shard.id, buf);
+ *--buf = 's';
+ }
+
+ return pgid.calc_name(buf, "");
+}
+
ostream& operator<<(ostream& out, const spg_t &pg)
{
- out << pg.pgid;
- if (!pg.is_no_shard())
- out << "s" << (unsigned)pg.shard;
+ char buf[spg_t::calc_name_buf_size];
+ buf[spg_t::calc_name_buf_size - 1] = '\0';
+ out << pg.calc_name(buf + spg_t::calc_name_buf_size - 1, "");
return out;
}
o.push_back(new pg_t(131223, 4, 23));
}
-ostream& operator<<(ostream& out, const pg_t &pg)
+char *pg_t::calc_name(char *buf, const char *suffix_backwords) const
{
- out << pg.pool() << '.';
- out << hex << pg.ps() << dec;
+ while (*suffix_backwords)
+ *--buf = *suffix_backwords++;
+
+ if (m_preferred >= 0)
+ *--buf ='p';
+
+ buf = ritoa<uint32_t, 16>(m_seed, buf);
- if (pg.preferred() >= 0)
- out << 'p' << pg.preferred();
+ *--buf = '.';
- //out << "=" << hex << (__uint64_t)pg << dec;
+ return ritoa<uint64_t, 10>(m_pool, buf);
+}
+
+ostream& operator<<(ostream& out, const pg_t &pg)
+{
+ char buf[pg_t::calc_name_buf_size];
+ buf[pg_t::calc_name_buf_size - 1] = '\0';
+ out << pg.calc_name(buf + pg_t::calc_name_buf_size - 1, "");
return out;
}
{
switch (type) {
case TYPE_META:
- _str = "meta";
+ strcpy(_str_buff, "meta");
+ _str = _str_buff;
break;
case TYPE_PG:
- _str = stringify(pgid) + "_head";
+ _str_buff[spg_t::calc_name_buf_size - 1] = '\0';
+ _str = pgid.calc_name(_str_buff + spg_t::calc_name_buf_size - 1, "daeh_");
break;
case TYPE_PG_TEMP:
- _str = stringify(pgid) + "_TEMP";
+ _str_buff[spg_t::calc_name_buf_size - 1] = '\0';
+ _str = pgid.calc_name(_str_buff + spg_t::calc_name_buf_size - 1, "PMET_");
break;
default:
assert(0 == "unknown collection type");
return m_preferred;
}
+ static const uint8_t calc_name_buf_size = 36; // max length for max values len("18446744073709551615.ffffffff") + future suffix len("_head") + '\0'
+ char *calc_name(char *buf, const char *suffix_backwords) const;
+
void set_ps(ps_t p) {
m_seed = p;
}
int32_t preferred() const {
return pgid.preferred();
}
+
+ static const uint8_t calc_name_buf_size = pg_t::calc_name_buf_size + 4; // 36 + len('s') + len("255");
+ char *calc_name(char *buf, const char *suffix_backwords) const;
+
bool parse(const char *s);
bool parse(const std::string& s) {
return parse(s.c_str());
spg_t pgid;
uint64_t removal_seq; // note: deprecated, not encoded
- string _str; // cached string
+ char _str_buff[spg_t::calc_name_buf_size];
+ char *_str;
void calc_str();
calc_str();
}
+ coll_t& operator=(const coll_t& rhs)
+ {
+ this->type = rhs.type;
+ this->pgid = rhs.pgid;
+ this->removal_seq = rhs.removal_seq;
+ this->calc_str();
+ return *this;
+ }
+
// named constructors
static coll_t meta() {
return coll_t();
return coll_t(p);
}
- const std::string& to_str() const {
- return _str;
+ const std::string to_str() const {
+ return string(_str);
}
const char *c_str() const {
- return _str.c_str();
+ return _str;
}
+
bool parse(const std::string& s);
int operator<(const coll_t &rhs) const {
ASSERT_EQ(pgid, pgid2);
}
+TEST(coll_t, assigment) {
+ spg_t pgid;
+ coll_t right(pgid);
+ ASSERT_EQ(right.to_str(), string("0.0_head"));
+
+ coll_t left, middle;
+
+ ASSERT_EQ(left.to_str(), string("meta"));
+ ASSERT_EQ(middle.to_str(), string("meta"));
+
+ left = middle = right;
+
+ ASSERT_EQ(left.to_str(), string("0.0_head"));
+ ASSERT_EQ(middle.to_str(), string("0.0_head"));
+
+ ASSERT_NE(middle.c_str(), right.c_str());
+ ASSERT_NE(left.c_str(), middle.c_str());
+}
+
TEST(ghobject_t, cmp) {
ghobject_t min;
ghobject_t sep;