kvstore_compaction.go 889 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package storage
  2. import (
  3. "encoding/binary"
  4. "time"
  5. )
  6. func (s *store) scheduleCompaction(compactMainRev int64, keep map[reversion]struct{}) {
  7. end := make([]byte, 8)
  8. binary.BigEndian.PutUint64(end, uint64(compactMainRev+1))
  9. batchsize := int64(10000)
  10. last := make([]byte, 8+1+8)
  11. for {
  12. var rev reversion
  13. tx := s.b.BatchTx()
  14. tx.Lock()
  15. keys, _ := tx.UnsafeRange(keyBucketName, last, end, batchsize)
  16. for _, key := range keys {
  17. rev = bytesToRev(key)
  18. if _, ok := keep[rev]; !ok {
  19. tx.UnsafeDelete(keyBucketName, key)
  20. }
  21. }
  22. if len(keys) == 0 {
  23. rbytes := make([]byte, 8+1+8)
  24. revToBytes(reversion{main: compactMainRev}, rbytes)
  25. tx.UnsafePut(keyBucketName, finishedCompactKeyName, rbytes)
  26. tx.Unlock()
  27. return
  28. }
  29. // update last
  30. revToBytes(reversion{main: rev.main, sub: rev.sub + 1}, last)
  31. tx.Unlock()
  32. time.Sleep(100 * time.Millisecond)
  33. }
  34. }