diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b6e5bb200..b62e02067 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -21,7 +21,7 @@ jobs: - name: golangci-lint uses: golangci/golangci-lint-action@v2 with: - version: v1.41 + version: v1.46.0 args: --timeout=10m --skip-dirs=fix42,fix44 --exclude="Error return value of .(store.cache.*|suite.msgStore.*). is not checke" build: diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 000000000..5f26c2061 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,22 @@ +service: + golangci-lint-version: 1.46.0 +run: + deadline: 30m + skip-dirs: + - cover + - fix42 + - fix44 + modules-download-mode: readonly + +issues: + exclude-use-default: false + exclude-rules: + - linters: + - errcheck + text: " is not checke" + +linters: + enable: + - exportloopref + disable: + - structcheck diff --git a/Makefile b/Makefile index b46e10ac4..fe398045e 100644 --- a/Makefile +++ b/Makefile @@ -27,8 +27,7 @@ vet: go vet ./_test lint: - go get golang.org/x/lint/golint - golint . + golangci-lint run test: go test -v -cover -p=1 -count=1 . ./datadictionary ./internal diff --git a/in_session.go b/in_session.go index 6abe1934a..edbcd9a4a 100644 --- a/in_session.go +++ b/in_session.go @@ -66,6 +66,8 @@ func (state inSession) Timeout(session *session, event internal.Event) (nextStat session.log.OnEvent("Sent test request TEST") session.peerTimer.Reset(time.Duration(float64(1.2) * float64(session.HeartBtInt))) return pendingTimeout{state} + default: + session.log.OnEventf("receive event: %s, %v", state.String(), event) } return state diff --git a/internal/event_timer.go b/internal/event_timer.go index 0b7630cbc..3d6a98bc6 100644 --- a/internal/event_timer.go +++ b/internal/event_timer.go @@ -10,6 +10,7 @@ type EventTimer struct { timer *time.Timer done chan struct{} wg sync.WaitGroup + rst chan time.Duration } func NewEventTimer(task func()) *EventTimer { @@ -17,6 +18,7 @@ func NewEventTimer(task func()) *EventTimer { f: task, timer: newStoppedTimer(), done: make(chan struct{}), + rst: make(chan time.Duration), } t.wg.Add(1) @@ -33,6 +35,14 @@ func NewEventTimer(task func()) *EventTimer { t.timer.Stop() return + case rstTime := <-t.rst: + if !t.timer.Stop() { + select { // cleanup + case <-t.timer.C: + default: + } + } + t.timer.Reset(rstTime) } } }() @@ -54,7 +64,12 @@ func (t *EventTimer) Reset(timeout time.Duration) { return } - t.timer.Reset(timeout) + go func() { + select { + case <-t.done: + case t.rst <- timeout: + } + }() } func newStoppedTimer() *time.Timer { diff --git a/latent_state.go b/latent_state.go index bb160e262..e63fbb8b6 100644 --- a/latent_state.go +++ b/latent_state.go @@ -13,7 +13,8 @@ func (state latentState) FixMsgIn(session *session, msg *Message) (nextState ses return state } -func (state latentState) Timeout(*session, internal.Event) (nextState sessionState) { +func (state latentState) Timeout(session *session, event internal.Event) (nextState sessionState) { + session.log.OnEventf("receive event: %s, %v", state.String(), event) return state } diff --git a/not_session_time.go b/not_session_time.go index bebb606a6..2b643e77d 100644 --- a/not_session_time.go +++ b/not_session_time.go @@ -12,7 +12,8 @@ func (state notSessionTime) FixMsgIn(session *session, msg *Message) (nextState return state } -func (state notSessionTime) Timeout(*session, internal.Event) (nextState sessionState) { +func (state notSessionTime) Timeout(session *session, event internal.Event) (nextState sessionState) { + session.log.OnEventf("receive event: %s, %v", state.String(), event) return state } diff --git a/pending_timeout.go b/pending_timeout.go index e94372dd0..cde2d7ff0 100644 --- a/pending_timeout.go +++ b/pending_timeout.go @@ -11,6 +11,8 @@ func (s pendingTimeout) Timeout(session *session, event internal.Event) (nextSta case internal.PeerTimeout: session.log.OnEvent("Session Timeout") return latentState{} + default: + session.log.OnEventf("receive event: %s, %v", s.String(), event) } return s diff --git a/session.go b/session.go index 6749348d7..d319ad0a5 100644 --- a/session.go +++ b/session.go @@ -53,6 +53,11 @@ type session struct { hasStopByDisconnect bool } +func (s *session) SetLog(log Log) { + s.log = log + s.stateMachine.log = &s.log +} + func (s *session) logError(err error) { s.log.OnEvent(err.Error()) } diff --git a/session_factory.go b/session_factory.go index ddc53b106..7b2bcb400 100644 --- a/session_factory.go +++ b/session_factory.go @@ -256,10 +256,11 @@ func (f sessionFactory) newSession( } else if err = f.buildAcceptorSettings(s, settings); err != nil { return } - - if s.log, err = logFactory.CreateSessionLog(s.sessionID); err != nil { + log, err := logFactory.CreateSessionLog(s.sessionID) + if err != nil { return } + s.SetLog(log) if s.store, err = storeFactory.Create(s.sessionID); err != nil { return diff --git a/session_state.go b/session_state.go index cf0836cf9..e1e50421e 100644 --- a/session_state.go +++ b/session_state.go @@ -11,6 +11,7 @@ type stateMachine struct { State sessionState pendingStop, stopped bool notifyOnInSessionTime chan interface{} + log *Log } func (sm *stateMachine) Start(s *session) { @@ -152,6 +153,9 @@ func (sm *stateMachine) setState(session *session, nextState sessionState) { } } + if sm.State.String() != nextState.String() && sm.log != nil { + (*sm.log).OnEventf("change state: %s -> %s", sm.State.String(), nextState.String()) + } sm.State = nextState }