HomePhabricator

rdbms: enforce and improve LBFactory/LoadBalancer callback handling

Description

rdbms: enforce and improve LBFactory/LoadBalancer callback handling

  • Handle the case where an onTransaction* callback for one handle adds more onTransaction* callbacks to a different handle. Instead of supporting only a short chain of such callbacks, try to resolve the whole chain by using a loop in LoadBalancer and LBFactory.
  • Add sanity checks to enforce the proper call order of LoadBalancer transaction methods, such as those that execute callbacks. This is the order that LBFactory already uses. Use ROUND_ERROR for problems that can ruin the instance state. Such problems require rollback.
  • Correct setTrxEndCallbackSuppression() calls in beginMasterChanges() that were making tests fail.
  • Make Database handle callback suppression for FLUSHING_ALL_PEERS instead of making LoadBalancer/LBFactory have to manage it.
  • Simplify finalizeMasterChanges() given that suppression does not actually effect runOnTransactionPreCommitCallbacks().
  • Make dangling callback warning in Database::close work properly.
  • Actually use $fname in flushReplicaSnapshots().
  • Use DBTransactionError instead of DBExpectedError in some places where stages fail.
  • Fix failing testGetScopedLock() unit tests so everything passes.

Add more comments to setTransactionListener and onTransactionIdle.

Change-Id: I6a25a6e4e5ba666e0da065a24846cbab7e786c7b