Jelajahi Sumber

Avoided RLock being taken twice for same mutex variable of same host which leads to deadlock if any WLock is requested inbetween two RLock by other routine (#945)

* Avoided RLock being taken twice for same mutex variable of same host which leads to deadlock if any WLock is requested inbetween two RLock by other routine

* Author list updated

* enberg code review comments: comments corrected
parsaila 8 tahun lalu
induk
melakukan
b96c067a43
2 mengubah file dengan 9 tambahan dan 2 penghapusan
  1. 1 0
      AUTHORS
  2. 8 2
      host_source.go

+ 1 - 0
AUTHORS

@@ -92,3 +92,4 @@ Raphael Gavache <raphael.gavache@gmail.com>
 Yasser Abdolmaleki <yasser@yasser.ca>
 Krishnanand Thommandra <devtkrishna@gmail.com>
 Blake Atkinson <me@blakeatkinson.com>
+Dharmendra Parsaila <d4dharmu@gmail.com>

+ 8 - 2
host_source.go

@@ -123,8 +123,14 @@ type HostInfo struct {
 func (h *HostInfo) Equal(host *HostInfo) bool {
 	h.mu.RLock()
 	defer h.mu.RUnlock()
-	host.mu.RLock()
-	defer host.mu.RUnlock()
+	//If both hosts pointers are same then lock is required only once because of below reasons:
+	//Reason 1: There is no point taking lock twice on same mutex variable.
+	//Reason 2: It may lead to deadlock e.g. if WLock is requested by other routine in between 1st & 2nd RLock
+	//So WLock will be blocked on 1st RLock and 2nd RLock will be blocked on requested WLock.
+	if h != host {
+		host.mu.RLock()
+		defer host.mu.RUnlock()
+	}
 
 	return h.ConnectAddress().Equal(host.ConnectAddress())
 }