func TestCorruptDB_RecoverTable(t *testing.T) { h := newDbCorruptHarnessWopt(t, &opt.Options{ WriteBuffer: 112 * opt.KiB, CompactionTableSize: 90 * opt.KiB, Filter: filter.NewBloomFilter(10), }) h.build(1000) h.compactMem() h.compactRangeAt(0, "", "") h.compactRangeAt(1, "", "") seq := h.db.seq h.closeDB() h.corrupt(storage.TypeTable, 0, 1000, 1) h.corrupt(storage.TypeTable, 3, 10000, 1) // Corrupted filter shouldn't affect recovery. h.corrupt(storage.TypeTable, 3, 113888, 10) h.corrupt(storage.TypeTable, -1, 20000, 1) h.recover() if h.db.seq != seq { t.Errorf("invalid seq, want=%d got=%d", seq, h.db.seq) } h.check(985, 985) h.close() }
func newOptions(cfg *config.LevelDBConfig) *opt.Options { opts := &opt.Options{} opts.ErrorIfMissing = false opts.BlockCacheCapacity = cfg.CacheSize //we must use bloomfilter opts.Filter = filter.NewBloomFilter(defaultFilterBits) if !cfg.Compression { opts.Compression = opt.NoCompression } else { opts.Compression = opt.SnappyCompression } opts.BlockSize = cfg.BlockSize opts.WriteBuffer = cfg.WriteBufferSize opts.OpenFilesCacheCapacity = cfg.MaxOpenFiles //here we use default value, later add config support opts.CompactionTableSize = 32 * 1024 * 1024 opts.WriteL0SlowdownTrigger = 16 opts.WriteL0PauseTrigger = 64 return opts }