Commit 58161403 authored by Tsaiilin's avatar Tsaiilin

redial update

parent 996c02dc
...@@ -87,10 +87,12 @@ func (client *Client) check() { ...@@ -87,10 +87,12 @@ func (client *Client) check() {
continue continue
} }
log.Run().Warnf("Redial net check fail, redial...") log.Run().Warnf("Redial net check fail, redial...")
client.redial.RedialByCheck(cfg)
if client.session != nil { if client.session != nil {
client.session.Close() client.Redial(client.session, "check")
} else {
client.redial.RedialByCheck(cfg)
} }
} }
}) })
} }
...@@ -15,6 +15,7 @@ import ( ...@@ -15,6 +15,7 @@ import (
"virjar.com/majora-go/global" "virjar.com/majora-go/global"
"virjar.com/majora-go/log" "virjar.com/majora-go/log"
"virjar.com/majora-go/protocol" "virjar.com/majora-go/protocol"
"virjar.com/majora-go/safe"
"virjar.com/majora-go/trace" "virjar.com/majora-go/trace"
) )
...@@ -69,17 +70,17 @@ func (client *Client) handleConnect(packet *protocol.MajoraPacket, session getty ...@@ -69,17 +70,17 @@ func (client *Client) handleConnect(packet *protocol.MajoraPacket, session getty
ip, err := client.dnsCache.Get([]byte(hostPort[0])) ip, err := client.dnsCache.Get([]byte(hostPort[0]))
if err != nil { if err != nil {
traceSession.Recorder.RecordEvent(trace.DnsResolveEvent, fmt.Sprintf("Dns cache miss %s ", hostPort[0])) traceSession.Recorder.RecordEvent(trace.DnsResolveEvent, fmt.Sprintf("Dns cache miss %s ", hostPort[0]))
host, dnsErr := net.LookupHost(hostPort[0]) hosts, dnsErr := net.LookupHost(hostPort[0])
if dnsErr != nil { if dnsErr != nil {
traceSession.Recorder.RecordErrorEvent(trace.DnsResolveEvent, fmt.Sprintf("Resolve %s ip error", hostPort[0]), dnsErr) traceSession.Recorder.RecordErrorEvent(trace.DnsResolveEvent, fmt.Sprintf("Resolve %s ip error", hostPort[0]), dnsErr)
client.closeVirtualConnection(session, packet.SerialNumber) client.closeVirtualConnection(session, packet.SerialNumber)
return return
} }
err := client.dnsCache.Set([]byte(hostPort[0]), []byte(host[0]), int(global.Config.DnsCacheDuration.Seconds())) err := client.dnsCache.Set([]byte(hostPort[0]), []byte(hosts[0]), int(global.Config.DnsCacheDuration.Seconds()))
if err != nil { if err != nil {
traceSession.Recorder.RecordErrorEvent(trace.DnsResolveEvent, fmt.Sprintf("Dns cache set error %s", hostPort[0]), err) traceSession.Recorder.RecordErrorEvent(trace.DnsResolveEvent, fmt.Sprintf("Dns cache set error %s", hostPort[0]), err)
} }
target = host[0] target = hosts[0]
} else { } else {
target = string(ip) target = string(ip)
} }
...@@ -119,9 +120,11 @@ func (client *Client) handleConnect(packet *protocol.MajoraPacket, session getty ...@@ -119,9 +120,11 @@ func (client *Client) handleConnect(packet *protocol.MajoraPacket, session getty
client.closeVirtualConnection(session, packet.SerialNumber) client.closeVirtualConnection(session, packet.SerialNumber)
return return
} else { } else {
safe.SageGo(func() {
client.handleUpStream(tcpConn, packet, session)
})
log.Run().Debugf("[handleConnect] %d->connect success to %s ", packet.SerialNumber, packet.Extra) log.Run().Debugf("[handleConnect] %d->connect success to %s ", packet.SerialNumber, packet.Extra)
traceSession.Recorder.RecordEvent(trace.ConnectEvent, fmt.Sprintf("Replay natServer connect ready success (sn:%d)", packet.SerialNumber)) traceSession.Recorder.RecordEvent(trace.ConnectEvent, fmt.Sprintf("Replay natServer connect ready success (sn:%d)", packet.SerialNumber))
client.handleUpStream(tcpConn, packet, session)
} }
} }
...@@ -301,8 +304,8 @@ func (client *Client) OnClose(natSession getty.Session, upStreamSession net.Conn ...@@ -301,8 +304,8 @@ func (client *Client) OnClose(natSession getty.Session, upStreamSession net.Conn
log.Error().Errorf("OnClose %+v", err) log.Error().Errorf("OnClose %+v", err)
} }
}() }()
_ = upStreamSession.Close()
client.closeVirtualConnection(natSession, serialNumber) client.closeVirtualConnection(natSession, serialNumber)
_ = upStreamSession.Close()
} }
//closeVirtualConnection disconnect to server //closeVirtualConnection disconnect to server
...@@ -327,9 +330,9 @@ func (client *Client) closeVirtualConnection(session getty.Session, serialNumber ...@@ -327,9 +330,9 @@ func (client *Client) closeVirtualConnection(session getty.Session, serialNumber
session.IsClosed(), allCnt, sendCnt, serialNumber), err) session.IsClosed(), allCnt, sendCnt, serialNumber), err)
session.Close() session.Close()
} }
traceRecorder.RecordEvent(trace.DisconnectEvent, fmt.Sprintf("Send disconnect to natServer success (sn:%d)", serialNumber))
client.connStore.Delete(serialNumber) client.connStore.Delete(serialNumber)
client.sessionStore.Delete(serialNumber) client.sessionStore.Delete(serialNumber)
traceRecorder.RecordEvent(trace.DisconnectEvent, fmt.Sprintf("Send disconnect to natServer success (sn:%d)", serialNumber))
} }
func (client *Client) CloseAll(session getty.Session) { func (client *Client) CloseAll(session getty.Session) {
......
...@@ -42,7 +42,7 @@ func (m *MajoraEventListener) OnError(session getty.Session, err error) { ...@@ -42,7 +42,7 @@ func (m *MajoraEventListener) OnError(session getty.Session, err error) {
func (m *MajoraEventListener) OnCron(session getty.Session) { func (m *MajoraEventListener) OnCron(session getty.Session) {
log.Run().Infof("[OnCorn] Redial, session closed:%v", session.IsClosed()) log.Run().Infof("[OnCorn] Redial, session closed:%v", session.IsClosed())
m.client.Redial(session) m.client.Redial(session, "corn")
} }
func (m *MajoraEventListener) OnMessage(session getty.Session, input interface{}) { func (m *MajoraEventListener) OnMessage(session getty.Session, input interface{}) {
......
...@@ -85,18 +85,18 @@ func InitialSession(session getty.Session, client *Client) (err error) { ...@@ -85,18 +85,18 @@ func InitialSession(session getty.Session, client *Client) (err error) {
return nil return nil
} }
func (client *Client) Redial(session getty.Session) { func (client *Client) Redial(session getty.Session, tag string) {
log.Run().Infof("[Redial] start can redial ? %v", client.config.Redial.Valid()) log.Run().Infof("[Redial %s] start, can redial? %v", tag, client.config.Redial.Valid())
if !client.config.Redial.Valid() { if !client.config.Redial.Valid() {
return return
} }
log.Run().Info("[Redial] send offline message ...") log.Run().Infof("[Redial %s] Send offline message", tag)
if _, _, err := session.WritePkg(OfflinePacket, 0); err != nil { if _, _, err := session.WritePkg(OfflinePacket, 0); err != nil {
log.Run().Errorf("[Redial] write offline to server error %s", err.Error()) log.Run().Errorf("[Redial %s] write offline to server error %s", tag, err.Error())
} }
time.Sleep(client.config.Redial.WaitTime) time.Sleep(client.config.Redial.WaitTime)
log.Run().Info("[Redial] start close local session") log.Run().Info("[Redial %s] start close local session", tag)
client.CloseAll(session) client.CloseAll(session)
client.redial.Redial(client.config) client.redial.Redial(client.config, tag)
session.Close() session.Close()
} }
...@@ -31,7 +31,6 @@ const ( ...@@ -31,7 +31,6 @@ const (
) )
func init() { func init() {
rand.Seed(time.Now().UnixNano())
httpCli = &http.Client{ httpCli = &http.Client{
Transport: &http.Transport{ Transport: &http.Transport{
TLSHandshakeTimeout: defTimeout, TLSHandshakeTimeout: defTimeout,
......
...@@ -26,33 +26,33 @@ func NewPPPRedial() *PPPRedial { ...@@ -26,33 +26,33 @@ func NewPPPRedial() *PPPRedial {
} }
} }
func (p *PPPRedial) Redial(cfg *model.Configure) { func (p *PPPRedial) Redial(cfg *model.Configure, tag string) {
if p.inRedialing.CAS(false, true) { if p.inRedialing.CAS(false, true) {
log.Run().Infof("[Redial] start") log.Run().Infof("[PPPRedial %s] start", tag)
beforeIp := GetPPP() beforeIp := GetPPP()
retry := 0 retry := 0
defer func(start time.Time) { defer func(start time.Time) {
newIp := GetPPP() newIp := GetPPP()
log.Run().Infof("[Redial] retry %d, cost %v, ip change %s -> %s ", log.Run().Infof("[PPPRedial %s] retry %d, cost %v, ip change %s -> %s ",
retry, time.Since(start), beforeIp, newIp) tag, retry, time.Since(start), beforeIp, newIp)
}(time.Now()) }(time.Now())
for { for {
retry++ retry++
status := command(cfg) status := command(cfg)
pingBaidu := RandomPing() pingBaidu := RandomPing()
log.Run().Infof("[Redial] net check: %d->%v", retry, pingBaidu) log.Run().Infof("[PPPRedial %s] net check: %d->%v", tag, retry, pingBaidu)
if pingBaidu && status { if pingBaidu && status {
break break
} }
} }
p.inRedialing.CAS(true, false) p.inRedialing.CAS(true, false)
} else { } else {
log.Run().Infof("[Redial] inRedialing ignore this") log.Run().Infof("[PPPRedial %s] inRedialing ignore this", tag)
} }
} }
func (p *PPPRedial) RedialByCheck(cfg *model.Configure) { func (p *PPPRedial) RedialByCheck(cfg *model.Configure) {
p.Redial(cfg) p.Redial(cfg, "check")
} }
func command(cfg *model.Configure) bool { func command(cfg *model.Configure) bool {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment