Skip to content

Commit 7baed6c

Browse files
authored
Merge pull request quickfixgo#387 from ackleymi/master
Adds LogoutTimeout and LogonTimeout as config parameters
2 parents 4f8e821 + 7fece7d commit 7baed6c

File tree

7 files changed

+111
-11
lines changed

7 files changed

+111
-11
lines changed

config/configuration.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ const (
4242
ResetOnLogout string = "ResetOnLogout"
4343
ResetOnDisconnect string = "ResetOnDisconnect"
4444
ReconnectInterval string = "ReconnectInterval"
45+
LogoutTimeout string = "LogoutTimeout"
46+
LogonTimeout string = "LogonTimeout"
4547
HeartBtInt string = "HeartBtInt"
4648
FileLogPath string = "FileLogPath"
4749
FileStorePath string = "FileStorePath"

config/doc.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,18 @@ Time between reconnection attempts in seconds. Only used for initiators. Valu
230230
231231
Defaults to 30
232232
233+
LogoutTimeout
234+
235+
Session setting for logout timeout in seconds. Only used for initiators. Value must be positive integer.
236+
237+
Defaults to 2
238+
239+
LogonTimeout
240+
241+
Session setting for logon timeout in seconds. Only used for initiators. Value must be positive integer.
242+
243+
Defaults to 10
244+
233245
HeartBtInt
234246
235247
Heartbeat interval in seconds. Only used for initiators. Value must be positive integer.

internal/session_settings.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,7 @@ type SessionSettings struct {
2222

2323
//specific to initiators
2424
ReconnectInterval time.Duration
25+
LogoutTimeout time.Duration
26+
LogonTimeout time.Duration
2527
SocketConnectAddress []string
2628
}

session.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -465,8 +465,7 @@ func (s *session) initiateLogoutInReplyTo(reason string, inReplyTo *Message) (er
465465
return
466466
}
467467
s.log.OnEvent("Inititated logout request")
468-
time.AfterFunc(time.Duration(2)*time.Second, func() { s.sessionEvent <- internal.LogoutTimeout })
469-
468+
time.AfterFunc(s.LogoutTimeout, func() { s.sessionEvent <- internal.LogoutTimeout })
470469
return
471470
}
472471

session_factory.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,36 @@ func (f sessionFactory) buildInitiatorSettings(session *session, settings *Sessi
331331
session.ReconnectInterval = time.Duration(interval) * time.Second
332332
}
333333

334+
session.LogoutTimeout = 2 * time.Second
335+
if settings.HasSetting(config.LogoutTimeout) {
336+
337+
timeout, err := settings.IntSetting(config.LogoutTimeout)
338+
if err != nil {
339+
return err
340+
}
341+
342+
if timeout <= 0 {
343+
return errors.New("LogoutTimeout must be greater than zero")
344+
}
345+
346+
session.LogoutTimeout = time.Duration(timeout) * time.Second
347+
}
348+
349+
session.LogonTimeout = 10 * time.Second
350+
if settings.HasSetting(config.LogonTimeout) {
351+
352+
timeout, err := settings.IntSetting(config.LogonTimeout)
353+
if err != nil {
354+
return err
355+
}
356+
357+
if timeout <= 0 {
358+
return errors.New("LogonTimeout must be greater than zero")
359+
}
360+
361+
session.LogonTimeout = time.Duration(timeout) * time.Second
362+
}
363+
334364
return f.configureSocketConnectAddress(session, settings)
335365
}
336366

session_factory_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,8 @@ func (s *SessionFactorySuite) TestNewSessionBuildInitiators() {
353353
s.True(session.InitiateLogon)
354354
s.Equal(34*time.Second, session.HeartBtInt)
355355
s.Equal(30*time.Second, session.ReconnectInterval)
356+
s.Equal(10*time.Second, session.LogonTimeout)
357+
s.Equal(2*time.Second, session.LogoutTimeout)
356358
s.Equal("127.0.0.1:5000", session.SocketConnectAddress[0])
357359
}
358360

@@ -399,6 +401,54 @@ func (s *SessionFactorySuite) TestNewSessionBuildInitiatorsValidReconnectInterva
399401
s.NotNil(err, "ReconnectInterval must be greater than zero")
400402
}
401403

404+
func (s *SessionFactorySuite) TestNewSessionBuildInitiatorsValidLogoutTimeout() {
405+
s.sessionFactory.BuildInitiators = true
406+
s.SessionSettings.Set(config.HeartBtInt, "34")
407+
s.SessionSettings.Set(config.SocketConnectHost, "127.0.0.1")
408+
s.SessionSettings.Set(config.SocketConnectPort, "3000")
409+
410+
s.SessionSettings.Set(config.LogoutTimeout, "45")
411+
session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App)
412+
s.Nil(err)
413+
s.Equal(45*time.Second, session.LogoutTimeout)
414+
415+
s.SessionSettings.Set(config.LogoutTimeout, "not a number")
416+
_, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App)
417+
s.NotNil(err, "LogoutTimeout must be a number")
418+
419+
s.SessionSettings.Set(config.LogoutTimeout, "0")
420+
_, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App)
421+
s.NotNil(err, "LogoutTimeout must be greater than zero")
422+
423+
s.SessionSettings.Set(config.LogoutTimeout, "-20")
424+
_, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App)
425+
s.NotNil(err, "LogoutTimeout must be greater than zero")
426+
}
427+
428+
func (s *SessionFactorySuite) TestNewSessionBuildInitiatorsValidLogonTimeout() {
429+
s.sessionFactory.BuildInitiators = true
430+
s.SessionSettings.Set(config.HeartBtInt, "34")
431+
s.SessionSettings.Set(config.SocketConnectHost, "127.0.0.1")
432+
s.SessionSettings.Set(config.SocketConnectPort, "3000")
433+
434+
s.SessionSettings.Set(config.LogonTimeout, "45")
435+
session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App)
436+
s.Nil(err)
437+
s.Equal(45*time.Second, session.LogonTimeout)
438+
439+
s.SessionSettings.Set(config.LogonTimeout, "not a number")
440+
_, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App)
441+
s.NotNil(err, "LogonTimeout must be a number")
442+
443+
s.SessionSettings.Set(config.LogonTimeout, "0")
444+
_, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App)
445+
s.NotNil(err, "LogonTimeout must be greater than zero")
446+
447+
s.SessionSettings.Set(config.LogonTimeout, "-20")
448+
_, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App)
449+
s.NotNil(err, "LogonTimeout must be greater than zero")
450+
}
451+
402452
func (s *SessionFactorySuite) TestConfigureSocketConnectAddress() {
403453
sess := new(session)
404454
err := s.configureSocketConnectAddress(sess, s.SessionSettings)

session_state.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,27 @@ func (sm *stateMachine) Connect(session *session) {
2828
return
2929
}
3030

31-
if session.InitiateLogon {
32-
if session.RefreshOnLogon {
33-
if err := session.store.Refresh(); err != nil {
34-
session.logError(err)
35-
return
36-
}
37-
}
31+
// No special logon logic needed for FIX Acceptors.
32+
if !session.InitiateLogon {
33+
sm.setState(session, logonState{})
34+
return
35+
}
3836

39-
session.log.OnEvent("Sending logon request")
40-
if err := session.sendLogon(); err != nil {
37+
if session.RefreshOnLogon {
38+
if err := session.store.Refresh(); err != nil {
4139
session.logError(err)
4240
return
4341
}
4442
}
43+
session.log.OnEvent("Sending logon request")
44+
if err := session.sendLogon(); err != nil {
45+
session.logError(err)
46+
return
47+
}
4548

4649
sm.setState(session, logonState{})
50+
// Fire logon timeout event after the pre-configured delay period.
51+
time.AfterFunc(session.LogonTimeout, func() { session.sessionEvent <- internal.LogonTimeout })
4752
}
4853

4954
func (sm *stateMachine) Stop(session *session) {

0 commit comments

Comments
 (0)