levels.go
func (s *levelsController) doCompact(p compactionPriority) error {
	l := p.level
	y.AssertTrue(l+1 < s.kv.opt.MaxLevels) // Sanity check.

	cd := compactDef{
		elog:       trace.New(fmt.Sprintf("Badger.L%d", l), "Compact"),
		thisLevel:  s.levels[l],
		nextLevel:  s.levels[l+1],
		dropPrefix: p.dropPrefix,
	}
	cd.elog.SetMaxEvents(100)
	defer cd.elog.Finish()

	s.kv.opt.Infof("Got compaction priority: %+v", p)

	// While picking tables to be compacted, both levels' tables are expected to
	// remain unchanged.
	if l == 0 {
		if !s.fillTablesL0(&cd) {
			return errFillTables
		}

	} else {
		if !s.fillTables(&cd) {
			return errFillTables
		}
	}
	defer s.cstatus.delete(cd) // Remove the ranges from compaction status.

	s.kv.opt.Infof("Running for level: %d\n", cd.thisLevel.level)
	s.cstatus.toLog(cd.elog)
	if err := s.runCompactDef(l, cd); err != nil {
		// This compaction couldn't be done successfully.
		s.kv.opt.Warningf("LOG Compact FAILED with error: %+v: %+v", err, cd)
		return err
	}

	s.cstatus.toLog(cd.elog)
	s.kv.opt.Infof("Compaction for level: %d DONE", cd.thisLevel.level)
	return nil
}
func (s *levelsController) doCompact(p compactionPriority) error {
	l := p.level
	y.AssertTrue(l+1 < s.kv.opt.MaxLevels) // Sanity check.

	cd := compactDef{
		elog:       trace.New(fmt.Sprintf("Badger.L%d", l), "Compact"),
		thisLevel:  s.levels[l],
		nextLevel:  s.levels[l+1],
		dropPrefix: p.dropPrefix,
	}
	cd.elog.SetMaxEvents(100)
	defer cd.elog.Finish()

	s.kv.opt.Infof("Got compaction priority: %+v", p)

	// While picking tables to be compacted, both levels' tables are expected to
	// remain unchanged.
	if l == 0 {
		if !s.fillTablesL0(&cd) {
			return errFillTables
		}

	} else {
		if !s.fillTables(&cd) {
			return errFillTables
		}
	}
	defer s.cstatus.delete(cd) // Remove the ranges from compaction status.

	s.kv.opt.Infof("Running for level: %d\n", cd.thisLevel.level)
	s.cstatus.toLog(cd.elog)
	if err := s.runCompactDef(l, cd); err != nil {
		// This compaction couldn't be done successfully.
		s.kv.opt.Warningf("LOG Compact FAILED with error: %+v: %+v", err, cd)
		return err
	}

	s.cstatus.toLog(cd.elog)
	s.kv.opt.Infof("Compaction for level: %d DONE", cd.thisLevel.level)
	return nil
}
func ( s * levelsController ) doCompact ( p compactionPriority ) error { l := p . level y . AssertTrue ( l + 1 < s . kv . opt . MaxLevels ) // Sanity check. cd := compactDef { elog : trace . New ( fmt . Sprintf ( " " , l ) , " " ) , thisLevel : s . levels [ l ] , nextLevel : s . levels [ l + 1 ] , dropPrefix : p . dropPrefix , } cd . elog . SetMaxEvents ( 100 ) defer cd . elog . Finish ( ) s . kv . opt . Infof ( " " , p ) // While picking tables to be compacted, both levels' tables are expected to // remain unchanged. if l == 0 { if ! s . fillTablesL0 ( & cd ) { return errFillTables } } else { if ! s . fillTables ( & cd ) { return errFillTables } } defer s . cstatus . delete ( cd ) // Remove the ranges from compaction status. s . kv . opt . Infof ( " \n " , cd . thisLevel . level ) s . cstatus . toLog ( cd . elog ) if err := s . runCompactDef ( l , cd ) ; err != nil { // This compaction couldn't be done successfully. s . kv . opt . Warningf ( " " , err , cd ) return err } s . cstatus . toLog ( cd . elog ) s . kv . opt . Infof ( " " , cd . thisLevel . level ) return nil }
// doCompact picks some table on level l and compacts it away to the next level.
doCompact picks some table on level l and compacts it away to the next level .