Adar Dembo has submitted this change and it was merged. Change subject: KUDU-2088: Synchronizer may not go out of scope with outstanding references ......................................................................
KUDU-2088: Synchronizer may not go out of scope with outstanding references A common Kudu pattern is to declare a Synchronizer on the stack, create a functor referencing it via AsStatusCallback, pass the functor into an asynchronous function, wait until the functor is invoked (via Wait), then allow the Synchronizer to go out of scope. This assumes that the async function only invokes the StatusCallback once; a safe assumption in Kudu. If using WaitFor instead of Wait, you must "fully wait" on the Synchronizer before it goes out of scope. That is, WaitFor must be called repeatedly until it no longer returns TimedOut, to ensure that whomever took the reference has used it and will not use it again. In this block of code, that invariant was violated. Namely, a failure in SnoozeFailureDetector led to an early destruction of log_synchronizer, causing a crash when the functor is invoked later. SnoozeFailureDetector could fail if the node was elected leader while waiting on the Synchronizer. Without the fix, raft_consensus-itest crashed in a particular way about one or two percent of the time. With it, these crashes no longer manifest. Change-Id: Icf9ce499616a872ad5ed4a27bd1e90e94fba5ff5 Reviewed-on: http://gerrit.cloudera.org:8080/7562 Reviewed-by: Todd Lipcon <[email protected]> Tested-by: Kudu Jenkins --- M src/kudu/consensus/raft_consensus.cc 1 file changed, 2 insertions(+), 1 deletion(-) Approvals: Todd Lipcon: Looks good to me, approved Kudu Jenkins: Verified -- To view, visit http://gerrit.cloudera.org:8080/7562 To unsubscribe, visit http://gerrit.cloudera.org:8080/settings Gerrit-MessageType: merged Gerrit-Change-Id: Icf9ce499616a872ad5ed4a27bd1e90e94fba5ff5 Gerrit-PatchSet: 2 Gerrit-Project: kudu Gerrit-Branch: master Gerrit-Owner: Adar Dembo <[email protected]> Gerrit-Reviewer: Adar Dembo <[email protected]> Gerrit-Reviewer: David Ribeiro Alves <[email protected]> Gerrit-Reviewer: Kudu Jenkins Gerrit-Reviewer: Todd Lipcon <[email protected]>
