Skip to content

Commit 21698d7

Browse files
Fix wrong Tell() result from BufferedOutputStream in an edge case (#73) (#74)
Co-authored-by: Hongze Zhang <hongze.zhang@intel.com>
1 parent b0044c5 commit 21698d7

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

cpp/src/arrow/io/buffered.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ class BufferedOutputStream::Impl : public BufferedBase {
144144
RETURN_NOT_OK(FlushUnlocked());
145145
DCHECK_EQ(buffer_pos_, 0);
146146
if (nbytes >= buffer_size_) {
147+
// Invalidate cached raw pos
148+
raw_pos_ = -1;
147149
// Direct write
148150
if (buffer) {
149151
return raw_->Write(buffer);

cpp/src/arrow/io/buffered_test.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,19 @@ TEST_F(TestBufferedOutputStream, Tell) {
296296
AssertTell(0);
297297
}
298298

299+
TEST_F(TestBufferedOutputStream, Tell2) {
300+
OpenBuffered();
301+
AssertTell(0);
302+
303+
const std::string datastr = GenerateRandomData(10000);
304+
const char* d = datastr.data();
305+
306+
ASSERT_OK(buffered_->Write(d, 5000));
307+
AssertTell(5000);
308+
309+
ASSERT_OK(buffered_->Close());
310+
}
311+
299312
TEST_F(TestBufferedOutputStream, TruncatesFile) {
300313
OpenBuffered();
301314

0 commit comments

Comments
 (0)