More deadlock fixing...
Change-Id: I8db4f4b813eaefa7b3d3b4c3d3b6350cfe01b017
diff --git a/services/wsprd/ipc/server/dispatcher.go b/services/wsprd/ipc/server/dispatcher.go
index 8b96fa5..da16e45 100644
--- a/services/wsprd/ipc/server/dispatcher.go
+++ b/services/wsprd/ipc/server/dispatcher.go
@@ -3,6 +3,7 @@
import (
"bytes"
"encoding/json"
+ "fmt"
"sync"
"v.io/wspr/veyron/services/wsprd/lib"
@@ -72,6 +73,16 @@
}
}
+func (d *dispatcher) Cleanup() {
+ d.mu.Lock()
+ defer d.mu.Unlock()
+
+ for _, ch := range d.outstandingLookups {
+ verr := verror2.Convert(verror2.Internal, nil, fmt.Errorf("Cleaning up dispatcher")).(verror2.Standard)
+ ch <- lookupReply{Err: &verr}
+ }
+}
+
// Lookup implements dispatcher interface Lookup.
func (d *dispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) {
flow := d.flowFactory.createFlow()
@@ -85,7 +96,8 @@
Suffix: suffix,
}
if err := flow.Writer.Send(lib.ResponseDispatcherLookup, message); err != nil {
- ch <- lookupReply{Err: verror2.Convert(verror2.Internal, nil, err).(*verror2.Standard)}
+ verr := verror2.Convert(verror2.Internal, nil, err).(verror2.Standard)
+ ch <- lookupReply{Err: &verr}
}
reply := <-ch
diff --git a/services/wsprd/ipc/server/server.go b/services/wsprd/ipc/server/server.go
index 321c624..b18e0af 100644
--- a/services/wsprd/ipc/server/server.go
+++ b/services/wsprd/ipc/server/server.go
@@ -4,6 +4,7 @@
import (
"encoding/json"
+ "fmt"
"sync"
"time"
@@ -476,6 +477,16 @@
}
s.mu.Lock()
defer s.mu.Unlock()
+
+ if s.dispatcher != nil {
+ s.dispatcher.Cleanup()
+ }
+
+ for _, ch := range s.outstandingAuthRequests {
+ ch <- fmt.Errorf("Cleaning up server")
+ }
+ s.outstandingAuthRequests = make(map[int32]chan error)
+
for _, ch := range s.outstandingServerRequests {
select {
case ch <- &result: