@@ -329,14 +329,8 @@ func (store *fileStore) SaveMessage(seqNum int, msg []byte) error {
329
329
return fmt .Errorf ("unable to write to file: %s: %s" , store .bodyFname , err .Error ())
330
330
}
331
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
- }
332
+ return store .syncBodyAndHeaderFilesLocked ()
338
333
}
339
-
340
334
return nil
341
335
}
342
336
@@ -348,24 +342,44 @@ func (store *fileStore) SaveMessageAndIncrNextSenderMsgSeqNum(seqNum int, msg []
348
342
return store .IncrNextSenderMsgSeqNum ()
349
343
}
350
344
351
- func (store * fileStore ) IterateMessages (beginSeqNum , endSeqNum int , cb func ([]byte ) error ) error {
352
- store .fileMu .Lock ()
353
- defer store .fileMu .Unlock ()
354
-
355
- // Sync files and seek to start of header file
345
+ func (store * fileStore ) syncBodyAndHeaderFilesLocked () error {
356
346
if err := store .bodyFile .Sync (); err != nil {
357
347
return fmt .Errorf ("unable to flush file: %s: %s" , store .bodyFname , err .Error ())
358
348
} else if err = store .headerFile .Sync (); err != nil {
359
349
return fmt .Errorf ("unable to flush file: %s: %s" , store .headerFname , err .Error ())
360
- } else if _ , err = store .headerFile .Seek (0 , io .SeekStart ); err != nil {
350
+ }
351
+ return nil
352
+ }
353
+
354
+ func (store * fileStore ) IterateMessages (beginSeqNum , endSeqNum int , cb func ([]byte ) error ) error {
355
+ // Sync files
356
+ store .fileMu .Lock ()
357
+ err := store .syncBodyAndHeaderFilesLocked ()
358
+ store .fileMu .Unlock ()
359
+ if err != nil {
360
+ return err
361
+ }
362
+
363
+ // Open a read only view to body and header file
364
+ bodyFile , err := openOrCreateFile (store .bodyFname , 0440 )
365
+ if err != nil {
366
+ return err
367
+ }
368
+ defer func () { _ = bodyFile .Close () }()
369
+ headerFile , err := openOrCreateFile (store .headerFname , 0440 )
370
+ if err != nil {
371
+ return err
372
+ }
373
+ defer func () { _ = headerFile .Close () }()
374
+ if _ , err = headerFile .Seek (0 , io .SeekStart ); err != nil {
361
375
return fmt .Errorf ("unable to seek to start of file: %s: %s" , store .headerFname , err .Error ())
362
376
}
363
377
364
378
// Iterate over the header file
365
379
for {
366
380
var seqNum , size int
367
381
var offset int64
368
- if cnt , err := fmt .Fscanf (store . headerFile , "%d,%d,%d\n " , & seqNum , & offset , & size ); err != nil {
382
+ if cnt , err := fmt .Fscanf (headerFile , "%d,%d,%d\n " , & seqNum , & offset , & size ); err != nil {
369
383
if errors .Is (err , io .EOF ) {
370
384
break
371
385
}
@@ -379,7 +393,7 @@ func (store *fileStore) IterateMessages(beginSeqNum, endSeqNum int, cb func([]by
379
393
}
380
394
// Otherwise process the file
381
395
msg := make ([]byte , size )
382
- if _ , err := store . bodyFile .ReadAt (msg , offset ); err != nil {
396
+ if _ , err := bodyFile .ReadAt (msg , offset ); err != nil {
383
397
return fmt .Errorf ("unable to read from file: %s: %s" , store .bodyFname , err .Error ())
384
398
} else if err = cb (msg ); err != nil {
385
399
return err
0 commit comments