1
0
Fork 0

Split out "auto vac needed" logic

master
Philip O'Toole 8 months ago
parent 305f1cfdbb
commit 1cc4b64614

@ -116,6 +116,7 @@ const (
numSnapshotsFull = "num_snapshots_full"
numSnapshotsIncremental = "num_snapshots_incremental"
numAutoVacuums = "num_auto_vacuums"
numAutoVacuumsFailed = "num_auto_vacuums_failed"
autoVacuumDuration = "auto_vacuum_duration"
numBoots = "num_boots"
numBackups = "num_backups"
@ -166,6 +167,7 @@ func ResetStats() {
stats.Add(numSnapshotsFull, 0)
stats.Add(numSnapshotsIncremental, 0)
stats.Add(numAutoVacuums, 0)
stats.Add(numAutoVacuumsFailed, 0)
stats.Add(autoVacuumDuration, 0)
stats.Add(numBoots, 0)
stats.Add(numBackups, 0)
@ -1856,20 +1858,20 @@ func (s *Store) fsmSnapshot() (fSnap raft.FSMSnapshot, retErr error) {
}()
// Automatic VACUUM needed?
if s.AutoVacInterval != 0 {
if avn, err := s.autoVacNeeded(time.Now()); err != nil {
return nil, err
} else if avn {
vacStart := time.Now()
lvt, err := s.LastVacuumTime()
if err != nil {
if err := s.Vacuum(); err != nil {
stats.Add(numAutoVacuumsFailed, 1)
return nil, err
}
if time.Since(lvt) > s.AutoVacInterval {
if err := s.Vacuum(); err != nil {
return nil, err
}
}
s.logger.Printf("database vacuumed in %s", time.Since(vacStart))
stats.Get(autoVacuumDuration).(*expvar.Int).Set(time.Since(vacStart).Milliseconds())
stats.Add(numAutoVacuums, 1)
if err := s.setLastVacuumTime(time.Now()); err != nil {
return nil, err
}
}
fullNeeded, err := s.snapshotStore.FullNeeded()
@ -2251,6 +2253,18 @@ func (s *Store) tryCompress(rq command.Requester) ([]byte, bool, error) {
return b, compressed, nil
}
// autoVacNeeded returns true if an automatic VACUUM is needed.
func (s *Store) autoVacNeeded(t time.Time) (bool, error) {
if s.AutoVacInterval == 0 {
return false, nil
}
lvt, err := s.LastVacuumTime()
if err != nil {
return false, err
}
return t.Sub(lvt) > s.AutoVacInterval, nil
}
// createOnDisk opens an on-disk database file at the configured path. If b is
// non-nil, any preexisting file will first be overwritten with those contents.
// Otherwise, any preexisting file will be removed before the database is opened.

Loading…
Cancel
Save