Implement timeout mechanism. Only works for getting article bodies at
the moment, should implement it for getting article lists too.
This commit is contained in:
parent
2f43fb8d3f
commit
a9ac75934e
1 changed files with 74 additions and 56 deletions
|
|
@ -7,6 +7,7 @@ require 'set/intspan'
|
||||||
require 'net/nntp'
|
require 'net/nntp'
|
||||||
require 'news/newsrc'
|
require 'news/newsrc'
|
||||||
require 'tempfile'
|
require 'tempfile'
|
||||||
|
require 'timeout'
|
||||||
|
|
||||||
class Article
|
class Article
|
||||||
|
|
||||||
|
|
@ -32,6 +33,7 @@ def initialize(nntpservers, groupname, newsrc="~/.newsrc")
|
||||||
@connections[server]["skip_ids"] = Set::IntSpan.new()
|
@connections[server]["skip_ids"] = Set::IntSpan.new()
|
||||||
@connections[server]["newsrc"] = News::Newsrc.new("#{newsrc}.#{server}")
|
@connections[server]["newsrc"] = News::Newsrc.new("#{newsrc}.#{server}")
|
||||||
set_skip_ids(server, @connections[server]["newsrc"].marked_articles(@group))
|
set_skip_ids(server, @connections[server]["newsrc"].marked_articles(@group))
|
||||||
|
print "Connection type: #{@connections[server]["nntp"].type.to_s}\n"
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -157,6 +159,40 @@ def get_groupname
|
||||||
return @group
|
return @group
|
||||||
end
|
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)
|
def get_group_body(subj)
|
||||||
result = []
|
result = []
|
||||||
group_subject_sort(subj)
|
group_subject_sort(subj)
|
||||||
|
|
@ -169,26 +205,20 @@ def get_group_body(subj)
|
||||||
print "id: #{@groups[subj]["ids"][i]}\n" if Debuglevel > 1
|
print "id: #{@groups[subj]["ids"][i]}\n" if Debuglevel > 1
|
||||||
print "server: #{@groups[subj]["servers"][i]}\n" if Debuglevel > 0
|
print "server: #{@groups[subj]["servers"][i]}\n" if Debuglevel > 0
|
||||||
begin
|
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])
|
||||||
rescue Net::NNTPReplyError
|
if resp == false
|
||||||
print "Caught Net::NNTPReplyError in get_group_body reading article #{@groups[subj]["messages"][0]}\n"
|
print "mess-id i: #{@groups[subj]["messages"][i]}\n"
|
||||||
print "Error: #{$!}\n"
|
print "mess-id i+1: #{@groups[subj]["messages"][i+1]}\n"
|
||||||
print "mess-id i: #{@groups[subj]["messages"][i]}\n"
|
if (i+1 < @groups[subj]["messages"].length) and
|
||||||
print "mess-id i+1: #{@groups[subj]["messages"][i+1]}\n"
|
(@groups[subj]["messages"][i] == @groups[subj]["messages"][i+1])
|
||||||
if (i+1 < @groups[subj]["messages"].length) and
|
print "Trying next server...\n"
|
||||||
(@groups[subj]["messages"][i] == @groups[subj]["messages"][i+1])
|
i += 1
|
||||||
print "Trying next server\n"
|
retry
|
||||||
i += 1
|
else
|
||||||
retry
|
print "Message-id not on another server :( Skipping...\n"
|
||||||
else print "message-id not on another server :(\n"
|
return false
|
||||||
return false
|
end
|
||||||
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
|
end
|
||||||
@gotten[ @groups[subj]["messages"][i] ] = true
|
@gotten[ @groups[subj]["messages"][i] ] = true
|
||||||
result = list
|
result = list
|
||||||
|
|
@ -207,22 +237,20 @@ def get_group_body_first(subj)
|
||||||
print "id: #{@groups[subj]["ids"][i]}\n" if Debuglevel > 1
|
print "id: #{@groups[subj]["ids"][i]}\n" if Debuglevel > 1
|
||||||
print "server: #{@groups[subj]["servers"][0]}\n" if Debuglevel > 0
|
print "server: #{@groups[subj]["servers"][0]}\n" if Debuglevel > 0
|
||||||
begin
|
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])
|
||||||
rescue Net::NNTPReplyError
|
if resp == false
|
||||||
print "Caught Net::NNTPReplyError in get_group_body_first reading article #{@groups[subj]["messages"][0]}\n"
|
print "mess-id i: #{@groups[subj]["messages"][i]}\n"
|
||||||
print "Error: #{$!}\n"
|
print "mess-id i+1: #{@groups[subj]["messages"][i+1]}\n"
|
||||||
if (i+1 < @groups[subj]["messages"].length) and
|
if (i+1 < @groups[subj]["messages"].length) and
|
||||||
(@groups[subj]["messages"][i] == @groups[subj]["messages"][i+1])
|
(@groups[subj]["messages"][i] == @groups[subj]["messages"][i+1])
|
||||||
print "Trying next server...\n"
|
print "Trying next server...\n"
|
||||||
i += 1
|
i += 1
|
||||||
next
|
retry
|
||||||
|
else
|
||||||
|
print "Message-id not on another server :( Skipping...\n"
|
||||||
|
return false
|
||||||
|
end
|
||||||
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
|
end
|
||||||
@gotten[@groups[subj]["messages"][i]] = true
|
@gotten[@groups[subj]["messages"][i]] = true
|
||||||
end
|
end
|
||||||
|
|
@ -240,30 +268,20 @@ def get_group_body_rest(subj, file=nil)
|
||||||
print "id: #{@groups[subj]["ids"][i]}\n" if Debuglevel > 1
|
print "id: #{@groups[subj]["ids"][i]}\n" if Debuglevel > 1
|
||||||
print "server: #{@groups[subj]["servers"][i]}\n" if Debuglevel > 0
|
print "server: #{@groups[subj]["servers"][i]}\n" if Debuglevel > 0
|
||||||
begin
|
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
|
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
|
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
|
end
|
||||||
@gotten[ @groups[subj]["messages"][i] ] = true
|
@gotten[ @groups[subj]["messages"][i] ] = true
|
||||||
if file
|
if file
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue