@@ -260,22 +260,23 @@ type md struct {
260
260
writePos int64
261
261
}
262
262
263
- func readMetaDataFile (fileName string , retried int , withDiskSpaceFeat bool ) md {
263
+ func readMetaDataFile (fileName string , retried int , diskLimitFeatIsOn bool ) md {
264
264
f , err := os .OpenFile (fileName , os .O_RDONLY , 0600 )
265
265
if err != nil {
266
266
// provide a simple retry that results in up to
267
267
// another 500ms for the file to be written.
268
268
if retried < 9 {
269
269
retried ++
270
270
time .Sleep (50 * time .Millisecond )
271
- return readMetaDataFile (fileName , retried , withDiskSpaceFeat )
271
+ return readMetaDataFile (fileName , retried , diskLimitFeatIsOn )
272
272
}
273
273
panic (err )
274
274
}
275
275
defer f .Close ()
276
276
277
277
var ret md
278
- if withDiskSpaceFeat {
278
+
279
+ if diskLimitFeatIsOn {
279
280
_ , err = fmt .Fscanf (f , "%d\n %d,%d,%d\n %d,%d,%d,%d\n " ,
280
281
& ret .depth ,
281
282
& ret .readFileNum , & ret .readMessages , & ret .readPos ,
@@ -352,7 +353,8 @@ func TestDiskQueueSyncAfterReadWithDiskSizeImplementation(t *testing.T) {
352
353
dq := NewWithDiskSpace (dqName , tmpDir , 1 << 11 , 1 << 11 , 0 , 1 << 10 , 2500 , 50 * time .Millisecond , l )
353
354
defer dq .Close ()
354
355
355
- msg := make ([]byte , 1000 )
356
+ msgSize := 1000
357
+ msg := make ([]byte , msgSize )
356
358
dq .Put (msg )
357
359
358
360
for i := 0 ; i < 10 ; i ++ {
@@ -394,12 +396,19 @@ next:
394
396
panic ("fail" )
395
397
396
398
completeWriteFile:
397
- dq .Put (msg )
399
+ // meet the file size limit exactly (2048 bytes) when writeFileNum
400
+ // equals readFileNum
401
+ totalBytes := 2 * (msgSize + 4 )
402
+ bytesRemaining := 2048 - (totalBytes + 8 )
403
+ oneByteMsgSizeIncrease := 5
404
+ dq .Put (make ([]byte , bytesRemaining - 4 - oneByteMsgSizeIncrease ))
405
+ dq .Put (make ([]byte , 1 ))
398
406
399
407
for i := 0 ; i < 10 ; i ++ {
400
408
// test that write position and messages reset when a new file is created
409
+ // test the writeFileNum correctly increments
401
410
d := readMetaDataFile (dq .(* diskQueue ).metaDataFileName (), 0 , true )
402
- if d .depth == 2 &&
411
+ if d .depth == 3 &&
403
412
d .writeBytes == 3020 &&
404
413
d .readFileNum == 0 &&
405
414
d .writeFileNum == 1 &&
@@ -417,11 +426,13 @@ completeWriteFile:
417
426
completeReadFile:
418
427
dq .Put (msg )
419
428
429
+ <- dq .ReadChan ()
420
430
<- dq .ReadChan ()
421
431
<- dq .ReadChan ()
422
432
423
433
for i := 0 ; i < 10 ; i ++ {
424
434
// test that read position and messages reset when a file is completely read
435
+ // test the readFileNum correctly increments
425
436
d := readMetaDataFile (dq .(* diskQueue ).metaDataFileName (), 0 , true )
426
437
t .Logf ("Write bytes: %d" , d .writeBytes )
427
438
if d .depth == 1 &&
@@ -433,6 +444,64 @@ completeReadFile:
433
444
d .readMessages == 0 &&
434
445
d .writeMessages == 1 {
435
446
// success
447
+ goto completeWriteFileAgain
448
+ }
449
+ time .Sleep (100 * time .Millisecond )
450
+ }
451
+ panic ("fail" )
452
+
453
+ completeWriteFileAgain:
454
+ // make writeFileNum ahead of readFileNum
455
+ dq .Put (msg )
456
+ dq .Put (msg )
457
+
458
+ // meet the file size limit exactly (2048 bytes) when writeFileNum
459
+ // is ahead of readFileNum
460
+ dq .Put (msg )
461
+ dq .Put (msg )
462
+ dq .Put (make ([]byte , bytesRemaining - 4 - oneByteMsgSizeIncrease ))
463
+ dq .Put (make ([]byte , 1 ))
464
+
465
+ for i := 0 ; i < 10 ; i ++ {
466
+ // test that write position and messages reset when a file is completely read
467
+ // test the writeFileNum correctly increments
468
+ d := readMetaDataFile (dq .(* diskQueue ).metaDataFileName (), 0 , true )
469
+ if d .depth == 7 &&
470
+ d .readFileNum == 1 &&
471
+ d .writeFileNum == 3 &&
472
+ d .readPos == 0 &&
473
+ d .writePos == 0 &&
474
+ d .readMessages == 0 &&
475
+ d .writeMessages == 0 {
476
+ // success
477
+ goto completeReadFileAgain
478
+ }
479
+ time .Sleep (100 * time .Millisecond )
480
+ }
481
+ panic ("fail" )
482
+
483
+ completeReadFileAgain:
484
+ <- dq .ReadChan ()
485
+ <- dq .ReadChan ()
486
+ <- dq .ReadChan ()
487
+
488
+ <- dq .ReadChan ()
489
+ <- dq .ReadChan ()
490
+ <- dq .ReadChan ()
491
+ <- dq .ReadChan ()
492
+
493
+ for i := 0 ; i < 10 ; i ++ {
494
+ // test that read position and messages reset when a file is completely read
495
+ // test the readFileNum correctly increments
496
+ d := readMetaDataFile (dq .(* diskQueue ).metaDataFileName (), 0 , true )
497
+ if d .depth == 0 &&
498
+ d .readFileNum == 3 &&
499
+ d .writeFileNum == 3 &&
500
+ d .readPos == 0 &&
501
+ d .writePos == 0 &&
502
+ d .readMessages == 0 &&
503
+ d .writeMessages == 0 {
504
+ // success
436
505
goto done
437
506
}
438
507
time .Sleep (100 * time .Millisecond )
0 commit comments