}
struct RocksDBStore::RocksWBHandler: public rocksdb::WriteBatch::Handler {
- RocksWBHandler(const RocksDBStore& db) : db(db) {}
+ RocksWBHandler(const RocksDBStore& db, bool verbose)
+ : db(db), verbose(verbose) {}
const RocksDBStore& db;
std::stringstream seen;
int num_seen = 0;
+ bool verbose = true;
- void dump(const char* op_name,
+ void dump(const char* op_name, const char* op_short,
uint32_t column_family_id,
const rocksdb::Slice& key_in,
const rocksdb::Slice* value = nullptr) {
string prefix;
string key;
- ssize_t size = value ? value->size() : -1;
- seen << std::endl << op_name << "(";
-
if (column_family_id == 0) {
db.split_key(key_in, &prefix, &key);
} else {
prefix = it->second;
key = key_in.ToString();
}
- seen << " prefix = " << prefix;
- seen << " key = " << pretty_binary_string(key);
- if (size != -1)
- seen << " value size = " << std::to_string(size);
- seen << ")";
+ if (verbose) {
+ ssize_t size = value ? value->size() : -1;
+ seen << std::endl << op_name << "(";
+
+ seen << " prefix = " << prefix;
+ seen << " key = " << pretty_binary_string(key);
+ if (size != -1)
+ seen << " value size = " << std::to_string(size);
+ seen << ")";
+ } else {
+ if (num_seen)
+ seen << ",";
+ seen << op_short << ":" << prefix;
+ }
num_seen++;
}
void Put(const rocksdb::Slice& key,
const rocksdb::Slice& value) override {
- dump("Put", 0, key, &value);
+ dump("Put", " P", 0, key, &value);
}
rocksdb::Status PutCF(uint32_t column_family_id, const rocksdb::Slice& key,
const rocksdb::Slice& value) override {
- dump("PutCF", column_family_id, key, &value);
+ dump("PutCF", " p", column_family_id, key, &value);
return rocksdb::Status::OK();
}
void SingleDelete(const rocksdb::Slice& key) override {
- dump("SingleDelete", 0, key);
+ dump("SingleDelete", "ds", 0, key);
}
rocksdb::Status SingleDeleteCF(uint32_t column_family_id, const rocksdb::Slice& key) override {
- dump("SingleDeleteCF", column_family_id, key);
+ dump("SingleDeleteCF", "DS", column_family_id, key);
return rocksdb::Status::OK();
}
void Delete(const rocksdb::Slice& key) override {
- dump("Delete", 0, key);
+ dump("Delete", " D", 0, key);
}
rocksdb::Status DeleteCF(uint32_t column_family_id, const rocksdb::Slice& key) override {
- dump("DeleteCF", column_family_id, key);
+ dump("DeleteCF", " d", column_family_id, key);
return rocksdb::Status::OK();
}
void Merge(const rocksdb::Slice& key,
const rocksdb::Slice& value) override {
- dump("Merge", 0, key, &value);
+ dump("Merge", " M", 0, key, &value);
}
rocksdb::Status MergeCF(uint32_t column_family_id, const rocksdb::Slice& key,
const rocksdb::Slice& value) override {
- dump("MergeCF", column_family_id, key, &value);
+ dump("MergeCF", " m", column_family_id, key, &value);
return rocksdb::Status::OK();
}
- bool Continue() override { return num_seen < 50; }
+ bool Continue() override {
+ bool r = verbose ? num_seen < 128 : num_seen < 50;
+ if (!r) {
+ if (verbose) {
+ seen << std::endl;
+ }
+ seen << " <skipped>";
+ }
+ return r;
+ }
};
int RocksDBStore::submit_common(rocksdb::WriteOptions& woptions, KeyValueDB::Transaction t)
static_cast<RocksDBTransactionImpl *>(t.get());
woptions.disableWAL = disableWAL;
lgeneric_subdout(cct, rocksdb, 30) << __func__;
- RocksWBHandler bat_txc(*this);
+ RocksWBHandler bat_txc(*this, true);
_t->bat.Iterate(&bat_txc);
*_dout << " Rocksdb transaction: " << bat_txc.seen.str() << dendl;
rocksdb::Status s = db->Write(woptions, &_t->bat);
if (!s.ok()) {
- RocksWBHandler rocks_txc(*this);
+ RocksWBHandler rocks_txc(*this, true);
_t->bat.Iterate(&rocks_txc);
derr << __func__ << " error: " << s.ToString() << " code = " << s.code()
<< " Rocksdb transaction: " << rocks_txc.seen.str() << dendl;
}
}
+string RocksDBStore::RocksDBTransactionImpl::get_summary_string(
+ bool verbose) const
+{
+ ceph_assert(db);
+ RocksWBHandler bat_txc(*db, verbose);
+ bat.Iterate(&bat_txc);
+ return bat_txc.seen.str();
+}
+
void RocksDBStore::RocksDBTransactionImpl::set(
const string &prefix,
const string &k,