From 31917cc2d415879a5051fcfc525c33431b8b5e75 Mon Sep 17 00:00:00 2001 From: Hongze Zhang Date: Fri, 7 Jan 2022 18:57:00 +0800 Subject: [PATCH] Fix wrong Tell() result from BufferedOutputStream in an edge case (#73) --- cpp/src/arrow/io/buffered.cc | 2 ++ cpp/src/arrow/io/buffered_test.cc | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/cpp/src/arrow/io/buffered.cc b/cpp/src/arrow/io/buffered.cc index 7804c130ca1d9..ccfe9a360ab98 100644 --- a/cpp/src/arrow/io/buffered.cc +++ b/cpp/src/arrow/io/buffered.cc @@ -144,6 +144,8 @@ class BufferedOutputStream::Impl : public BufferedBase { RETURN_NOT_OK(FlushUnlocked()); DCHECK_EQ(buffer_pos_, 0); if (nbytes >= buffer_size_) { + // Invalidate cached raw pos + raw_pos_ = -1; // Direct write if (buffer) { return raw_->Write(buffer); diff --git a/cpp/src/arrow/io/buffered_test.cc b/cpp/src/arrow/io/buffered_test.cc index ede18f20d4ce6..5e812b124e365 100644 --- a/cpp/src/arrow/io/buffered_test.cc +++ b/cpp/src/arrow/io/buffered_test.cc @@ -297,6 +297,19 @@ TEST_F(TestBufferedOutputStream, Tell) { AssertTell(0); } +TEST_F(TestBufferedOutputStream, Tell2) { + OpenBuffered(); + AssertTell(0); + + const std::string datastr = GenerateRandomData(10000); + const char* d = datastr.data(); + + ASSERT_OK(buffered_->Write(d, 5000)); + AssertTell(5000); + + ASSERT_OK(buffered_->Close()); +} + TEST_F(TestBufferedOutputStream, TruncatesFile) { OpenBuffered();