You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by yi...@apache.org on 2022/05/30 05:45:31 UTC

[arrow] branch master updated: ARROW-16675: [C++] Wrong Tell() result from BufferedOutputStream in an edge case (#13250)

This is an automated email from the ASF dual-hosted git repository.

yibocai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/master by this push:
     new bfc7b24fd0 ARROW-16675: [C++] Wrong Tell() result from BufferedOutputStream in an edge case  (#13250)
bfc7b24fd0 is described below

commit bfc7b24fd0cfa56d06362a4d2a901182573b5e5a
Author: Hongze Zhang <ho...@intel.com>
AuthorDate: Mon May 30 13:45:26 2022 +0800

    ARROW-16675: [C++] Wrong Tell() result from BufferedOutputStream in an edge case  (#13250)
    
    Authored-by: Hongze Zhang <ho...@intel.com>
    Signed-off-by: Yibo Cai <yi...@arm.com>
---
 cpp/src/arrow/io/buffered.cc      | 2 ++
 cpp/src/arrow/io/buffered_test.cc | 8 ++++++++
 2 files changed, 10 insertions(+)

diff --git a/cpp/src/arrow/io/buffered.cc b/cpp/src/arrow/io/buffered.cc
index 7804c130ca..ccfe9a360a 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 ede18f20d4..f6f6d61f84 100644
--- a/cpp/src/arrow/io/buffered_test.cc
+++ b/cpp/src/arrow/io/buffered_test.cc
@@ -293,6 +293,14 @@ TEST_F(TestBufferedOutputStream, Tell) {
 
   ASSERT_OK(buffered_->Close());
 
+  // write long bytes after raw_pos is cached
+  OpenBuffered(/*buffer_size=*/3);
+  AssertTell(0);
+  ASSERT_OK(buffered_->Write("1234568790", 5));
+  AssertTell(5);
+
+  ASSERT_OK(buffered_->Close());
+
   OpenBuffered();
   AssertTell(0);
 }