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);
}