@@ -5292,12 +5292,14 @@ func TestFileStoreFullStateBasics(t *testing.T) {
5292
5292
msgZ := bytes .Repeat ([]byte ("Z" ), msgLen )
5293
5293
5294
5294
// Send 2 msgs and stop, check for presence of our full state file.
5295
- fs .StoreMsg (subj , nil , msgA , 0 )
5296
- fs .StoreMsg (subj , nil , msgZ , 0 )
5297
- require_True (t , fs .numMsgBlocks () == 1 )
5295
+ _ , _ , err = fs .StoreMsg (subj , nil , msgA , 0 )
5296
+ require_NoError (t , err )
5297
+ _ , _ , err = fs .StoreMsg (subj , nil , msgZ , 0 )
5298
+ require_NoError (t , err )
5299
+ require_Equal (t , fs .numMsgBlocks (), 1 )
5298
5300
5299
5301
// Make sure there is a full state file after we do a stop.
5300
- fs .Stop ()
5302
+ require_NoError ( t , fs .Stop () )
5301
5303
5302
5304
sfile := filepath .Join (fcfg .StoreDir , msgDir , streamStreamStateFile )
5303
5305
if _ , err := os .Stat (sfile ); err != nil {
@@ -5317,10 +5319,10 @@ func TestFileStoreFullStateBasics(t *testing.T) {
5317
5319
// Make sure there are no old idx or fss files.
5318
5320
matches , err := filepath .Glob (filepath .Join (fcfg .StoreDir , msgDir , "%d.fss" ))
5319
5321
require_NoError (t , err )
5320
- require_True (t , len (matches ) == 0 )
5322
+ require_Equal (t , len (matches ), 0 )
5321
5323
matches , err = filepath .Glob (filepath .Join (fcfg .StoreDir , msgDir , "%d.idx" ))
5322
5324
require_NoError (t , err )
5323
- require_True (t , len (matches ) == 0 )
5325
+ require_Equal (t , len (matches ), 0 )
5324
5326
5325
5327
state := fs .State ()
5326
5328
require_Equal (t , state .Msgs , 2 )
@@ -5338,10 +5340,11 @@ func TestFileStoreFullStateBasics(t *testing.T) {
5338
5340
require_True (t , bytes .Equal (sm .msg , msgZ ))
5339
5341
5340
5342
// Now add in 1 more here to split the lmb.
5341
- fs .StoreMsg (subj , nil , msgZ , 0 )
5343
+ _ , _ , err = fs .StoreMsg (subj , nil , msgZ , 0 )
5344
+ require_NoError (t , err )
5342
5345
5343
5346
// Now stop the filestore and replace the old stream state and make sure we recover correctly.
5344
- fs .Stop ()
5347
+ require_NoError ( t , fs .Stop () )
5345
5348
5346
5349
// Regrab the stream state
5347
5350
buf , err = os .ReadFile (sfile )
@@ -5352,8 +5355,9 @@ func TestFileStoreFullStateBasics(t *testing.T) {
5352
5355
defer fs .Stop ()
5353
5356
5354
5357
// Add in one more.
5355
- fs .StoreMsg (subj , nil , msgZ , 0 )
5356
- fs .Stop ()
5358
+ _ , _ , err = fs .StoreMsg (subj , nil , msgZ , 0 )
5359
+ require_NoError (t , err )
5360
+ require_NoError (t , fs .Stop ())
5357
5361
5358
5362
// Put old stream state back with only 3.
5359
5363
err = os .WriteFile (sfile , buf , defaultFilePerms )
@@ -5381,8 +5385,9 @@ func TestFileStoreFullStateBasics(t *testing.T) {
5381
5385
require_Equal (t , psi .lblk , 2 )
5382
5386
5383
5387
// Store 1 more
5384
- fs .StoreMsg (subj , nil , msgA , 0 )
5385
- fs .Stop ()
5388
+ _ , _ , err = fs .StoreMsg (subj , nil , msgA , 0 )
5389
+ require_NoError (t , err )
5390
+ require_NoError (t , fs .Stop ())
5386
5391
// Put old stream state back with only 3.
5387
5392
err = os .WriteFile (sfile , buf , defaultFilePerms )
5388
5393
require_NoError (t , err )
@@ -8952,3 +8957,66 @@ func TestFileStoreLeftoverSkipMsgInDmap(t *testing.T) {
8952
8957
require_Equal (t , lseq , 1 )
8953
8958
require_Len (t , dmaps , 0 )
8954
8959
}
8960
+
8961
+ func TestFileStoreRecoverOnlyBlkFiles (t * testing.T ) {
8962
+ testFileStoreAllPermutations (t , func (t * testing.T , fcfg FileStoreConfig ) {
8963
+ cfg := StreamConfig {Name : "zzz" , Subjects : []string {"foo" }, Storage : FileStorage }
8964
+ created := time .Now ()
8965
+ fs , err := newFileStoreWithCreated (fcfg , cfg , created , prf (& fcfg ), nil )
8966
+ require_NoError (t , err )
8967
+ defer fs .Stop ()
8968
+
8969
+ _ , _ , err = fs .StoreMsg ("foo" , nil , nil , 0 )
8970
+ require_NoError (t , err )
8971
+
8972
+ // Confirm state as baseline.
8973
+ before := fs .State ()
8974
+ require_Equal (t , before .Msgs , 1 )
8975
+ require_Equal (t , before .FirstSeq , 1 )
8976
+ require_Equal (t , before .LastSeq , 1 )
8977
+
8978
+ // Restart should equal state.
8979
+ require_NoError (t , fs .Stop ())
8980
+ fs , err = newFileStoreWithCreated (fcfg , cfg , created , prf (& fcfg ), nil )
8981
+ require_NoError (t , err )
8982
+ defer fs .Stop ()
8983
+
8984
+ if state := fs .State (); ! reflect .DeepEqual (state , before ) {
8985
+ t .Fatalf ("Expected state of %+v, got %+v" , before , state )
8986
+ }
8987
+
8988
+ // Stream state should exist.
8989
+ _ , err = os .Stat (filepath .Join (fs .fcfg .StoreDir , msgDir , streamStreamStateFile ))
8990
+ require_NoError (t , err )
8991
+
8992
+ // Stop and write some random files, but containing ".blk", should be ignored.
8993
+ require_NoError (t , fs .Stop ())
8994
+ require_NoError (t , os .WriteFile (filepath .Join (fs .fcfg .StoreDir , msgDir , "10.blk.random" ), nil , defaultFilePerms ))
8995
+ require_NoError (t , os .WriteFile (filepath .Join (fs .fcfg .StoreDir , msgDir , fmt .Sprintf ("10.blk.%s" , compressTmpSuffix )), nil , defaultFilePerms ))
8996
+
8997
+ fs , err = newFileStoreWithCreated (fcfg , cfg , created , prf (& fcfg ), nil )
8998
+ require_NoError (t , err )
8999
+ defer fs .Stop ()
9000
+
9001
+ // The random files would previously result in stream state to be deleted.
9002
+ _ , err = os .Stat (filepath .Join (fs .fcfg .StoreDir , msgDir , streamStreamStateFile ))
9003
+ require_NoError (t , err )
9004
+
9005
+ if state := fs .State (); ! reflect .DeepEqual (state , before ) {
9006
+ t .Fatalf ("Expected state of %+v, got %+v" , before , state )
9007
+ }
9008
+
9009
+ // Stop and remove stream state file.
9010
+ require_NoError (t , fs .Stop ())
9011
+ require_NoError (t , os .Remove (filepath .Join (fs .fcfg .StoreDir , msgDir , streamStreamStateFile )))
9012
+
9013
+ // Recovering based on blocks should also ignore the random files.
9014
+ fs , err = newFileStoreWithCreated (fcfg , cfg , created , prf (& fcfg ), nil )
9015
+ require_NoError (t , err )
9016
+ defer fs .Stop ()
9017
+
9018
+ if state := fs .State (); ! reflect .DeepEqual (state , before ) {
9019
+ t .Fatalf ("Expected state of %+v, got %+v" , before , state )
9020
+ }
9021
+ })
9022
+ }
0 commit comments