Thanks Paolo - sadly same result :( I'm not using pyDAL, just the usual 
Web2py DAL

##################################
         ########305########
##################################
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 554, in <module>
    PenguinDoer(db_app)
  File "applications/yarpr/models/my_scheduler.py", line 468, in __init__
    debug_log(sys._getframe().f_code.co_name, None, start=method_start, 
error_details=ee, severity='Fail')
  File "applications/yarpr/models/do_debugging.py", line 197, in debug_log
    debug_flush()
  File "applications/yarpr/models/do_debugging.py", line 201, 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 e
OperationalError: (2006, 'MySQL server has gone away')

Here's the code:
        self.dbase.commit()
        self.dbase._adapter.close(action=None)
        try:
            # now the long running task - in the test it's a sleep for 305 
seconds.
            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:
            self.dbase._adapter.reconnect()
            this_doer = change_status(
                this_doer,
                FAILED,
                'Failed: ' + str(ee)
            )
            this_doer.update_record()
            debug_log(sys._getframe().f_code.co_name, None, 
start=method_start, error_details=ee, severity='Fail')
            raise Exception('Failure during method execution: ' + str(ee))

        self.dbase._adapter.reconnect()
        this_doer = change_status(
            this_doer,
            COMPLETED,
            'Normal exit'
        )




On Sunday, March 15, 2015 at 12:04:04 AM UTC+11, Paolo Valleri wrote:
>
> Hi,
> first of all use the latest pydal, it contains a fix when trying to close 
> 'broken connection'.
> Afterwards, for a proper reconnect in your application you should do:
> - db._adapter.close()
> - db._adapter.reconnect()
>
> If you are looking for an 'auto-reconnect', namely it will re-execute all 
> queries in the broken transaction, I've been working on it, have a look at 
> https://github.com/ilvalle/pydal/tree/auto-reconnect
> In this case it will re-execute all commands in the last transaction (but 
> if you do a db.commit() before the operation, then it is fine). 
> a discussion about this new feature is here: 
> https://groups.google.com/d/topic/web2py-developers/e161iZZmp0Y/discussion
> Finally, I've never tried it with mysql, but it should work since 
> an OperationalError is raised.
>
> Paolo
>
> On Saturday, March 14, 2015 at 5:50:49 AM UTC+1, Ian Ryder wrote:
>>
>> 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.

Reply via email to