Sorry, formatting was all screwy on the last bit of the OP - 2 processing running together, one lasting 295 seconds and saving without issue, the other lasting 305 seconds and failing because the SQL server has gone / isn't reconnected:
################################## ########295######### ################################## About to save statusClean exit for doer 2928 ################################## ########305######## ################################## About to save statusClean exit for doer 2925 (2013, 'Lost connection to MySQL server during query') Traceback (most recent call last): File "/home/ianryder/yarpr/web2py/gluon/restricted.py", line 224, in restricted exec ccode in environment File "applications/yarpr/models/my_scheduler.py", line 446, in <module> PenguinDoer(db_app) File "applications/yarpr/models/my_scheduler.py", line 382, in __init__ debug_log(sys._getframe().f_code.co_name, None, start=method_start, job_status=None) File "applications/yarpr/models/debug_framework.py", line 196, in debug_log debug_flush() File "applications/yarpr/models/debug_framework.py", line 200, in debug_flushdb_usage.debug_data.bulk_insert(DebugHandler.debug_records) File "/home/ianryder/yarpr/web2py/gluon/dal.py", line 9425, in bulk_insert ret = self._db._adapter.bulk_insert(self, items) File "/home/ianryder/yarpr/web2py/gluon/dal.py", line 1376, in bulk_insert return [self.insert(table, item) for item in items] File "/home/ianryder/yarpr/web2py/gluon/dal.py", line 1361, in insert raise e OperationalError: (2006, 'MySQL server has gone away') On Saturday, March 14, 2015 at 8:30:39 AM UTC+11, Ian Ryder wrote: > > Hi, we are using Web2py to do some batch processing of data but from day > one have had show-stopping issues with losing connection to MySQL on > PythonAnywhere. > > We've refactored the code to be much lighter in terms of batch sizes etc > which has made it much closer to perfect but we still have problems. > > Essentially we're going over the 300 second timeout on PA and web2py won't > reconnect no matter what we try. We have: > > - tried pool size 10 on the connection > - tried pool size 0 on the connection > - db.commit before kicking off the longer process > - db.close before kicking off the longer process > - tried reconnecting the entire DB when it drops > - tried db._adapter.reconnect() when it drops > > Same results every time...the basic steps are: > > - scheduled method called > - it calls batch task which loops through happily, constantly working on > the database > - returns to the original method which then tried to close a status record > off and that's where it bombs > > Here's some code: > self.my_pid = this_task.last_doer_pid > new_doer = { > 'doer_name': self.get_doer_name(this_task.id), > 'task_queue': this_task.id, > 'method_name': this_task.method_name, > 'pid': self.my_pid > } > this_doer_id = > self.dbase.task_doer.insert(**self.dbase.task_doer._filter_fields(new_doer)) > this_doer = self.dbase.task_doer[this_doer_id] > this_task.update_record(status=RUNNING, last_doer_id=this_doer.id, > doer_name=new_doer['doer_name']) > self.dbase.commit() > > <snip socket handling> > <snip method name getting> > > if not run_method: > this_doer.update_record(status=FAILED, status_note='Method %s > not implemented' % this_task.method_name) > self.dbase.commit() > raise Exception('Method %s not implemented' % > this_task.method_name) > > passed_args = passed_vars = None > # close off the connection so it doesn't drop out during the > processing > self.dbase.commit() > try: > run_method( > *loads(this_task.args, object_hook=self._decode_dict), > **loads(this_task.vars, object_hook=self._decode_dict)) #, > *passed_vars) > except Exception as ee: > this_doer.update_record(status=FAILED, status_note='Failed: ' > + str(ee)) > debug_log(sys._getframe().f_code.co_name, None, > start=method_start, error_details=ee, severity='Fail' ) > > raise Exception('Failure during method execution: ' + ee) > > print 'About to save status' > this_doer.update_record(status=COMPLETED, status_note='Normal > exit') > self.dbase.commit() > > print 'Clean exit for doer ' + str(this_doer.pid) > > Just to confirm, here's a test with 2 processes, one waiting 295 seconds > and closing fine, the other waiting 305 seconds and blowing up: > > Database drivers available: SQLite(sqlite3), MySQL(pymysql), > MySQL(MySQLdb), MySQL(mysqlconnector), PostgreSQL(psycopg2), > PostgreSQL(pg8000), MSSQL(pyodbc), DB2(pyodbc), Teradata(pyodbc), > Ingres(pyodbc), MongoDB(pymongo), IMAP(imaplib) > ################################## ########295######## > ##################################About to save statusClean exit for doer > 2928################################## ########305######## > ##################################(2013, 'Lost connection to MySQL server > during query')About to save statusClean exit for doer 2925Traceback (most > recent call last): File > "/home/ianryder/yarpr/web2py/gluon/restricted.py", line 224, in restricted > exec ccode in environment File > "applications/yarpr/models/my_scheduler.py", line 446, in <module> > PenguinDoer(db_app) File "applications/yarpr/models/my_scheduler.py", > line 382, in __init__ debug_log(sys._getframe().f_code.co_name, None, > start=method_start, job_status=None) File > "applications/yarpr/models/debug_framework.py", line 196, in debug_log > debug_flush() File "applications/yarpr/models/debug_framework.py", line > 200, in debug_flush > db_usage.debug_data.bulk_insert(DebugHandler.debug_records) File > "/home/ianryder/yarpr/web2py/gluon/dal.py", line 9425, in bulk_insert ret > = self._db._adapter.bulk_insert(self, items) File > "/home/ianryder/yarpr/web2py/gluon/dal.py", line 1376, in bulk_insert > return [self.insert(table, item) for item in items] File > "/home/ianryder/yarpr/web2py/gluon/dal.py", line 1361, in insert raise > eOperationalError: > (2006, 'MySQL server has gone away') > Any help appreciated! > > Cheers > Ian > -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.