Class: Arachni::Support::Database::Queue
- Defined in:
 - lib/arachni/support/database/queue.rb
 
Overview
Flat-file Queue implementation
Behaves pretty much like a Ruby Queue however it transparently serializes and saves its entries to the file-system under the OS's temp directory *after* a specified #max_buffer_size (for in-memory entries) has been exceeded.
It's pretty useful when you want to reduce memory footprint without having to refactor any code since it behaves just like a Ruby Queue implementation.
Constant Summary collapse
- DEFAULT_MAX_BUFFER_SIZE =
          
Default #max_buffer_size.
 100
Instance Attribute Summary collapse
- 
  
    
      #buffer  ⇒ Array<Object> 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    
Objects stored in the memory buffer.
 - 
  
    
      #disk  ⇒ Array<String> 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    
Paths to files stored to disk.
 - 
  
    
      #max_buffer_size  ⇒ Integer 
    
    
  
  
  
  
    
    
  
  
  
  
  
  
    
How many entries to keep in memory before starting to off-load to disk.
 
Instance Method Summary collapse
- #<<(obj) ⇒ Object (also: #push, #enq)
 - #buffer_size ⇒ Object
 - 
  
    
      #clear  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Removes all objects from the queue.
 - #disk_size ⇒ Object
 - 
  
    
      #empty?  ⇒ Bool 
    
    
  
  
  
  
  
  
  
  
  
    
`true` if the queue if empty, `false` otherwise.
 - #free_buffer_size ⇒ Object
 - 
  
    
      #initialize(*args)  ⇒ Queue 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    
A new instance of Queue.
 - #num_waiting ⇒ Object
 - 
  
    
      #pop(non_block = false)  ⇒ Object 
    
    
      (also: #deq, #shift)
    
  
  
  
  
  
  
  
  
  
    
Removes an object from the queue and returns it.
 - 
  
    
      #size  ⇒ Integer 
    
    
      (also: #length)
    
  
  
  
  
  
  
  
  
  
    
Size of the queue, the number of objects it currently holds.
 
Methods inherited from Base
Constructor Details
#initialize(*args) ⇒ Queue
Returns a new instance of Queue.
      41 42 43 44 45 46 47  | 
    
      # File 'lib/arachni/support/database/queue.rb', line 41 def initialize( *args ) super( *args ) @disk = [] @buffer = [] @waiting = [] @mutex = Mutex.new end  | 
  
Instance Attribute Details
#buffer ⇒ Array<Object> (readonly)
Returns Objects stored in the memory buffer.
      34 35 36  | 
    
      # File 'lib/arachni/support/database/queue.rb', line 34 def buffer @buffer end  | 
  
#disk ⇒ Array<String> (readonly)
Returns Paths to files stored to disk.
      38 39 40  | 
    
      # File 'lib/arachni/support/database/queue.rb', line 38 def disk @disk end  | 
  
#max_buffer_size ⇒ Integer
Defaults to DEFAULT_MAX_BUFFER_SIZE.
Returns How many entries to keep in memory before starting to off-load to disk.
      30 31 32  | 
    
      # File 'lib/arachni/support/database/queue.rb', line 30 def max_buffer_size @max_buffer_size end  | 
  
Instance Method Details
#<<(obj) ⇒ Object Also known as: push, enq
      59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74  | 
    
      # File 'lib/arachni/support/database/queue.rb', line 59 def <<( obj ) synchronize do if @buffer.size < max_buffer_size @buffer << obj else @disk << dump( obj ) end begin t = @waiting.shift t.wakeup if t rescue ThreadError retry end end end  | 
  
#buffer_size ⇒ Object
      108 109 110  | 
    
      # File 'lib/arachni/support/database/queue.rb', line 108 def buffer_size @buffer.size end  | 
  
#clear ⇒ Object
Removes all objects from the queue.
      125 126 127 128 129 130 131 132 133 134 135  | 
    
      # File 'lib/arachni/support/database/queue.rb', line 125 def clear synchronize do @buffer.clear while !@disk.empty? path = @disk.pop next if !path delete_file path end end end  | 
  
#disk_size ⇒ Object
      112 113 114  | 
    
      # File 'lib/arachni/support/database/queue.rb', line 112 def disk_size @disk.size end  | 
  
#empty? ⇒ Bool
Returns `true` if the queue if empty, `false` otherwise.
      118 119 120 121 122  | 
    
      # File 'lib/arachni/support/database/queue.rb', line 118 def empty? synchronize do internal_empty? end end  | 
  
#free_buffer_size ⇒ Object
      104 105 106  | 
    
      # File 'lib/arachni/support/database/queue.rb', line 104 def free_buffer_size max_buffer_size - buffer_size end  | 
  
#num_waiting ⇒ Object
      137 138 139  | 
    
      # File 'lib/arachni/support/database/queue.rb', line 137 def num_waiting @waiting.size end  | 
  
#pop(non_block = false) ⇒ Object Also known as: deq, shift
Returns Removes an object from the queue and returns it.
      80 81 82 83 84 85 86 87 88 89 90 91 92 93  | 
    
      # File 'lib/arachni/support/database/queue.rb', line 80 def pop( non_block = false ) synchronize do loop do if internal_empty? raise ThreadError, 'queue empty' if non_block @waiting.push Thread.current @mutex.sleep else return @buffer.shift if !@buffer.empty? return load_and_delete_file( @disk.shift ) end end end end  | 
  
#size ⇒ Integer Also known as: length
Returns Size of the queue, the number of objects it currently holds.
      99 100 101  | 
    
      # File 'lib/arachni/support/database/queue.rb', line 99 def size buffer_size + disk_size end  |