leveldb: DB.tableRangeCompaction: prevent compacting last level
diff --git a/leveldb/db_compaction.go b/leveldb/db_compaction.go
index 2600310..333ea9b 100644
--- a/leveldb/db_compaction.go
+++ b/leveldb/db_compaction.go
@@ -567,14 +567,18 @@
}
}
-func (db *DB) tableRangeCompaction(level int, umin, umax []byte) {
- db.logf("table@compaction range L%d %q:%q", level, umin, umax)
+func (db *DB) tableRangeCompaction(level int, umin, umax []byte) error {
+ if level >= db.s.o.GetNumLevel() {
+ return errors.New("leveldb: invalid compaction level")
+ }
+ db.logf("table@compaction range L%d %q:%q", level, umin, umax)
if level >= 0 {
if c := db.s.getCompactionRange(level, umin, umax); c != nil {
db.tableCompaction(c, true)
}
} else {
+ // Scan for maximum level with overlapped tables.
v := db.s.version()
m := 1
for i, t := range v.tables[1:] {
@@ -590,6 +594,8 @@
}
}
}
+
+ return nil
}
func (db *DB) tableAutoCompaction() {
@@ -779,8 +785,7 @@
case cIdle:
ackQ = append(ackQ, x)
case cRange:
- db.tableRangeCompaction(cmd.level, cmd.min, cmd.max)
- x.ack(nil)
+ x.ack(db.tableRangeCompaction(cmd.level, cmd.min, cmd.max))
default:
panic("leveldb: unknown command")
}