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