It looks like I found the problem (actually two problems) and fixed it. It was over-simplified implementation of mysql.DatabaseWrapper class, which didn't take into account how Django uses it.
Now I don't know, if it makes sense to submit a patch right now --- it should be regression-tested before deemed worthy of deployment. Let me run it on my site for a while and see if I have any problems. Thanks, Eugene "Eugene Lazutkin" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > > Hello, > > I host my Django app on Dreamhost. They provide MySQL. I am getting a > weird MySQL-related error on regular basis: "OperationalError: (2013, > 'Lost connection to MySQL server during query')". Typical traceback is at > the end of this message. > > Typically it happens when I do 1st-2nd access to my app after long pause > (~hour or so). Usually it works fine after that until I stop using it for > several hours. It may be Dreamhost's problem (e.g., network connection is > flakey) but I cannot believe it went unnoticed for so long. > > Can it be Django's problem? One possibility is Django sets some timeout > property on MySQL connection, which is too small. Or default timeout is > too small. Maybe some code should check that connection is alive and > re-establish it, if it is dead. > > Another possibility is I am doing something wrong. Well, the app works > fine locally without any hiccups. It works as expected after first "lost > connection" error(s). I don't use any raw SQL. > > I am at loss. I appreciate any ideas. > > Thanks, > > Eugene > > =========================== > File "/home/myname/djsrc/django/core/handlers/base.py", line 64, in > get_response > response = callback(request, **param_dict) > > File "/home/myname/djsrc/django/views/generic/date_based.py", line 49, in > archive_index > return HttpResponse(t.render(c)) > > File "/home/myname/djsrc/django/core/template.py", line 115, in render > return self.nodelist.render(context) > > File "/home/myname/djsrc/django/core/template.py", line 440, in render > bits.append(node.render(context)) > > File "/home/myname/djsrc/django/core/template_loader.py", line 97, in > render > return compiled_parent.render(context) > > File "/home/myname/djsrc/django/core/template.py", line 115, in render > return self.nodelist.render(context) > > File "/home/myname/djsrc/django/core/template.py", line 440, in render > bits.append(node.render(context)) > > File "/home/myname/djsrc/django/core/template_loader.py", line 97, in > render > return compiled_parent.render(context) > > File "/home/myname/djsrc/django/core/template.py", line 115, in render > return self.nodelist.render(context) > > File "/home/myname/djsrc/django/core/template.py", line 440, in render > bits.append(node.render(context)) > > File "/home/myname/djsrc/django/core/template_loader.py", line 54, in > render > result = self.nodelist.render(context) > > File "/home/myname/djsrc/django/core/template.py", line 440, in render > bits.append(node.render(context)) > > File "/home/myname/djsrc/django/core/defaulttags.py", line 107, in render > nodelist.append(node.render(context)) > > File "/home/myname/djp/home/apps/blog/templatetags/blog.py", line 99, in > render > context['info'] = template.Template(INFO_TEMPLATE).render(context) > > File "/home/myname/djsrc/django/core/template.py", line 115, in render > return self.nodelist.render(context) > > File "/home/myname/djsrc/django/core/template.py", line 440, in render > bits.append(node.render(context)) > > File "/home/myname/djsrc/django/core/template.py", line 470, in render > output = resolve_variable_with_filters(self.var_string, context) > > File "/home/myname/djsrc/django/core/template.py", line 411, in > resolve_variable_with_filters > obj = resolve_variable(var, context) > > File "/home/myname/djsrc/django/core/template.py", line 389, in > resolve_variable > current = current() > > File "/home/myname/djsrc/django/utils/functional.py", line 3, in _curried > return args[0](*(args[1:]+moreargs), **dict(kwargs.items() + > morekwargs.items())) > > File "/home/myname/djsrc/django/core/meta/__init__.py", line 873, in > method_get_many_to_one > retrieved_obj = mod.get_object(**{'%s__exact' % > field_with_rel.rel.field_name: val}) > > File "/home/myname/djsrc/django/utils/functional.py", line 3, in _curried > return args[0](*(args[1:]+moreargs), **dict(kwargs.items() + > morekwargs.items())) > > File "/home/myname/djsrc/django/core/meta/__init__.py", line 1080, in > function_get_object > obj_list = function_get_list(opts, klass, **kwargs) > > File "/home/myname/djsrc/django/core/meta/__init__.py", line 1120, in > function_get_list > return list(function_get_iterator(opts, klass, **kwargs)) > > File "/home/myname/djsrc/django/core/meta/__init__.py", line 1103, in > function_get_iterator > cursor.execute("SELECT " + (kwargs.get('distinct') and "DISTINCT " or > "") + ",".join(select) + sql, params) > > File "/usr/lib/python2.3/site-packages/MySQLdb/cursors.py", line 137, in > execute > self.errorhandler(self, exc, value) > > File "/usr/lib/python2.3/site-packages/MySQLdb/connections.py", line 33, > in defaulterrorhandler > raise errorclass, errorvalue > > OperationalError: (2013, 'Lost connection to MySQL server during query') > > =========================== > > > >