Skip to content

Commit 6f15daa

Browse files
authored
Merge pull request #472 from adam-talos/configure_fsync
Add support for QuickfixJ option FileStoreSync
2 parents ff15bcf + a02cb51 commit 6f15daa

File tree

2 files changed

+29
-11
lines changed

2 files changed

+29
-11
lines changed

config/configuration.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ const (
5050
HeartBtIntOverride string = "HeartBtIntOverride"
5151
FileLogPath string = "FileLogPath"
5252
FileStorePath string = "FileStorePath"
53+
FileStoreSync string = "FileStoreSync"
5354
SQLStoreDriver string = "SQLStoreDriver"
5455
SQLStoreDataSourceName string = "SQLStoreDataSourceName"
5556
SQLStoreConnMaxLifetime string = "SQLStoreConnMaxLifetime"

filestore.go

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ type fileStore struct {
5252
sessionFile *os.File
5353
senderSeqNumsFile *os.File
5454
targetSeqNumsFile *os.File
55+
fileSync bool
5556
}
5657

5758
// NewFileStoreFactory returns a file-based implementation of MessageStoreFactory.
@@ -77,10 +78,19 @@ func (f fileStoreFactory) Create(sessionID SessionID) (msgStore MessageStore, er
7778
if err != nil {
7879
return nil, err
7980
}
80-
return newFileStore(sessionID, dirname)
81+
var fsync bool
82+
if sessionSettings.HasSetting(config.FileStoreSync) {
83+
fsync, err = sessionSettings.BoolSetting(config.FileStoreSync)
84+
if err != nil {
85+
return nil, err
86+
}
87+
} else {
88+
fsync = true //existing behavior is to fsync writes
89+
}
90+
return newFileStore(sessionID, dirname, fsync)
8191
}
8292

83-
func newFileStore(sessionID SessionID, dirname string) (*fileStore, error) {
93+
func newFileStore(sessionID SessionID, dirname string, fileSync bool) (*fileStore, error) {
8494
if err := os.MkdirAll(dirname, os.ModePerm); err != nil {
8595
return nil, err
8696
}
@@ -96,6 +106,7 @@ func newFileStore(sessionID SessionID, dirname string) (*fileStore, error) {
96106
sessionFname: path.Join(dirname, fmt.Sprintf("%s.%s", sessionPrefix, "session")),
97107
senderSeqNumsFname: path.Join(dirname, fmt.Sprintf("%s.%s", sessionPrefix, "senderseqnums")),
98108
targetSeqNumsFname: path.Join(dirname, fmt.Sprintf("%s.%s", sessionPrefix, "targetseqnums")),
109+
fileSync: fileSync,
99110
}
100111

101112
if err := store.Refresh(); err != nil {
@@ -232,8 +243,10 @@ func (store *fileStore) setSession() error {
232243
if _, err := store.sessionFile.Write(data); err != nil {
233244
return fmt.Errorf("unable to write to file: %s: %s", store.sessionFname, err.Error())
234245
}
235-
if err := store.sessionFile.Sync(); err != nil {
236-
return fmt.Errorf("unable to flush file: %s: %s", store.sessionFname, err.Error())
246+
if store.fileSync {
247+
if err := store.sessionFile.Sync(); err != nil {
248+
return fmt.Errorf("unable to flush file: %s: %s", store.sessionFname, err.Error())
249+
}
237250
}
238251
return nil
239252
}
@@ -245,8 +258,10 @@ func (store *fileStore) setSeqNum(f *os.File, seqNum int) error {
245258
if _, err := fmt.Fprintf(f, "%019d", seqNum); err != nil {
246259
return fmt.Errorf("unable to write to file: %s: %s", f.Name(), err.Error())
247260
}
248-
if err := f.Sync(); err != nil {
249-
return fmt.Errorf("unable to flush file: %s: %s", f.Name(), err.Error())
261+
if store.fileSync {
262+
if err := f.Sync(); err != nil {
263+
return fmt.Errorf("unable to flush file: %s: %s", f.Name(), err.Error())
264+
}
250265
}
251266
return nil
252267
}
@@ -313,11 +328,13 @@ func (store *fileStore) SaveMessage(seqNum int, msg []byte) error {
313328
if _, err := store.bodyFile.Write(msg); err != nil {
314329
return fmt.Errorf("unable to write to file: %s: %s", store.bodyFname, err.Error())
315330
}
316-
if err := store.bodyFile.Sync(); err != nil {
317-
return fmt.Errorf("unable to flush file: %s: %s", store.bodyFname, err.Error())
318-
}
319-
if err := store.headerFile.Sync(); err != nil {
320-
return fmt.Errorf("unable to flush file: %s: %s", store.headerFname, err.Error())
331+
if store.fileSync {
332+
if err := store.bodyFile.Sync(); err != nil {
333+
return fmt.Errorf("unable to flush file: %s: %s", store.bodyFname, err.Error())
334+
}
335+
if err := store.headerFile.Sync(); err != nil {
336+
return fmt.Errorf("unable to flush file: %s: %s", store.headerFname, err.Error())
337+
}
321338
}
322339

323340
store.offsets[seqNum] = msgDef{offset: offset, size: len(msg)}

0 commit comments

Comments
 (0)