Ticket #3645 (closed defect: fixed)
MySQL connections don't reconnect after idle timeout
| Reported by: | willie@… | Owned by: | jonas |
|---|---|---|---|
| Priority: | high | Milestone: | 0.11.2 |
| Component: | general | Version: | 0.10 |
| Severity: | major | Keywords: | mysql timeout |
| Cc: |
Description
I tried to set up a new Trac using 0.10b1 and the MySQL backend. Installation went well and the install came up and worked exactly as expected. However, the next day, I'm receiving error 2006 (MySQL server has gone away) from the MySQLdb driver.
As far as I can tell, this is due to the idle timeout MySQL uses for client connections (8 hours by default, see http://dev.mysql.com/doc/refman/5.0/en/gone-away.html). Restarting the web server resurrects the connections. I can even refresh the browser view a few times and it will come back to life. I imagine this is because the handler now sees an invalid connection and creates a new one.
Here is the Python traceback:
Traceback (most recent call last):
File "/usr/lib/python2.4/site-packages/trac/web/main.py", line 335, in dispatch_request
dispatcher.dispatch(req)
File "/usr/lib/python2.4/site-packages/trac/web/main.py", line 192, in dispatch
req.perm = PermissionCache(self.env, req.authname)
File "/usr/lib/python2.4/site-packages/trac/perm.py", line 267, in __init__
self.perms = PermissionSystem(env).get_user_permissions(username)
File "/usr/lib/python2.4/site-packages/trac/perm.py", line 231, in get_user_permissions
for perm in self.store.get_user_permissions(username):
File "/usr/lib/python2.4/site-packages/trac/perm.py", line 111, in get_user_permissions
cursor.execute("SELECT username,action FROM permission")
File "/usr/lib/python2.4/site-packages/trac/db/util.py", line 48, in execute
return self.cursor.execute(sql)
File "/usr/lib/python2.4/site-packages/trac/db/util.py", line 48, in execute
return self.cursor.execute(sql)
File "/usr/lib/python2.4/site-packages/MySQLdb/cursors.py", line 163, in execute
self.errorhandler(self, exc, value)
File "/usr/lib/python2.4/site-packages/MySQLdb/connections.py", line 35, in defaulterrorhandler
raise errorclass, errorvalue
OperationalError: (2006, 'MySQL server has gone away')
The suggested fix would be to trap error 2006 and immediately attempt to reconnect to the database. If the error is returned again, go ahead and fail.



