10225501448 李度 10225101546 陈胤遒 10215501422 高宇菲
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

69 行
2.0 KiB

#include "fielddb/meta.h"
#include "util/coding.h"
#include <string>
#include "leveldb/options.h"
#include "leveldb/slice.h"
#include "leveldb/write_batch.h"
namespace fielddb {
using namespace leveldb;
// Slice MetaKV::metaKey() {
// std::string buf;
// PutLengthPrefixedSlice(&buf, Key);
// PutFixed64(&buf, meta_seq);
// PutFixed32(&buf, tag);
// return Slice(buf);
// }
// Slice MetaKV::metaValue() {
// return Slice(SerializeValue(Fields));
// }
//对于含有index field的put/delete的meta编码为 (KV|Key,Value)
void MetaKV::TransPut(std::string &MetaKey,std::string &MetaValue) {
MetaKey.clear();
MetaValue.clear();
//这里的改动是为了防止潜在的段错误。原来的写法中,slice(buf)对应的buf是局部的,在函数返回后,buf被销毁
//但是slice中的指针指向的是析构的string对象的部分内存
std::string &buf = MetaKey;
PutFixed32(&buf, KV_Creating);
PutLengthPrefixedSlice(&buf, Slice(name));
// MetaKey = Slice(buf);
// MetaValue = Slice(*value);
}
void MetaKV::TransDelete(std::string &MetaKey) {
MetaKey.clear();
std::string &buf = MetaKey;
PutFixed32(&buf, KV_Deleting);
PutLengthPrefixedSlice(&buf, Slice(name));
// MetaKey = Slice(buf);
}
class CleanerHandler : public WriteBatch::Handler {
public:
WriteBatch *NeedClean;
void Put(const Slice& key, const Slice& value) override {
//将所有之前put的meta数据进行delete
NeedClean->Delete(key);
}
void Delete(const Slice& key) override {
//所有的传入的MetaBatch都是Put的
assert(0);
}
};
void MetaCleaner::Collect(WriteBatch &MetaBatch) {
if(MetaBatch.ApproximateSize() <= 12) return;
CleanerHandler Handler;
Handler.NeedClean = &NeedClean;
MetaBatch.Iterate(&Handler);
}
void MetaCleaner::CleanMetaBatch(DB *metaDB) {
if(NeedClean.ApproximateSize() <= 12) return;
metaDB->Write(WriteOptions(), &NeedClean);
}
}