Merge lp:~rogpeppe/juju-core/213-rpc-test-timeouts into lp:~juju/juju-core/trunk

Proposed by Roger Peppe
Status: Merged
Merged at revision: 888
Proposed branch: lp:~rogpeppe/juju-core/213-rpc-test-timeouts
Merge into: lp:~juju/juju-core/trunk
Diff against target: 157 lines (+34/-54)
2 files modified
rpc/rpc_test.go (+34/-15)
rpc/server.go (+0/-39)
To merge this branch: bzr merge lp:~rogpeppe/juju-core/213-rpc-test-timeouts
Reviewer Review Type Date Requested Status
The Go Language Gophers Pending
Review via email: mp+148162@code.launchpad.net

Description of the change

rpc: don't hang tests on failure

As suggested in previous CL.
Also delete Accept method, also suggested earlier
and not done.

https://codereview.appspot.com/7324046/

To post a comment you must log in.
Revision history for this message
Roger Peppe (rogpeppe) wrote :

Reviewers: mp+148162_code.launchpad.net,

Message:
Please take a look.

Description:
rpc: don't hang tests on failure

https://code.launchpad.net/~rogpeppe/juju-core/213-rpc-test-timeouts/+merge/148162

(do not edit description out of merge proposal)

Please review this at https://codereview.appspot.com/7324046/

Affected files:
   A [revision details]
   M rpc/rpc_test.go

Index: [revision details]
=== added file '[revision details]'
--- [revision details] 2012-01-01 00:00:00 +0000
+++ [revision details] 2012-01-01 00:00:00 +0000
@@ -0,0 +1,2 @@
+Old revision: <email address hidden>
+New revision: <email address hidden>

Index: rpc/rpc_test.go
=== modified file 'rpc/rpc_test.go'
--- rpc/rpc_test.go 2013-02-12 15:37:30 +0000
+++ rpc/rpc_test.go 2013-02-13 12:18:19 +0000
@@ -160,7 +160,7 @@
    }
   }
   client.Close()
- err := <-srvDone
+ err := chanReadError(c, srvDone, "server done")
   c.Assert(err, IsNil)
  }

@@ -211,29 +211,29 @@
   }

   client, srvDone := newRPCClientServer(c, root)
- call := func(id string, done chan<- bool) {
+ call := func(id string, done chan<- struct{}) {
    var r stringVal
    err := client.Call("DelayedMethods", id, "Delay", nil, &r)
    c.Check(err, IsNil)
    c.Check(r.Val, Equals, "return "+id)
- done <- true
+ done <- struct{}{}
   }
- done1 := make(chan bool)
- done2 := make(chan bool)
+ done1 := make(chan struct{})
+ done2 := make(chan struct{})
   go call("1", done1)
   go call("2", done2)

   // Check that both calls are running concurrently.
- <-ready1
- <-ready2
+ chanRead(c, ready1, "method 1 ready")
+ chanRead(c, ready2, "method 2 ready")

   // Let the requests complete.
   start1 <- "return 1"
   start2 <- "return 2"
- <-done1
- <-done2
+ chanRead(c, done1, "method 1 done")
+ chanRead(c, done2, "method 2 done")
   client.Close()
- err := <-srvDone
+ err := chanReadError(c, srvDone, "server done")
   c.Assert(err, IsNil)
  }

@@ -249,14 +249,14 @@
    },
   }
   client, srvDone := newRPCClientServer(c, root)
- done := make(chan bool)
+ done := make(chan struct{})
   go func() {
    var r stringVal
    err := client.Call("DelayedMethods", "1", "Delay", nil, &r)
    c.Check(err, FitsTypeOf, &net.OpError{})
- done <- true
+ done <- struct{}{}
   }()
- <-ready
+ chanRead(c, ready, "DelayedMethods.Delay ready")
   client.Close()
   select {
   case err := <-srvDone:
@@ -265,9 +265,28 @@
   case <-time.After(25 * time.Millisecond):
   }
   start <- "xxx"
- err := <-srvDone
+ err := chanReadError(c, srvDone, "server done")
   c.Check(err, IsNil)
- <-done
+ chanRead(c, done, "DelayedMethods.Delay done")
+}
+
+func chanRead(c *C, ch <-chan struct{}, what string) {
+ select {
+ case <-ch:
+ return
+ case <-time.After(3 * time.Second):
+ c.Fatalf("timeout on channel read %s", what)
+ }
+}
+
+func chanReadError(c *C, ch <-chan error, what string) error {
+ select {
+ case e := <-ch:
+ return e
+ case <-time.After(3 * time.Second):
+ c.Fatalf("timeout on channel read %s", what)
+ }
+ panic("unreachable")
  }

  // newRPCClientServer starts an RPC server serving a connection from a

Revision history for this message
Dimiter Naydenov (dimitern) wrote :
Revision history for this message
John A Meinel (jameinel) wrote :

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 2013-02-13 16:40, Dimiter Naydenov wrote:
> LGTM
>
> https://codereview.appspot.com/7324046/
>

LGTM

I can confirm that it makes the tests fail quickly rather than hang
until the 5min timeout.

Of course, better if they didn't fail, but this is still an
improvement. :)

John
=:->
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.13 (Cygwin)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iEYEARECAAYFAlEbiyQACgkQJdeBCYSNAAPYNQCgu/8iZnXoGba5+RMHDdo3XQoE
PYEAnRco0W3eMPh1BunHCHQ/DjYulkvF
=oBYC
-----END PGP SIGNATURE-----

Revision history for this message
William Reade (fwereade) wrote :

LGTM, one suggestion

https://codereview.appspot.com/7324046/diff/2001/rpc/rpc_test.go
File rpc/rpc_test.go (right):

https://codereview.appspot.com/7324046/diff/2001/rpc/rpc_test.go#newcode277
rpc/rpc_test.go:277: case <-time.After(3 * time.Second):
Can we reasonably drop this to, say, half a second?

https://codereview.appspot.com/7324046/

Revision history for this message
Roger Peppe (rogpeppe) wrote :
Revision history for this message
Roger Peppe (rogpeppe) wrote :

*** Submitted:

rpc: don't hang tests on failure

As suggested in previous CL.
Also delete Accept method, also suggested earlier
and not done.

R=dimitern, fwereade
CC=
https://codereview.appspot.com/7324046

https://codereview.appspot.com/7324046/diff/2001/rpc/rpc_test.go
File rpc/rpc_test.go (right):

https://codereview.appspot.com/7324046/diff/2001/rpc/rpc_test.go#newcode277
rpc/rpc_test.go:277: case <-time.After(3 * time.Second):
On 2013/02/13 12:56:35, fwereade wrote:
> Can we reasonably drop this to, say, half a second?

why bother? the timeout only happens on test failure, and in that case 3
seconds isn't an issue.

https://codereview.appspot.com/7324046/

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'rpc/rpc_test.go'
2--- rpc/rpc_test.go 2013-02-12 15:37:30 +0000
3+++ rpc/rpc_test.go 2013-02-13 13:05:28 +0000
4@@ -160,7 +160,7 @@
5 }
6 }
7 client.Close()
8- err := <-srvDone
9+ err := chanReadError(c, srvDone, "server done")
10 c.Assert(err, IsNil)
11 }
12
13@@ -211,29 +211,29 @@
14 }
15
16 client, srvDone := newRPCClientServer(c, root)
17- call := func(id string, done chan<- bool) {
18+ call := func(id string, done chan<- struct{}) {
19 var r stringVal
20 err := client.Call("DelayedMethods", id, "Delay", nil, &r)
21 c.Check(err, IsNil)
22 c.Check(r.Val, Equals, "return "+id)
23- done <- true
24+ done <- struct{}{}
25 }
26- done1 := make(chan bool)
27- done2 := make(chan bool)
28+ done1 := make(chan struct{})
29+ done2 := make(chan struct{})
30 go call("1", done1)
31 go call("2", done2)
32
33 // Check that both calls are running concurrently.
34- <-ready1
35- <-ready2
36+ chanRead(c, ready1, "method 1 ready")
37+ chanRead(c, ready2, "method 2 ready")
38
39 // Let the requests complete.
40 start1 <- "return 1"
41 start2 <- "return 2"
42- <-done1
43- <-done2
44+ chanRead(c, done1, "method 1 done")
45+ chanRead(c, done2, "method 2 done")
46 client.Close()
47- err := <-srvDone
48+ err := chanReadError(c, srvDone, "server done")
49 c.Assert(err, IsNil)
50 }
51
52@@ -249,14 +249,14 @@
53 },
54 }
55 client, srvDone := newRPCClientServer(c, root)
56- done := make(chan bool)
57+ done := make(chan struct{})
58 go func() {
59 var r stringVal
60 err := client.Call("DelayedMethods", "1", "Delay", nil, &r)
61 c.Check(err, FitsTypeOf, &net.OpError{})
62- done <- true
63+ done <- struct{}{}
64 }()
65- <-ready
66+ chanRead(c, ready, "DelayedMethods.Delay ready")
67 client.Close()
68 select {
69 case err := <-srvDone:
70@@ -265,9 +265,28 @@
71 case <-time.After(25 * time.Millisecond):
72 }
73 start <- "xxx"
74- err := <-srvDone
75+ err := chanReadError(c, srvDone, "server done")
76 c.Check(err, IsNil)
77- <-done
78+ chanRead(c, done, "DelayedMethods.Delay done")
79+}
80+
81+func chanRead(c *C, ch <-chan struct{}, what string) {
82+ select {
83+ case <-ch:
84+ return
85+ case <-time.After(3 * time.Second):
86+ c.Fatalf("timeout on channel read %s", what)
87+ }
88+}
89+
90+func chanReadError(c *C, ch <-chan error, what string) error {
91+ select {
92+ case e := <-ch:
93+ return e
94+ case <-time.After(3 * time.Second):
95+ c.Fatalf("timeout on channel read %s", what)
96+ }
97+ panic("unreachable")
98 }
99
100 // newRPCClientServer starts an RPC server serving a connection from a
101
102=== modified file 'rpc/server.go'
103--- rpc/server.go 2013-02-11 12:30:10 +0000
104+++ rpc/server.go 2013-02-13 13:05:28 +0000
105@@ -4,7 +4,6 @@
106 "fmt"
107 "io"
108 "launchpad.net/juju-core/log"
109- "net"
110 "reflect"
111 "sync"
112 )
113@@ -61,44 +60,6 @@
114 sending sync.Mutex
115 }
116
117-// Accept accepts connections on the listener and serves requests for
118-// each incoming connection. The newRoot function is called
119-// to create the root value for the connection before spawning
120-// the goroutine to service the RPC requests; it may be nil,
121-// in which case the original root value passed to NewServer
122-// will be used. A codec is chosen for the connection by
123-// calling newCodec.
124-//
125-// Accept blocks; the caller typically invokes it in
126-// a go statement.
127-func (srv *Server) Accept(l net.Listener,
128- newRoot func(net.Conn) (interface{}, error),
129- newCodec func(io.ReadWriteCloser) ServerCodec) error {
130- for {
131- c, err := l.Accept()
132- if err != nil {
133- return err
134- }
135- rootv := srv.root
136- if newRoot != nil {
137- root, err := newRoot(c)
138- if err != nil {
139- log.Printf("rpc: connection refused: %v", err)
140- c.Close()
141- continue
142- }
143- rootv = reflect.ValueOf(root)
144- }
145- go func() {
146- defer c.Close()
147- if err := srv.serve(rootv, newCodec(c)); err != nil {
148- log.Printf("rpc: ServeCodec error: %v", err)
149- }
150- }()
151- }
152- panic("unreachable")
153-}
154-
155 // ServeCodec runs the server on a single connection. ServeCodec
156 // blocks, serving the connection until the client hangs up. The caller
157 // typically invokes ServeCodec in a go statement. The given

Subscribers

People subscribed via source and target branches