469 operation.handle_event('%s_event' % trstate) |
469 operation.handle_event('%s_event' % trstate) |
470 self.pending_operations[:] = processed |
470 self.pending_operations[:] = processed |
471 self.debug('%s session %s done', trstate, self.id) |
471 self.debug('%s session %s done', trstate, self.id) |
472 except: |
472 except: |
473 self.exception('error while %sing', trstate) |
473 self.exception('error while %sing', trstate) |
|
474 # if error on [pre]commit: |
|
475 # |
|
476 # * set .failed = True on the operation causing the failure |
|
477 # * call revert<event>_event on processed operations |
|
478 # * call rollback_event on *all* operations |
|
479 # |
|
480 # that seems more natural than not calling rollback_event |
|
481 # for processed operations, and allow generic rollback |
|
482 # instead of having to implements rollback, revertprecommit |
|
483 # and revertcommit, that will be enough in mont case. |
474 operation.failed = True |
484 operation.failed = True |
475 for operation in processed: |
485 for operation in processed: |
476 operation.handle_event('revert%s_event' % trstate) |
486 operation.handle_event('revert%s_event' % trstate) |
|
487 # res |
|
488 self.pending_operations = processed + self.pending_operations |
477 self.rollback(reset_pool) |
489 self.rollback(reset_pool) |
478 raise |
490 raise |
479 self.pool.commit() |
491 self.pool.commit() |
480 self.commit_state = trstate = 'postcommit' |
492 self.commit_state = trstate = 'postcommit' |
481 while self.pending_operations: |
493 while self.pending_operations: |