Skip to content

Commit 1e2d61f

Browse files
committed
Let the reader and writer shutdown cleanly before closing the server connection
1 parent b201032 commit 1e2d61f

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

server.go

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type IprotoServer struct {
3232
firstError error
3333
perf PerfCount
3434
schemaID uint64
35+
wg sync.WaitGroup
3536
}
3637

3738
type IprotoServerOptions struct {
@@ -131,7 +132,10 @@ func (s *IprotoServer) Shutdown() error {
131132
if s.onShutdown != nil {
132133
s.onShutdown(err)
133134
}
134-
s.conn.Close()
135+
go func() {
136+
s.wg.Wait()
137+
s.conn.Close()
138+
}()
135139
})
136140

137141
return err
@@ -166,15 +170,25 @@ func (s *IprotoServer) greet() (err error) {
166170
}
167171

168172
func (s *IprotoServer) loop() {
169-
go s.read()
170-
go s.write()
173+
s.wg.Add(2)
174+
175+
go func() {
176+
defer s.wg.Done()
177+
s.read()
178+
}()
179+
180+
go func() {
181+
defer s.wg.Done()
182+
s.write()
183+
}()
171184
}
172185

173186
func (s *IprotoServer) read() {
174187
var err error
175188
var pp *BinaryPacket
176189

177190
r := s.reader
191+
var wg sync.WaitGroup
178192

179193
READER_LOOP:
180194
for {
@@ -193,8 +207,10 @@ READER_LOOP:
193207
s.perf.NetPacketsIn.Add(1)
194208
}
195209

210+
wg.Add(1)
196211
go func(pp *BinaryPacket) {
197212
packet := &pp.packet
213+
defer wg.Done()
198214

199215
err := packet.UnmarshalBinary(pp.body)
200216

@@ -244,6 +260,7 @@ READER_LOOP:
244260
if err != nil {
245261
s.setError(err)
246262
}
263+
wg.Wait()
247264
s.Shutdown()
248265

249266
CLEANUP_LOOP:

0 commit comments

Comments
 (0)