@@ -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