Skip to content

Commit c2aa60b

Browse files
committed
perform checks when readFile == writeFile
1 parent 637281a commit c2aa60b

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

diskqueue.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ func (d *diskQueue) readOne() ([]byte, error) {
349349
// we only consider rotating if we're reading a "complete" file
350350
// and since we cannot know the size at which it was rotated, we
351351
// rely on maxBytesPerFileRead rather than maxBytesPerFile
352-
if d.readFileNum < d.writeFileNum && d.nextReadPos >= d.maxBytesPerFileRead {
352+
if d.readFileNum <= d.writeFileNum && d.nextReadPos >= d.maxBytesPerFileRead {
353353
if d.readFile != nil {
354354
d.readFile.Close()
355355
d.readFile = nil
@@ -394,6 +394,7 @@ func (d *diskQueue) writeOne(data []byte) error {
394394
d.writeFile = nil
395395
}
396396
}
397+
397398
if d.writeFile == nil {
398399
curFileName := d.fileName(d.writeFileNum)
399400
d.writeFile, err = os.OpenFile(curFileName, os.O_RDWR|os.O_CREATE, 0600)
@@ -675,7 +676,7 @@ func (d *diskQueue) ioLoop() {
675676
count = 0
676677
}
677678

678-
if (d.readFileNum < d.writeFileNum) || (d.readPos < d.writePos) {
679+
if d.readFileNum < d.writeFileNum || (d.readFileNum == d.writeFileNum && d.readPos < d.writePos) {
679680
if d.nextReadPos == d.readPos {
680681
dataRead, err = d.readOne()
681682
if err != nil {

diskqueue_test.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -310,17 +310,22 @@ func TestDiskQueueCorruption(t *testing.T) {
310310
dqFn := dq.(*diskQueue).fileName(1)
311311
os.Truncate(dqFn, 400) // 3 valid messages, 5 corrupted
312312

313-
for i := 0; i < 19; i++ { // 1 message leftover in 4th file
314-
Equal(t, msg, <-dq.ReadChan())
315-
}
316-
317313
// corrupt the 4th (current) file
318314
dqFn = dq.(*diskQueue).fileName(3)
319315
os.Truncate(dqFn, 100)
320316

317+
for i := 0; i < 18; i++ {
318+
Equal(t, msg, <-dq.ReadChan())
319+
}
320+
Equal(t, int64(7), dq.Depth())
321+
322+
Equal(t, msg, <-dq.ReadChan())
323+
Equal(t, int64(0), dq.Depth())
324+
321325
dq.Put(msg) // in 5th file
322326

323327
Equal(t, msg, <-dq.ReadChan())
328+
Equal(t, int64(0), dq.Depth())
324329

325330
// write a corrupt (len 0) message at the 5th (current) file
326331
dq.(*diskQueue).writeFile.Write([]byte{0, 0, 0, 0})
@@ -333,14 +338,15 @@ func TestDiskQueueCorruption(t *testing.T) {
333338

334339
dq.Put(msg)
335340
dq.Put(msg)
341+
336342
// corrupt the last file
337343
dqFn = dq.(*diskQueue).fileName(5)
338344
os.Truncate(dqFn, 100)
339345

340346
Equal(t, int64(2), dq.Depth())
341347

342348
// return one message and try reading again from corrupted file
343-
<-dq.ReadChan()
349+
Equal(t, msg, <-dq.ReadChan())
344350

345351
// give diskqueue time to handle read error
346352
time.Sleep(50 * time.Millisecond)

0 commit comments

Comments
 (0)