Skip to content

Commit 49f4696

Browse files
committed
exit when encounter error
1 parent 4b1c08a commit 49f4696

File tree

5 files changed

+55
-26
lines changed

5 files changed

+55
-26
lines changed

conn.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,8 @@ func (ch *ConnHandler) CreateFastOpenConn() {
469469
}
470470

471471
func (ch *ConnHandler) readFromTunnel() {
472+
defer Recover()
473+
472474
drop := func(c chan *GotaFrame) {
473475
for gf := range c {
474476
log.Warnf("CH: Connection %d closed, Gota Frame dropped", gf.ConnID)
@@ -492,8 +494,6 @@ func (ch *ConnHandler) readFromTunnel() {
492494
}
493495
}()
494496

495-
defer Recover()
496-
497497
var seq uint32
498498
seq = 0
499499
cache := make(map[uint32][]byte)
@@ -560,6 +560,8 @@ func (ch *ConnHandler) readFromTunnel() {
560560
}
561561

562562
func (ch *ConnHandler) writeToTunnel() {
563+
defer Recover()
564+
563565
defer func() {
564566
ch.mutex.Lock()
565567
defer ch.mutex.Unlock()
@@ -575,7 +577,6 @@ func (ch *ConnHandler) writeToTunnel() {
575577
}
576578
}()
577579

578-
defer Recover()
579580
// read io.EOF and send CloseWrite signal
580581
var seq uint32
581582
seq = 0

examples/config.client.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@ fastopen: true
1717
# Gota server addresses with port
1818
tunnel:
1919
- remote: 127.0.0.1:12333 # connect server directly
20-
#- remote: 127.0.0.1:12336
20+
- remote: 127.0.0.1:12336
2121
# proxy: http://gota:gota@127.0.0.1:3128 # connect server using proxy, currently Gota support http/https/socks5 proxy

gota/cmd/server.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
_ "net/http/pprof"
2727
"os"
2828
"os/signal"
29+
"sync"
2930
"syscall"
3031
)
3132

@@ -84,22 +85,26 @@ var serverCmd = &cobra.Command{
8485
}
8586

8687
sigs := make(chan os.Signal, 1)
87-
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
88+
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
8889

90+
wg := sync.WaitGroup{}
8991
go func() {
9092
sig := <-sigs
9193
log.Infof("Received signal: %s, exit gota server", sig)
92-
cmClosed := make(chan struct{})
94+
wg.Add(2)
9395
go func() {
9496
client.ConnManager.Stop()
95-
close(cmClosed)
97+
wg.Done()
98+
}()
99+
go func() {
100+
client.TunnelManager.Stop()
101+
wg.Done()
96102
}()
97-
client.TunnelManager.Stop()
98-
<-cmClosed
99-
os.Exit(0)
100103
}()
101104

102105
client.Serve(viper.GetString("remote"))
106+
wg.Wait()
107+
103108
} else {
104109
log.Error("Gota: Can not parse tunnel config")
105110
}

misc.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"errors"
77
log "github.com/Sirupsen/logrus"
88
"io"
9+
"os"
910
"strings"
1011
"time"
1112
)
@@ -142,3 +143,8 @@ func SetLogLevel(l string) {
142143
log.SetLevel(log.DebugLevel)
143144
}
144145
}
146+
147+
func ShutdownGota() {
148+
process, _ := os.FindProcess(os.Getpid())
149+
process.Signal(os.Interrupt)
150+
}

tunnel.go

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ func (tm *TunnelManager) listenAndServe(config TunnelPassiveConfig) {
267267
tm.poolLock.Unlock()
268268

269269
tm.poolLock.RLock()
270-
t := NewTunnelTransport(tm.writePool[client], tm.readPool[client], conn, client)
270+
t := NewTunnelTransport(tm.writePool[client], tm.readPool[client], conn, PassiveMode, client)
271271
tm.poolLock.RUnlock()
272272

273273
t.SetCCIDChannel(tm.newCCIDChannel)
@@ -367,7 +367,7 @@ func (tm *TunnelManager) connectAndServe(config TunnelActiveConfig, client Clien
367367
tm.poolLock.Unlock()
368368

369369
tm.poolLock.RLock()
370-
t := NewTunnelTransport(tm.writePool[client], tm.readPool[client], conn, client)
370+
t := NewTunnelTransport(tm.writePool[client], tm.readPool[client], conn, ActiveMode, client)
371371
tm.poolLock.RUnlock()
372372

373373
tm.ttPool = append(tm.ttPool, t)
@@ -427,6 +427,7 @@ type TunnelTransport struct {
427427
clientID ClientID
428428

429429
quit chan struct{}
430+
mode int
430431

431432
mutex sync.Locker
432433
writeStopped bool
@@ -445,7 +446,7 @@ type TunnelTransport struct {
445446
rw io.ReadWriteCloser
446447
}
447448

448-
func NewTunnelTransport(wp, rp chan<- chan *GotaFrame, rw io.ReadWriteCloser, clientID ...ClientID) *TunnelTransport {
449+
func NewTunnelTransport(wp, rp chan<- chan *GotaFrame, rw io.ReadWriteCloser, mode int, clientID ...ClientID) *TunnelTransport {
449450
var c ClientID
450451
if clientID != nil {
451452
c = clientID[0]
@@ -462,6 +463,7 @@ func NewTunnelTransport(wp, rp chan<- chan *GotaFrame, rw io.ReadWriteCloser, cl
462463
mutex: &sync.Mutex{},
463464

464465
clientID: c,
466+
mode: mode,
465467

466468
newCCIDChannel: nil,
467469

@@ -497,7 +499,14 @@ func (t *TunnelTransport) readFromPeerTunnel() {
497499
for {
498500
gf, err := ReadGotaFrame(t.rw)
499501
if err != nil {
500-
log.Errorf("TT: Received gota frame error, stop this worker, error: %s", err)
502+
log.Errorf("TT: Error: %s", err)
503+
select {
504+
case <-t.quit:
505+
return
506+
default:
507+
log.Errorf("TT: Received gota frame error, stop this worker, error: %s", err)
508+
t.Stop()
509+
}
501510
return
502511
}
503512
gf.clientID = t.clientID
@@ -509,7 +518,7 @@ func (t *TunnelTransport) readFromPeerTunnel() {
509518
case TMHeartBeatPingSeq:
510519
go t.sendHeartBeatResponse()
511520
case TMHeartBeatPongSeq:
512-
log.Info("TT: Received Hearbeat Pong")
521+
log.Info("TT: Received Heartbeat Pong")
513522

514523
case TMCreateConnSeq:
515524
log.Debug("TT: Received Create Connection Signal")
@@ -602,14 +611,14 @@ Loop:
602611
log.Errorf("TT: Send heartbeat failed, stop this worker, error: \"%s\"", err)
603612
break Loop
604613
}
605-
log.Info("TT: Sent Hearbeat Ping")
614+
log.Info("TT: Sent Heartbeat Ping")
606615
case <-tick.C:
607616
err := t.sendHeartBeatRequest()
608617
if err != nil {
609618
log.Errorf("TT: Send heartbeat failed, stop this worker, error: \"%s\"", err)
610619
break Loop
611620
}
612-
log.Info("TT: Sent Hearbeat Ping")
621+
log.Info("TT: Sent Heartbeat Ping")
613622
case <-t.quit:
614623
// TODO if the read channel already registered to the read pool
615624

@@ -632,15 +641,16 @@ func (t *TunnelTransport) sendHeartBeatRequest() error {
632641

633642
func (t *TunnelTransport) sendHeartBeatResponse() {
634643
t.readChannel <- TMHeartBeatPongGotaFrame
635-
log.Info("TT: Sent Hearbeat Pong")
644+
log.Info("TT: Sent Heartbeat Pong")
636645
}
637646

638647
func (t *TunnelTransport) sendCloseTunnelRequest() error {
648+
log.Info("TT: Sent Close Tunnel request")
639649
err := WriteNBytes(t.rw, HeaderLength, TMCloseTunnelBytes)
640650
if err != nil {
641-
return err
651+
log.Errorf("TT: Sent Close Tunnel request error: %s", err)
642652
}
643-
return nil
653+
return err
644654
}
645655

646656
func (t *TunnelTransport) sendCloseTunnelResponse() {
@@ -651,6 +661,7 @@ func (t *TunnelTransport) sendCloseTunnelResponse() {
651661
log.Info("TT: Sent Close Tunnel response")
652662
t.readStopped = true
653663
close(t.quit)
664+
t.Stop()
654665
}
655666

656667
// Start method starts the run loop for the worker, listening for a quit channel in
@@ -665,23 +676,29 @@ func (t *TunnelTransport) Stop() {
665676
t.mutex.Lock()
666677
defer t.mutex.Unlock()
667678

679+
defer func() {
680+
if t.mode == ActiveMode {
681+
ShutdownGota()
682+
}
683+
}()
684+
668685
if t.readStopped && t.writeStopped {
669686
return
670687
}
688+
671689
// close a channel will trigger all reading from the channel to return immediately
672690
close(t.quit)
673691
timeout := 0
674692
for {
693+
if t.readStopped && t.writeStopped {
694+
return
695+
}
675696
if timeout < TMHeartBeatSecond {
676697
time.Sleep(time.Second)
677698
timeout++
678699
} else {
679-
if t.readStopped && t.writeStopped {
680-
return
681-
} else {
682-
t.rw.Close()
683-
return
684-
}
700+
t.rw.Close()
701+
return
685702
}
686703
}
687704
}

0 commit comments

Comments
 (0)