Skip to content

Instantly share code, notes, and snippets.

@thejefflarson
Forked from minad/backgroundcompaction.rb
Last active December 12, 2015 02:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thejefflarson/4696656 to your computer and use it in GitHub Desktop.
Save thejefflarson/4696656 to your computer and use it in GitHub Desktop.
module Daybreak
class BackgroundCompaction
def initialize(file, options = {})
@db = Daybreak::DB.new(file)
@thread = Thread.new(&method(:run))
@options = options
end
def stop
@stop = true
@thread.join
@db.close
end
private
def run
until @stop
@db.compact if compact_needed?
end
end
def compact_needed?
return true if @options[:force]
@options[:ratio] ||= 2 # Two log records per table record
@options[:reduction] ||= 4096 # One filesystem block, otherwise we won't gain
logsize, bytesize, size = @db.logsize, @db.bytesize, @db.size
logsize > @options[:ratio] * size || # Log size vs table size ratio
bytesize - (bytesize * size / logsize) > @options[:reduction] # Estimate log size reduction
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment