Fix a cornercase during search
This commit is contained in:
parent
9435575dbe
commit
ba2b54296f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=185790
@ -221,9 +221,9 @@ fifolog_int_read(const struct fifolog_file *ff, off_t recno)
|
|||||||
recno++; /* label sector */
|
recno++; /* label sector */
|
||||||
i = pread(ff->fd, ff->recbuf, ff->recsize, recno * ff->recsize);
|
i = pread(ff->fd, ff->recbuf, ff->recsize, recno * ff->recsize);
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
return (-1);
|
return (-2);
|
||||||
if (i != (int)ff->recsize)
|
if (i != (int)ff->recsize)
|
||||||
return (-1);
|
return (-3);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ fifolog_reader_findsync(const struct fifolog_file *ff, off_t *o)
|
|||||||
assert(*o < ff->logsize);
|
assert(*o < ff->logsize);
|
||||||
e = fifolog_int_read(ff, *o);
|
e = fifolog_int_read(ff, *o);
|
||||||
if (e)
|
if (e)
|
||||||
err(1, "Read error while looking for SYNC");
|
err(1, "Read error (%d) while looking for SYNC", e);
|
||||||
seq = be32dec(ff->recbuf);
|
seq = be32dec(ff->recbuf);
|
||||||
if (*o == 0 && seq == 0)
|
if (*o == 0 && seq == 0)
|
||||||
return (0);
|
return (0);
|
||||||
@ -113,7 +113,7 @@ fifolog_reader_findsync(const struct fifolog_file *ff, off_t *o)
|
|||||||
return (2); /* wraparound */
|
return (2); /* wraparound */
|
||||||
e = fifolog_int_read(ff, *o);
|
e = fifolog_int_read(ff, *o);
|
||||||
if (e)
|
if (e)
|
||||||
err(1, "Read error while looking for SYNC");
|
err(1, "Read error (%d) while looking for SYNC", e);
|
||||||
seqs = be32dec(ff->recbuf);
|
seqs = be32dec(ff->recbuf);
|
||||||
if (seqs != seq)
|
if (seqs != seq)
|
||||||
return (3); /* End of log */
|
return (3); /* End of log */
|
||||||
@ -174,8 +174,10 @@ fifolog_reader_seek(const struct fifolog_reader *fr, time_t t0)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
e = fifolog_int_read(fr->ff, o + st);
|
e = fifolog_int_read(fr->ff, o + st);
|
||||||
if (e)
|
if (e) {
|
||||||
err(1, "Read error, duing binary search");
|
s = st = s / 2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
/* If not in same part, sequence won't match */
|
/* If not in same part, sequence won't match */
|
||||||
seqs = be32dec(fr->ff->recbuf);
|
seqs = be32dec(fr->ff->recbuf);
|
||||||
if (seqs != seq + st) {
|
if (seqs != seq + st) {
|
||||||
@ -254,7 +256,7 @@ fifolog_reader_process(struct fifolog_reader *fr, off_t from, fifolog_reader_ren
|
|||||||
while (1) {
|
while (1) {
|
||||||
e = fifolog_int_read(fr->ff, o);
|
e = fifolog_int_read(fr->ff, o);
|
||||||
if (e)
|
if (e)
|
||||||
err(1, "Read error");
|
err(1, "Read error (%d)", e);
|
||||||
if (++o >= fr->ff->logsize)
|
if (++o >= fr->ff->logsize)
|
||||||
o = 0;
|
o = 0;
|
||||||
seq = be32dec(fr->ff->recbuf);
|
seq = be32dec(fr->ff->recbuf);
|
||||||
|
Loading…
Reference in New Issue
Block a user