Fix TransactionLogIterator EOF caching

Summary:
When TransactionLogIterator comes to EOF, it calls UnmarkEOF and continues reading. However, if glibc cached the EOF status of the file, it will get EOF again, even though the new data might have been written to it.

This has been causing errors in Mac OS.

Test Plan: test passes, was failing before

Reviewers: dhruba, haobo, sdong

Reviewed By: haobo

CC: leveldb

Differential Revision: https://reviews.facebook.net/D18381
This commit is contained in:
Igor Canadi 2014-04-28 23:30:27 -04:00
parent 9895465c6a
commit 72ff275e3c
2 changed files with 3 additions and 4 deletions

View File

@ -5555,9 +5555,6 @@ TEST(DBTest, TransactionLogIteratorMoveOverZeroFiles) {
} while (ChangeCompactOptions()); } while (ChangeCompactOptions());
} }
// TODO(kailiu) disable the in non-linux platforms to temporarily solve
// // the unit test failure.
#ifdef OS_LINUX
TEST(DBTest, TransactionLogIteratorStallAtLastRecord) { TEST(DBTest, TransactionLogIteratorStallAtLastRecord) {
do { do {
Options options = OptionsForLogIterTest(); Options options = OptionsForLogIterTest();
@ -5575,7 +5572,6 @@ TEST(DBTest, TransactionLogIteratorStallAtLastRecord) {
ASSERT_TRUE(iter->Valid()); ASSERT_TRUE(iter->Valid());
} while (ChangeCompactOptions()); } while (ChangeCompactOptions());
} }
#endif
TEST(DBTest, TransactionLogIteratorJustEmptyFile) { TEST(DBTest, TransactionLogIteratorJustEmptyFile) {
do { do {

View File

@ -182,6 +182,9 @@ class PosixSequentialFile: public SequentialFile {
if (r < n) { if (r < n) {
if (feof(file_)) { if (feof(file_)) {
// We leave status as ok if we hit the end of the file // We leave status as ok if we hit the end of the file
// We also clear the error so that the reads can continue
// if a new data is written to the file
clearerr(file_);
} else { } else {
// A partial read with an error: return a non-ok status // A partial read with an error: return a non-ok status
s = IOError(filename_, errno); s = IOError(filename_, errno);