diff --git a/internal/core/src/storage/MinioChunkManager.cpp b/internal/core/src/storage/MinioChunkManager.cpp index 8bcd6ff0e6..3967cd70a1 100644 --- a/internal/core/src/storage/MinioChunkManager.cpp +++ b/internal/core/src/storage/MinioChunkManager.cpp @@ -441,6 +441,45 @@ MinioChunkManager::PutObjectBuffer(const std::string& bucket_name, return true; } +class AwsStreambuf : public std::streambuf { + public: + AwsStreambuf(char* buffer, std::streamsize buffer_size) { + setp(buffer, buffer + buffer_size - 1); + } + + protected: + int_type + overflow(int_type ch) override { + if (ch != traits_type::eof()) { + *pptr() = ch; + pbump(1); + } + return ch; + } +}; + +class AwsResponseStream : public Aws::IOStream { + public: + /** + * Creates a stream for get response from server + * @param buffer the buffer address from user space + * @param size length of the underlying buffer. + */ + AwsResponseStream(char* buffer, int64_t size) + : Aws::IOStream(&aws_streambuf), aws_streambuf(buffer, size) { + } + + private: + AwsResponseStream(const AwsResponseStream&) = delete; + AwsResponseStream(AwsResponseStream&&) = delete; + AwsResponseStream& + operator=(const AwsResponseStream&) = delete; + AwsResponseStream& + operator=(AwsResponseStream&&) = delete; + + AwsStreambuf aws_streambuf; +}; + uint64_t MinioChunkManager::GetObjectBuffer(const std::string& bucket_name, const std::string& object_name, @@ -451,9 +490,15 @@ MinioChunkManager::GetObjectBuffer(const std::string& bucket_name, request.SetKey(object_name.c_str()); request.SetResponseStreamFactory([buf, size]() { + // For macOs, pubsetbuf interface not implemented +#ifdef __linux__ std::unique_ptr stream( Aws::New("")); stream->rdbuf()->pubsetbuf(static_cast(buf), size); +#else + std::unique_ptr stream(Aws::New( + "AwsResponseStream", static_cast(buf), size)); +#endif return stream.release(); }); auto outcome = client_->GetObject(request);