Sfoglia il codice sorgente

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 anni fa
parent
commit
b96c067a43
2 ha cambiato i file con 9 aggiunte e 2 eliminazioni
  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())
 }