Changeset 2462 for tools/gauge
- Timestamp:
- 10/05/05 00:54:26 (3 years ago)
- Files:
-
- tools/gauge/lib/gauge/log_reader.rb (modified) (2 diffs)
- tools/gauge/lib/gauge/sequential_log.rb (modified) (2 diffs)
- tools/gauge/test/log_reader_test.rb (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
tools/gauge/lib/gauge/log_reader.rb
r2461 r2462 5 5 LogRecord = Struct.new(:time, :pid, :name, :data) 6 6 7 attr_reader :wait_duration 8 9 def initialize(application, directory_or_io, options={}) 10 @wait_duration = options[:wait_duration] 11 super 12 end 13 7 14 def next_record 15 loop do 16 record = read_record 17 return record if record 18 19 # if number is nil, then we're not reading a log sequence. Just return 20 # nil to indicate the end of the file. 21 return nil if number.nil? 22 23 # okay, we're at the very end of the sequence. let's check to see if 24 # there is another log file in the sequence... 25 if File.exist?(name_for(number + 1)) 26 # if so, close the current file, open the next file, and grab the 27 # first record from it. 28 self.next! 29 return next_record 30 else 31 # if not, just return nil to indicate the end of the sequence 32 return nil 33 end 34 end 35 end 36 37 def read_record 8 38 return nil unless @io 9 @partial_read ||= ""10 39 11 size = @io.read(4 - @partial_read.length) 12 if size.nil? || size.length < 4 - @partial_read.length 13 @io.pos = @io.pos # reset eof 14 @partial_read << size if size 40 size = @io.read(4) 41 if size.nil? 42 @io.pos = @io.pos # reset eof flag 15 43 return nil 44 elsif size.length < 4 45 size << safe_read(4 - size.length) 16 46 end 17 47 18 size = (@partial_read << size).unpack("N").first19 @partial_read = nil48 buffer = safe_read(size.unpack("N").first) 49 record = LogRecord.new(*buffer.unpack("GN")) 20 50 21 buffer = ""22 loop do23 unless v = @io.read(size - buffer.length)24 sleep 0.125 @io.pos = @io.pos # reset eof26 next27 end28 29 buffer << v30 break if buffer.length == size31 end32 33 record = LogRecord.new(*buffer.unpack("GN"))34 51 name = buffer[13,buffer[12]] 35 52 record.name = name.to_sym … … 39 56 40 57 private 58 59 def safe_read(length) 60 buffer = "" 61 loop do 62 unless v = @io.read(length - buffer.length) 63 sleep 0.1 64 @io.pos = @io.pos # reset eof 65 next 66 end 67 68 buffer << v 69 return buffer if buffer.length == length 70 end 71 end 41 72 42 73 def open_log tools/gauge/lib/gauge/sequential_log.rb
r2461 r2462 13 13 @io = directory_or_io 14 14 else 15 @directory = directory_or_io 15 16 setup_log(directory_or_io) 16 17 end … … 31 32 private 32 33 33 def setup_log_sequence_in(directory) 34 @directory = directory 35 existing_logs = Dir["#{directory}/#{@application}-*.log"].sort 36 @number = existing_logs.empty? ? 0 : 37 existing_logs.last.match(/#{@application}-(\d+)\.log/)[1].to_i 38 @io = open_log 34 def name_for(number) 35 "#{directory}/#{@application}-%04d.log" % number 39 36 end 40 37 41 38 def open_log 42 @name = "#{directory}/#{@application}-%04d.log" % number39 @name = name_for(number) 43 40 log = File.open(name, log_access_mode) 44 41 log.sync = true tools/gauge/test/log_reader_test.rb
r2461 r2462 29 29 end 30 30 31 def test_partial_read32 data = record33 io = StringIO.new(data[0,3])34 reader = Gauge::LogReader.new(:test, io)35 record = reader.next_record36 assert_nil record37 io.string, io.pos = data, 3 # needed because of bug in StringIO38 record = reader.next_record39 assert_not_nil record40 assert_equal $$, record.pid41 assert_equal :test, record.name42 assert_equal "demo", record.data43 assert_nil reader.next_record44 end45 46 31 private 47 32