Adar Dembo has submitted this change and it was merged. Change subject: rw_mutex: prevent recursive use ......................................................................
rw_mutex: prevent recursive use Todd provided an example[1] of deadlocked rwlocks due to a fairness policy. In the example, T1 (holding the lock for reading) join()ed on T2 (trying to acquire the lock for reading) all while T3 was trying to acquire the lock for writing. The lock's fairness policy prevented T2 from acquiring the read lock thus deadlocking all three threads. The takeaway is to be careful when calling join() while holding locks. Beyond that, deadlocks can arise if rwlocks are taken recursively. That's not a feature we need in our rwlocks, so I tried to disable it at the pthread level. Unfortunately, the best I can do is disable recursive write lock acquisition; read locks are apparently always recursive (see "man pthread_rwlockattr_setkind_np"). So instead, I built recursive checking into the RWMutex itself. It's quite slow so it's only present in debug builds. Note that pthread rwlocks do have some built-in deadlock detection (i.e. lock calls may return EDEADLK), but it doesn't appear to be comprehensive. 1. https://issues.apache.org/jira/browse/HDFS-2223?focusedCommentId=13097647&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13097647 Change-Id: I7ae30ec123a16c39ef0c15ee2d2176f807df03db Reviewed-on: http://gerrit.cloudera.org:8080/3641 Tested-by: Kudu Jenkins Reviewed-by: Dan Burkert <d...@cloudera.com> Reviewed-by: Todd Lipcon <t...@apache.org> --- M src/kudu/util/CMakeLists.txt A src/kudu/util/rw_mutex-test.cc M src/kudu/util/rw_mutex.cc M src/kudu/util/rw_mutex.h 4 files changed, 314 insertions(+), 4 deletions(-) Approvals: Dan Burkert: Looks good to me, approved Todd Lipcon: Looks good to me, approved Kudu Jenkins: Verified -- To view, visit http://gerrit.cloudera.org:8080/3641 To unsubscribe, visit http://gerrit.cloudera.org:8080/settings Gerrit-MessageType: merged Gerrit-Change-Id: I7ae30ec123a16c39ef0c15ee2d2176f807df03db Gerrit-PatchSet: 7 Gerrit-Project: kudu Gerrit-Branch: master Gerrit-Owner: Adar Dembo <a...@cloudera.com> Gerrit-Reviewer: Adar Dembo <a...@cloudera.com> Gerrit-Reviewer: Dan Burkert <d...@cloudera.com> Gerrit-Reviewer: Kudu Jenkins Gerrit-Reviewer: Todd Lipcon <t...@apache.org>