From d9b4aa1ad01a0506a544eaabe02a9852d01d5d4f Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 11 Nov 2011 10:51:44 +0000 Subject: [PATCH] pipeline: make errors easier to debug by including the request Otherwise it's outright painful to figure out what failed in a pipeline... --- lib/mogilefs/backend.rb | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/mogilefs/backend.rb b/lib/mogilefs/backend.rb index 24ce81a..89f88a3 100644 --- a/lib/mogilefs/backend.rb +++ b/lib/mogilefs/backend.rb @@ -178,7 +178,7 @@ class MogileFS::Backend raise MogileFS::PipelineError, "EOF with #{@pending.size} requests in-flight" ready = @pending.shift - ready.call(parse_response(line, false)) + ready[1].call(parse_response(line, ready[0])) end def timeout_update(timeout, t0) # :nodoc: @@ -221,7 +221,7 @@ class MogileFS::Backend # send the request out... begin io.timed_write(request, timeout) - @pending << block + @pending << [ request, block ] rescue SystemCallError, MogileFS::RequestTruncatedError => err @dead[@active_host] = [ Time.now, err ] shutdown_unlocked(@pending[0]) @@ -254,7 +254,7 @@ class MogileFS::Backend @mutex.synchronize do begin io = dispatch_unlocked(request) - line = io.timed_gets(@timeout) and return parse_response(line, true) + line = io.timed_gets(@timeout) and return parse_response(line) idempotent or raise EOFError, "end of file reached after: #{request.inspect}" @@ -290,13 +290,16 @@ class MogileFS::Backend # Turns the +line+ response from the server into a Hash of options, an # error, or raises, as appropriate. - def parse_response(line, raise_ok = true) + def parse_response(line, request = nil) if line =~ /^ERR\s+(\w+)\s*([^\r\n]*)/ @lasterr = $1 @lasterrstr = $2 ? url_unescape($2) : nil - e = error(@lasterr).new(@lasterrstr) - raise e if raise_ok - return e + if request + request = " request=#{request.strip}" + @lasterrstr = @lasterrstr ? (@lasterrstr << request) : request + return error(@lasterr).new(@lasterrstr) + end + raise error(@lasterr).new(@lasterrstr) end return url_decode($1) if line =~ /^OK\s+\d*\s*(\S*)\r\n\z/ -- 2.11.4.GIT