Added exponential (well, 0 -> 60 -> 300) reconnect backoff.

This commit is contained in:
Jeremy Fincher 2003-09-01 17:31:24 +00:00
parent 9600ada127
commit 1d77fa5354

View File

@ -48,7 +48,7 @@ instances = 0
originalPoll = conf.poll originalPoll = conf.poll
class SocketDriver(drivers.IrcDriver): class SocketDriver(drivers.IrcDriver):
def __init__(self, (server, port), irc): def __init__(self, (server, port), irc, reconnectWaits=(0, 60, 300)):
global instances global instances
instances += 1 instances += 1
conf.poll = originalPoll / instances conf.poll = originalPoll / instances
@ -59,6 +59,8 @@ class SocketDriver(drivers.IrcDriver):
self.inbuffer = '' self.inbuffer = ''
self.outbuffer = '' self.outbuffer = ''
self.connected = False self.connected = False
self.reconnectWaitsIndex = 0
self.reconnectWaits = reconnectWaits
self.reconnect() self.reconnect()
def _sendIfMsgs(self): def _sendIfMsgs(self):
@ -94,25 +96,34 @@ class SocketDriver(drivers.IrcDriver):
debug.recoverableException() debug.recoverableException()
except socket.timeout: except socket.timeout:
pass pass
except socket.error, e:
s = 'Disconnect from %s: %s' % (self.server, e.args[1])
debug.msg(s, 'normal')
self.die()
return
self._sendIfMsgs() self._sendIfMsgs()
def reconnect(self): def reconnect(self):
#debug.methodNamePrintf(self, 'reconnect') #debug.methodNamePrintf(self, 'reconnect')
self.conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.conn.settimeout(conf.poll) self.conn.settimeout(conf.poll)
if self.reconnectWaitsIndex < len(self.reconnectWaits)-1:
self.reconnectWaitsIndex += 1
try: try:
self.conn.connect(self.server) self.conn.connect(self.server)
self.connected = True
self.reconnectWaitPeriodsIndex = 0
except socket.error, e: except socket.error, e:
debug.msg('Error connecting to %s: %s' % (self.server, e)) debug.msg('Error connecting to %s: %s' % (self.server, e))
self.die() self.die()
self.connected = True
def die(self): def die(self):
#debug.methodNamePrintf(self, 'die') #debug.methodNamePrintf(self, 'die')
self.irc.reset() self.irc.reset()
self.conn.close() self.conn.close()
self.connected = False self.connected = False
when = time.time() + 60 when = time.time() + self.reconnectWaits[self.reconnectWaitsIndex]
whenS = time.strftime(conf.logTimestampFormat, time.localtime(when)) whenS = time.strftime(conf.logTimestampFormat, time.localtime(when))
debug.msg('Scheduling reconnect to %s at %s' % (self.server, whenS), debug.msg('Scheduling reconnect to %s at %s' % (self.server, whenS),
'normal') 'normal')