天天看點

cockroach底層存儲RocksDB自定義Key比較器(libroach)

排序規則:

首先按照roachpb.Key的位元組序順序比較

其次,在有一個時間戳值為空時,按照hlc時間戳正序比較,否則,按照hlc時間戳逆序比較

如下排序結果: 

key, hlc

123, 0
123, 0
123, 54
123, 24
123, 24
234, 0
234, 34
234, 24
234, 14           
type MVCCKey struct {
    Key       roachpb.Key
    Timestamp hlc.Timestamp
}           
class DBComparator : public rocksdb::Comparator {

    ...
    virtual int Compare(const rocksdb::Slice& a, const rocksdb::Slice& b) const override;
    ...
}           
int DBComparator::Compare(const rocksdb::Slice& a, const rocksdb::Slice& b) const {
  rocksdb::Slice key_a, key_b;
  rocksdb::Slice ts_a, ts_b;
  if (!SplitKey(a, &key_a, &ts_a) || !SplitKey(b, &key_b, &ts_b)) {
    // This should never happen unless there is some sort of corruption of
    // the keys.
    return a.compare(b);
  }

  const int c = key_a.compare(key_b);
  if (c != 0) {
    return c;
  }
  if (ts_a.empty()) {
    if (ts_b.empty()) {
      return 0;
    }
    return -1;
  } else if (ts_b.empty()) {
    return +1;
  }
  return ts_b.compare(ts_a);
}           

繼續閱讀