One of my thoughts was maybe the gc wiped out the identity_map and it gets
recreated empty.
Here is a stack trace of when I detect the situation prior to the flush
occurring.
[4018/eval_0/INFO/state/554/_modified_event] fc3a3a adding <sqlalchemy.orm.
> state.InstanceState object at 0x7f6a5bb989e8> as modified inSession:False
> [4018/eval_0/ERROR/evaluate/213/runEval] Evaluate job 4c4bdfaa caught
> exception, Oh Snap (Traceback (most recent call last):
> File "/home/cecil/monkey/server/app/evaluate/evaluate.py", line 207, in
> runEval
> _evaluateMovie(params)
> File "/home/cecil/monkey/server/app/evaluate/evaluate.py", line 196, in
> _evaluateMovie
> statusDetails=evalDetails)
> File "/home/cecil/monkey/server/app/metrics/metricsUtils.py", line 230,
> in updateRecordableEvent
> event.statusDetails = statusDetails[0:MAX_STATUS_DETAILS]
> File
> "/home/cecil/monkey/server/venv/lib/python3.4/site-packages/sqlalchemy/orm/attributes.py"
> , line 224, in __set__
> instance_dict(instance), value, None)
> File
> "/home/cecil/monkey/server/venv/lib/python3.4/site-packages/sqlalchemy/orm/attributes.py"
> , line 702, in set
> state._modified_event(dict_, self, old)
> File
> "/home/cecil/monkey/server/venv/lib/python3.4/site-packages/sqlalchemy/orm/state.py"
> , line 556, in _modified_event
> raise Exception('Oh Snap')
> Exception: Oh Snap
> )
>
> This is what I'm looking at in _modified_event, this occurs after the
> sleep in the earlier example.
>
instance_dict = self._instance_dict()
if instance_dict:
# ===DEBUGGING===
if isEvent: # just check objects of interest
inSession = instance_dict.contains_state(self)
logger.info('%s adding %s as modified inSession:%s',
msgNum, self, inSession)
if not inSession:
raise Exception('Oh Snap')
instance_dict._modified.add(self)
Here is the stack trace if I don't catch this early
[8370/eval_4/ERROR/evaluate/213/runEval] Evaluate job d498ba17 caught
exception, Over 100 subsequent flushes have occurred within session.commit()
- is an after_flush() hook creating new objects? (Traceback (most recent
call last):
File "/home/cecil/monkey/server/app/evaluate/evaluate.py", line 207, in
runEval
_evaluateMovie(params)
File "/home/cecil/monkey/server/app/evaluate/evaluate.py", line 196, in
_evaluateMovie
statusDetails=evalDetails)
File "/home/cecil/monkey/server/app/metrics/metricsUtils.py", line 288, in
updateRecordableEvent
addNotifEvent(event, workflowSequence=jobParams.get('workflowSequence'))
File "/home/cecil/monkey/server/app/notification/notifUtils.py", line 93,
in addNotifEvent
db.session.commit()
File
"/home/cecil/monkey/server/venv/lib/python3.4/site-packages/sqlalchemy/orm/scoping.py"
, line 157, in do
return getattr(self.registry(), name)(*args, **kwargs)
File
"/home/cecil/monkey/server/venv/lib/python3.4/site-packages/sqlalchemy/orm/session.py"
, line 822, in commit
self.transaction.commit()
File
"/home/cecil/monkey/server/venv/lib/python3.4/site-packages/sqlalchemy/orm/session.py"
, line 400, in commit
self._prepare_impl()
File
"/home/cecil/monkey/server/venv/lib/python3.4/site-packages/sqlalchemy/orm/session.py"
, line 383, in _prepare_impl
"Over 100 subsequent flushes have occurred within "
sqlalchemy.orm.exc.FlushError: Over 100 subsequent flushes have occurred
within session.commit() - is an after_flush() hook creating new objects?
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable
Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.