From a9ac75934eaafed1de75785e5ae090f2ac690ab2 Mon Sep 17 00:00:00 2001 From: Ward Wouts Date: Fri, 17 May 2002 09:32:50 +0000 Subject: [PATCH] Implement timeout mechanism. Only works for getting article bodies at the moment, should implement it for getting article lists too. --- trunk/ripnews/news/article.rb | 130 +++++++++++++++++++--------------- 1 file changed, 74 insertions(+), 56 deletions(-) diff --git a/trunk/ripnews/news/article.rb b/trunk/ripnews/news/article.rb index 82e1c40..32dd248 100644 --- a/trunk/ripnews/news/article.rb +++ b/trunk/ripnews/news/article.rb @@ -7,6 +7,7 @@ require 'set/intspan' require 'net/nntp' require 'news/newsrc' require 'tempfile' +require 'timeout' class Article @@ -32,6 +33,7 @@ def initialize(nntpservers, groupname, newsrc="~/.newsrc") @connections[server]["skip_ids"] = Set::IntSpan.new() @connections[server]["newsrc"] = News::Newsrc.new("#{newsrc}.#{server}") set_skip_ids(server, @connections[server]["newsrc"].marked_articles(@group)) + print "Connection type: #{@connections[server]["nntp"].type.to_s}\n" } end @@ -157,6 +159,40 @@ def get_groupname return @group end +def get_body(server, message) + timedout = 0 + resp = "" + id = "" + messid = "" + list = [] + begin + if timedout > 1 + print "Too many timeouts!\n" + return false + end + timeout(180) do + begin + resp, id, messid, list = @connections[server]["nntp"].body(message) + rescue Net::NNTPReplyError + print "Caught Net::NNTPReplyError reading article #{messid} from #{server}\n" + print "Error: #{$!}\n" + return false + rescue Errno::EPIPE, Errno::ECONNRESET + print "Caught Errno::EPIPE reading from server #{server}\n" + print "Error: #{$!}\n" + reconnect(server) + retry + end + end + return resp, id, messid, list + rescue TimeoutError + print "Time out, reconnecting to server\n" + reconnect(server) + timedout += 1 + retry + end +end + def get_group_body(subj) result = [] group_subject_sort(subj) @@ -169,26 +205,20 @@ def get_group_body(subj) print "id: #{@groups[subj]["ids"][i]}\n" if Debuglevel > 1 print "server: #{@groups[subj]["servers"][i]}\n" if Debuglevel > 0 begin - resp, id, messid, list = @connections[@groups[subj]["servers"][i]]["nntp"].body(@groups[subj]["messages"][i]) - rescue Net::NNTPReplyError - print "Caught Net::NNTPReplyError in get_group_body reading article #{@groups[subj]["messages"][0]}\n" - print "Error: #{$!}\n" - print "mess-id i: #{@groups[subj]["messages"][i]}\n" - print "mess-id i+1: #{@groups[subj]["messages"][i+1]}\n" - if (i+1 < @groups[subj]["messages"].length) and - (@groups[subj]["messages"][i] == @groups[subj]["messages"][i+1]) - print "Trying next server\n" - i += 1 - retry - else print "message-id not on another server :(\n" - return false + resp, id, messid, list = get_body(@groups[subj]["servers"][i], @groups[subj]["messages"][i]) + if resp == false + print "mess-id i: #{@groups[subj]["messages"][i]}\n" + print "mess-id i+1: #{@groups[subj]["messages"][i+1]}\n" + if (i+1 < @groups[subj]["messages"].length) and + (@groups[subj]["messages"][i] == @groups[subj]["messages"][i+1]) + print "Trying next server...\n" + i += 1 + retry + else + print "Message-id not on another server :( Skipping...\n" + return false + end end - return false - rescue Errno::EPIPE, Errno::ECONNRESET - print "Caught Errno::EPIPE reading from server #{@groups[subj]["servers"][i]}\n" - print "Error: #{$!}\n" - reconnect(@groups[subj]["servers"][i]) - retry end @gotten[ @groups[subj]["messages"][i] ] = true result = list @@ -207,22 +237,20 @@ def get_group_body_first(subj) print "id: #{@groups[subj]["ids"][i]}\n" if Debuglevel > 1 print "server: #{@groups[subj]["servers"][0]}\n" if Debuglevel > 0 begin - resp, id, messid, list = @connections[@groups[subj]["servers"][i]]["nntp"].body(@groups[subj]["messages"][i]) - rescue Net::NNTPReplyError - print "Caught Net::NNTPReplyError in get_group_body_first reading article #{@groups[subj]["messages"][0]}\n" - print "Error: #{$!}\n" - if (i+1 < @groups[subj]["messages"].length) and - (@groups[subj]["messages"][i] == @groups[subj]["messages"][i+1]) - print "Trying next server...\n" - i += 1 - next + resp, id, messid, list = get_body(@groups[subj]["servers"][i], @groups[subj]["messages"][i]) + if resp == false + print "mess-id i: #{@groups[subj]["messages"][i]}\n" + print "mess-id i+1: #{@groups[subj]["messages"][i+1]}\n" + if (i+1 < @groups[subj]["messages"].length) and + (@groups[subj]["messages"][i] == @groups[subj]["messages"][i+1]) + print "Trying next server...\n" + i += 1 + retry + else + print "Message-id not on another server :( Skipping...\n" + return false + end end - return false - rescue Errno::EPIPE, Errno::ECONNRESET - print "Caught Errno::EPIPE reading from server #{@groups[subj]["servers"][i]}\n" - print "Error: #{$!}\n" - reconnect(@groups[subj]["servers"][i]) - retry end @gotten[@groups[subj]["messages"][i]] = true end @@ -240,30 +268,20 @@ def get_group_body_rest(subj, file=nil) print "id: #{@groups[subj]["ids"][i]}\n" if Debuglevel > 1 print "server: #{@groups[subj]["servers"][i]}\n" if Debuglevel > 0 begin - resp, id, messid, list = @connections[@groups[subj]["servers"][i]]["nntp"].body(@groups[subj]["messages"][i]) + resp, id, messid, list = get_body(@groups[subj]["servers"][i], @groups[subj]["messages"][i]) if resp == false - return false + print "mess-id i: #{@groups[subj]["messages"][i]}\n" + print "mess-id i+1: #{@groups[subj]["messages"][i+1]}\n" + if (i+1 < @groups[subj]["messages"].length) and + (@groups[subj]["messages"][i] == @groups[subj]["messages"][i+1]) + print "Trying next server...\n" + i += 1 + retry + else + print "Message-id not on another server :( Skipping...\n" + return false + end end - rescue Net::NNTPReplyError - print "Caught Net::NNTPReplyError in get_group_body_rest reading article #{@groups[subj]["messages"][0]}\n" - print "Error: #{$!}\n" - print "mess-id i: #{@groups[subj]["messages"][i]}\n" - print "mess-id i+1: #{@groups[subj]["messages"][i+1]}\n" - if (i+1 < @groups[subj]["messages"].length) and - (@groups[subj]["messages"][i] == @groups[subj]["messages"][i+1]) - print "Trying next server...\n" - i += 1 - retry - else - print "Message-id not on another server :( Skipping...\n" - return false - end - return false - rescue Errno::EPIPE, Errno::ECONNRESET - print "Caught Errno::EPIPE reading from server #{@groups[subj]["servers"][i]}\n" - print "Error: #{$!}\n" - reconnect(@groups[subj]["servers"][i]) - retry end @gotten[ @groups[subj]["messages"][i] ] = true if file