You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by uw...@apache.org on 2017/01/03 07:32:01 UTC

arrow git commit: ARROW-387: [C++] Verify zero-copy Buffer slices from BufferReader retain reference to parent Buffer

Repository: arrow
Updated Branches:
  refs/heads/master d9df55679 -> 26140dca8


ARROW-387: [C++] Verify zero-copy Buffer slices from BufferReader retain reference to parent Buffer

This is stacked on top of the patch for ARROW-294, will rebase.

Author: Wes McKinney <we...@twosigma.com>

Closes #266 from wesm/ARROW-387 and squashes the following commits:

061ef8b [Wes McKinney] Verify BufferReader passes on ownership of parent buffer to zero-copy slices
42a83a4 [Wes McKinney] Remove duplicated includes
3928ab0 [Wes McKinney] Base MemoryMappedFile implementation on common OSFile interface. Add test case for ARROW-340.


Project: http://git-wip-us.apache.org/repos/asf/arrow/repo
Commit: http://git-wip-us.apache.org/repos/asf/arrow/commit/26140dca
Tree: http://git-wip-us.apache.org/repos/asf/arrow/tree/26140dca
Diff: http://git-wip-us.apache.org/repos/asf/arrow/diff/26140dca

Branch: refs/heads/master
Commit: 26140dca893296d84cea3b76c97c62fbc4052e3f
Parents: d9df556
Author: Wes McKinney <we...@twosigma.com>
Authored: Tue Jan 3 08:31:37 2017 +0100
Committer: Uwe L. Korn <uw...@xhochy.com>
Committed: Tue Jan 3 08:31:37 2017 +0100

----------------------------------------------------------------------
 cpp/src/arrow/io/interfaces.cc     |  5 +++++
 cpp/src/arrow/io/interfaces.h      |  5 ++++-
 cpp/src/arrow/io/io-memory-test.cc | 23 ++++++++++++++++++++++-
 3 files changed, 31 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/arrow/blob/26140dca/cpp/src/arrow/io/interfaces.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/io/interfaces.cc b/cpp/src/arrow/io/interfaces.cc
index 68c1ac3..23bef28 100644
--- a/cpp/src/arrow/io/interfaces.cc
+++ b/cpp/src/arrow/io/interfaces.cc
@@ -44,5 +44,10 @@ Status ReadableFileInterface::ReadAt(
   return Read(nbytes, out);
 }
 
+Status Writeable::Write(const std::string& data) {
+  return Write(reinterpret_cast<const uint8_t*>(data.c_str()),
+      static_cast<int64_t>(data.size()));
+}
+
 }  // namespace io
 }  // namespace arrow

http://git-wip-us.apache.org/repos/asf/arrow/blob/26140dca/cpp/src/arrow/io/interfaces.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/io/interfaces.h b/cpp/src/arrow/io/interfaces.h
index db0c059..8fe2849 100644
--- a/cpp/src/arrow/io/interfaces.h
+++ b/cpp/src/arrow/io/interfaces.h
@@ -20,6 +20,7 @@
 
 #include <cstdint>
 #include <memory>
+#include <string>
 
 #include "arrow/util/macros.h"
 #include "arrow/util/visibility.h"
@@ -67,9 +68,11 @@ class Seekable {
   virtual Status Seek(int64_t position) = 0;
 };
 
-class Writeable {
+class ARROW_EXPORT Writeable {
  public:
   virtual Status Write(const uint8_t* data, int64_t nbytes) = 0;
+
+  Status Write(const std::string& data);
 };
 
 class Readable {

http://git-wip-us.apache.org/repos/asf/arrow/blob/26140dca/cpp/src/arrow/io/io-memory-test.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/io/io-memory-test.cc b/cpp/src/arrow/io/io-memory-test.cc
index 2463102..95d788c 100644
--- a/cpp/src/arrow/io/io-memory-test.cc
+++ b/cpp/src/arrow/io/io-memory-test.cc
@@ -48,12 +48,33 @@ TEST_F(TestBufferOutputStream, CloseResizes) {
   const int64_t nbytes = static_cast<int64_t>(data.size());
   const int K = 100;
   for (int i = 0; i < K; ++i) {
-    EXPECT_OK(stream_->Write(reinterpret_cast<const uint8_t*>(data.c_str()), nbytes));
+    EXPECT_OK(stream_->Write(data));
   }
 
   ASSERT_OK(stream_->Close());
   ASSERT_EQ(K * nbytes, buffer_->size());
 }
 
+TEST(TestBufferReader, RetainParentReference) {
+  // ARROW-387
+  std::string data = "data123456";
+
+  std::shared_ptr<Buffer> slice1;
+  std::shared_ptr<Buffer> slice2;
+  {
+    auto buffer = std::make_shared<PoolBuffer>();
+    ASSERT_OK(buffer->Resize(static_cast<int64_t>(data.size())));
+    std::memcpy(buffer->mutable_data(), data.c_str(), data.size());
+    BufferReader reader(buffer);
+    ASSERT_OK(reader.Read(4, &slice1));
+    ASSERT_OK(reader.Read(6, &slice2));
+  }
+
+  ASSERT_TRUE(slice1->parent() != nullptr);
+
+  ASSERT_EQ(0, std::memcmp(slice1->data(), data.c_str(), 4));
+  ASSERT_EQ(0, std::memcmp(slice2->data(), data.c_str() + 4, 6));
+}
+
 }  // namespace io
 }  // namespace arrow