Merge lp:~pedronis/ubuntu-push/use-sentinel-not-close into lp:ubuntu-push/automatic

Proposed by Samuele Pedroni
Status: Merged
Approved by: Samuele Pedroni
Approved revision: 128
Merged at revision: 130
Proposed branch: lp:~pedronis/ubuntu-push/use-sentinel-not-close
Merge into: lp:ubuntu-push/automatic
Diff against target: 69 lines (+13/-10)
4 files modified
server/broker/simple/simple.go (+1/-1)
server/broker/testsuite/suite.go (+9/-6)
server/session/session.go (+2/-2)
server/session/session_test.go (+1/-1)
To merge this branch: bzr merge lp:~pedronis/ubuntu-push/use-sentinel-not-close
Reviewer Review Type Date Requested Status
John Lenton (community) Approve
Review via email: mp+216186@code.launchpad.net

Commit message

use a sentinel of nil instead of close on the session channel to terminate the session, because we use exchanges from two goroutines, so in corner we can race with feedPending and get send on closed channel

Description of the change

use a sentinel of nil instead of close on the session channel to terminate the session, because we use exchanges from two goroutine, so in corner we can race with feedPending and get send on closed channel

To post a comment you must log in.
128. By Samuele Pedroni

merge automatic

Revision history for this message
John Lenton (chipaca) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'server/broker/simple/simple.go'
--- server/broker/simple/simple.go 2014-04-11 08:47:18 +0000
+++ server/broker/simple/simple.go 2014-04-16 18:31:22 +0000
@@ -224,7 +224,7 @@
224 } else { // register224 } else { // register
225 prev := b.registry[sess.deviceId]225 prev := b.registry[sess.deviceId]
226 if prev != nil { // kick it226 if prev != nil { // kick it
227 close(prev.exchanges)227 prev.exchanges <- nil
228 }228 }
229 b.registry[sess.deviceId] = sess229 b.registry[sess.deviceId] = sess
230 sess.registered = true230 sess.registered = true
231231
=== modified file 'server/broker/testsuite/suite.go'
--- server/broker/testsuite/suite.go 2014-04-11 08:47:18 +0000
+++ server/broker/testsuite/suite.go 2014-04-16 18:31:22 +0000
@@ -164,14 +164,17 @@
164 c.Assert(err, IsNil)164 c.Assert(err, IsNil)
165 sess2, err := b.Register(&protocol.ConnectMsg{Type: "connect", DeviceId: "dev-1"})165 sess2, err := b.Register(&protocol.ConnectMsg{Type: "connect", DeviceId: "dev-1"})
166 c.Assert(err, IsNil)166 c.Assert(err, IsNil)
167 checkAndFalse := false167 // previous session got signaled by sending nil on its channel
168 // previous session got signaled by closing its channel168 var sentinel broker.Exchange
169 got := false
169 select {170 select {
170 case _, ok := <-sess1.SessionChannel():171 case sentinel = <-sess1.SessionChannel():
171 checkAndFalse = ok == false172 got = true
172 default:173 case <-time.After(5 * time.Second):
174 c.Fatal("taking too long to get sentinel")
173 }175 }
174 c.Check(checkAndFalse, Equals, true)176 c.Check(got, Equals, true)
177 c.Check(sentinel, IsNil)
175 c.Assert(s.RevealSession(b, "dev-1"), Equals, sess2)178 c.Assert(s.RevealSession(b, "dev-1"), Equals, sess2)
176 b.Unregister(sess1)179 b.Unregister(sess1)
177 // just to make sure the unregister was processed180 // just to make sure the unregister was processed
178181
=== modified file 'server/session/session.go'
--- server/session/session.go 2014-04-16 12:22:56 +0000
+++ server/session/session.go 2014-04-16 18:31:22 +0000
@@ -104,9 +104,9 @@
104 return &broker.ErrAbort{"expected PONG message"}104 return &broker.ErrAbort{"expected PONG message"}
105 }105 }
106 pingTimerReset()106 pingTimerReset()
107 case exchg, ok := <-ch:107 case exchg := <-ch:
108 pingTimer.Stop()108 pingTimer.Stop()
109 if !ok {109 if exchg == nil {
110 return &broker.ErrAbort{"terminated"}110 return &broker.ErrAbort{"terminated"}
111 }111 }
112 outMsg, inMsg, err := exchg.Prepare(sess)112 outMsg, inMsg, err := exchg.Prepare(sess)
113113
=== modified file 'server/session/session_test.go'
--- server/session/session_test.go 2014-04-16 12:22:56 +0000
+++ server/session/session_test.go 2014-04-16 18:31:22 +0000
@@ -360,7 +360,7 @@
360 go func() {360 go func() {
361 errCh <- sessionLoop(tp, sess, cfg5msPingInterval2msExchangeTout, nopTrack)361 errCh <- sessionLoop(tp, sess, cfg5msPingInterval2msExchangeTout, nopTrack)
362 }()362 }()
363 close(exchanges)363 exchanges <- nil
364 err := <-errCh364 err := <-errCh
365 c.Check(err, DeepEquals, &broker.ErrAbort{"terminated"})365 c.Check(err, DeepEquals, &broker.ErrAbort{"terminated"})
366}366}

Subscribers

People subscribed via source and target branches