WriteBatch::Iterate wrongly returns Status::Corruption (#4478)

Summary:
Wrong I overwrite `WriteBatch::Handler::Continue` to return _false_ at some point, I always get the `Status::Corruption` error.
I don't think this check is used correctly here: The counter in `found` cannot reflect all entries in the WriteBatch when we exit the loop early.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/4478

Differential Revision: D10317416

Pulled By: yiwu-arbug

fbshipit-source-id: cccae3382805035f9b3239b66682b5fcbba6bb61
This commit is contained in:
Simon Grätzer 2018-10-10 20:55:42 -07:00 committed by Facebook Github Bot
parent 7e56072290
commit ceded4535d
1 changed files with 8 additions and 3 deletions

View File

@ -414,8 +414,13 @@ Status WriteBatch::Iterate(Handler* handler) const {
char tag = 0;
uint32_t column_family = 0; // default
bool last_was_try_again = false;
while (((s.ok() && !input.empty()) || UNLIKELY(s.IsTryAgain())) &&
handler->Continue()) {
bool handler_continue = true;
while (((s.ok() && !input.empty()) || UNLIKELY(s.IsTryAgain()))) {
handler_continue = handler->Continue();
if (!handler_continue) {
break;
}
if (LIKELY(!s.IsTryAgain())) {
last_was_try_again = false;
tag = 0;
@ -583,7 +588,7 @@ Status WriteBatch::Iterate(Handler* handler) const {
if (!s.ok()) {
return s;
}
if (found != WriteBatchInternal::Count(this)) {
if (handler_continue && found != WriteBatchInternal::Count(this)) {
return Status::Corruption("WriteBatch has wrong count");
} else {
return Status::OK();