Skip to content

Commit 3a53036

Browse files
committed
Adding config option for ResetSeqTime
1 parent def5474 commit 3a53036

File tree

7 files changed

+69
-1
lines changed

7 files changed

+69
-1
lines changed

.devcontainer/Dockerfile.dev

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
FROM mcr.microsoft.com/devcontainers/go:1.21
1+
FROM mcr.microsoft.com/devcontainers/go:1.23

config/configuration.go

+11
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,17 @@ const (
317317
// - Y
318318
// - N
319319
ResetOnDisconnect string = "ResetOnDisconnect"
320+
321+
// ResetSeqTime determines a time which a logon with a seqnum reset will be sent while keeping the session connected.
322+
//
323+
// Required: No
324+
//
325+
// Default: N/A
326+
//
327+
// Valid Values:
328+
// - 00:00:00
329+
// - A time in the format of HH:MM:SS, time is represented in time zone configured by TimeZone
330+
ResetSeqTime string = "ResetSeqTime"
320331
)
321332

322333
const (

internal/session_settings.go

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ type SessionSettings struct {
1818
SkipCheckLatency bool
1919
MaxLatency time.Duration
2020
DisableMessagePersist bool
21+
ResetSeqTime TimeOfDay
22+
EnableResetSeqTime bool
2123

2224
// Required on logon for FIX.T.1 messages.
2325
DefaultApplVerID string

session.go

+1
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,7 @@ func (s *session) run() {
919919

920920
case now := <-ticker.C:
921921
s.CheckSessionTime(s, now)
922+
s.CheckResetTime(s, now)
922923
}
923924
}
924925
}

session_factory.go

+20
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,26 @@ func (f sessionFactory) newSession(
344344
}
345345
}
346346

347+
if settings.HasSetting(config.ResetSeqTime) {
348+
var seqTimeStr string
349+
if seqTimeStr, err = settings.Setting(config.ResetSeqTime); err != nil {
350+
return
351+
}
352+
353+
var seqTime internal.TimeOfDay
354+
if seqTime, err = internal.ParseTimeOfDay(seqTimeStr); err != nil {
355+
err = errors.Wrapf(
356+
err, "problem parsing time of day '%v' for setting '%v",
357+
settings.settings[config.StartTime], config.StartTime,
358+
)
359+
return
360+
}
361+
s.EnableResetSeqTime = true
362+
s.ResetSeqTime = seqTime
363+
} else {
364+
s.EnableResetSeqTime = false
365+
}
366+
347367
if settings.HasSetting(config.TimeStampPrecision) {
348368
var precisionStr string
349369
if precisionStr, err = settings.Setting(config.TimeStampPrecision); err != nil {

session_state.go

+9
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,15 @@ func (sm *stateMachine) CheckSessionTime(session *session, now time.Time) {
155155
}
156156
}
157157

158+
func (sm *stateMachine) CheckResetTime(session *session, now time.Time) {
159+
if session.EnableResetSeqTime {
160+
ts := internal.NewTimeOfDay(now.Clock())
161+
if session.ResetSeqTime == ts {
162+
session.sendLogonInReplyTo(true, nil)
163+
}
164+
}
165+
}
166+
158167
func (sm *stateMachine) setState(session *session, nextState sessionState) {
159168
if !nextState.IsConnected() {
160169
if sm.IsConnected() {

session_test.go

+25
Original file line numberDiff line numberDiff line change
@@ -1001,3 +1001,28 @@ func (suite *SessionSendTestSuite) TestDropAndSendDropsQueueWithReset() {
10011001
suite.LastToAdminMessageSent()
10021002
suite.NoMessageSent()
10031003
}
1004+
1005+
func (s *SessionSuite) TestSeqNumResetTime() {
1006+
s.MockApp.On("ToAdmin")
1007+
s.SetupTest()
1008+
1009+
now := time.Now().UTC()
1010+
s.session.ResetSeqTime = internal.NewTimeOfDay(now.Clock())
1011+
s.session.EnableResetSeqTime = true
1012+
1013+
s.IncrNextSenderMsgSeqNum()
1014+
s.IncrNextTargetMsgSeqNum()
1015+
1016+
s.MockApp.On("ToAdmin")
1017+
1018+
s.IncrNextSenderMsgSeqNum()
1019+
s.IncrNextTargetMsgSeqNum()
1020+
1021+
s.MockApp.On("ToAdmin")
1022+
1023+
s.session.CheckResetTime(s.session, now)
1024+
1025+
s.NextSenderMsgSeqNum(2)
1026+
s.NextSenderMsgSeqNum(2)
1027+
1028+
}

0 commit comments

Comments
 (0)