Caiyd 1881 bad alloc (#1892)

* #1881 update storage APIs, use int64_t for size

Signed-off-by: yudong.cai <yudong.cai@zilliz.com>

* update changelog

Signed-off-by: yudong.cai <yudong.cai@zilliz.com>
pull/1884/head
Cai Yudong 2020-04-09 17:13:15 +08:00 committed by GitHub
parent cc3b75b6b7
commit 66e38d20cd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 118 additions and 45 deletions

View File

@ -7,6 +7,7 @@ Please mark all change in change log and use the issue from GitHub
## Bug ## Bug
- \#1762 Server is not forbidden to create new partition which tag is `_default` - \#1762 Server is not forbidden to create new partition which tag is `_default`
- \#1873 Fix index file serialize to incorrect path - \#1873 Fix index file serialize to incorrect path
- \#1881 Fix Annoy index search fail
## Feature ## Feature
- \#261 Integrate ANNOY into Milvus - \#261 Integrate ANNOY into Milvus

View File

@ -36,9 +36,12 @@ DefaultVectorIndexFormat::read_internal(const storage::FSHandlerPtr& fs_ptr, con
knowhere::BinarySet load_data_list; knowhere::BinarySet load_data_list;
recorder.RecordSection("Start"); recorder.RecordSection("Start");
fs_ptr->reader_ptr_->open(path); if (!fs_ptr->reader_ptr_->open(path)) {
ENGINE_LOG_ERROR << "Fail to open vector index: " << path;
return nullptr;
}
size_t length = fs_ptr->reader_ptr_->length(); int64_t length = fs_ptr->reader_ptr_->length();
if (length <= 0) { if (length <= 0) {
ENGINE_LOG_ERROR << "Invalid vector index length: " << path; ENGINE_LOG_ERROR << "Invalid vector index length: " << path;
return nullptr; return nullptr;
@ -128,7 +131,10 @@ DefaultVectorIndexFormat::write(const storage::FSHandlerPtr& fs_ptr, const std::
int32_t index_type = knowhere::StrToOldIndexType(index->index_type()); int32_t index_type = knowhere::StrToOldIndexType(index->index_type());
recorder.RecordSection("Start"); recorder.RecordSection("Start");
fs_ptr->writer_ptr_->open(location); if (!fs_ptr->writer_ptr_->open(location)) {
ENGINE_LOG_ERROR << "Fail to open vector index: " << location;
return;
}
fs_ptr->writer_ptr_->write(&index_type, sizeof(index_type)); fs_ptr->writer_ptr_->write(&index_type, sizeof(index_type));

View File

@ -19,16 +19,16 @@ namespace storage {
class IOReader { class IOReader {
public: public:
virtual void virtual bool
open(const std::string& name) = 0; open(const std::string& name) = 0;
virtual void virtual void
read(void* ptr, size_t size) = 0; read(void* ptr, int64_t size) = 0;
virtual void virtual void
seekg(size_t pos) = 0; seekg(int64_t pos) = 0;
virtual size_t virtual int64_t
length() = 0; length() = 0;
virtual void virtual void

View File

@ -19,13 +19,13 @@ namespace storage {
class IOWriter { class IOWriter {
public: public:
virtual void virtual bool
open(const std::string& name) = 0; open(const std::string& name) = 0;
virtual void virtual void
write(void* ptr, size_t size) = 0; write(void* ptr, int64_t size) = 0;
virtual size_t virtual int64_t
length() = 0; length() = 0;
virtual void virtual void

View File

@ -14,26 +14,27 @@
namespace milvus { namespace milvus {
namespace storage { namespace storage {
void bool
DiskIOReader::open(const std::string& name) { DiskIOReader::open(const std::string& name) {
name_ = name; name_ = name;
fs_ = std::fstream(name_, std::ios::in | std::ios::binary); fs_ = std::fstream(name_, std::ios::in | std::ios::binary);
return fs_.good();
} }
void void
DiskIOReader::read(void* ptr, size_t size) { DiskIOReader::read(void* ptr, int64_t size) {
fs_.read(reinterpret_cast<char*>(ptr), size); fs_.read(reinterpret_cast<char*>(ptr), size);
} }
void void
DiskIOReader::seekg(size_t pos) { DiskIOReader::seekg(int64_t pos) {
fs_.seekg(pos); fs_.seekg(pos);
} }
size_t int64_t
DiskIOReader::length() { DiskIOReader::length() {
fs_.seekg(0, fs_.end); fs_.seekg(0, fs_.end);
size_t len = fs_.tellg(); int64_t len = fs_.tellg();
fs_.seekg(0, fs_.beg); fs_.seekg(0, fs_.beg);
return len; return len;
} }

View File

@ -33,16 +33,16 @@ class DiskIOReader : public IOReader {
DiskIOReader& DiskIOReader&
operator=(DiskIOReader&&) = delete; operator=(DiskIOReader&&) = delete;
void bool
open(const std::string& name) override; open(const std::string& name) override;
void void
read(void* ptr, size_t size) override; read(void* ptr, int64_t size) override;
void void
seekg(size_t pos) override; seekg(int64_t pos) override;
size_t int64_t
length() override; length() override;
void void

View File

@ -14,20 +14,21 @@
namespace milvus { namespace milvus {
namespace storage { namespace storage {
void bool
DiskIOWriter::open(const std::string& name) { DiskIOWriter::open(const std::string& name) {
name_ = name; name_ = name;
len_ = 0; len_ = 0;
fs_ = std::fstream(name_, std::ios::out | std::ios::binary); fs_ = std::fstream(name_, std::ios::out | std::ios::binary);
return fs_.good();
} }
void void
DiskIOWriter::write(void* ptr, size_t size) { DiskIOWriter::write(void* ptr, int64_t size) {
fs_.write(reinterpret_cast<char*>(ptr), size); fs_.write(reinterpret_cast<char*>(ptr), size);
len_ += size; len_ += size;
} }
size_t int64_t
DiskIOWriter::length() { DiskIOWriter::length() {
return len_; return len_;
} }

View File

@ -33,13 +33,13 @@ class DiskIOWriter : public IOWriter {
DiskIOWriter& DiskIOWriter&
operator=(DiskIOWriter&&) = delete; operator=(DiskIOWriter&&) = delete;
void bool
open(const std::string& name) override; open(const std::string& name) override;
void void
write(void* ptr, size_t size) override; write(void* ptr, int64_t size) override;
size_t int64_t
length() override; length() override;
void void
@ -47,7 +47,7 @@ class DiskIOWriter : public IOWriter {
public: public:
std::string name_; std::string name_;
size_t len_; int64_t len_;
std::fstream fs_; std::fstream fs_;
}; };

View File

@ -15,24 +15,24 @@
namespace milvus { namespace milvus {
namespace storage { namespace storage {
void bool
S3IOReader::open(const std::string& name) { S3IOReader::open(const std::string& name) {
name_ = name; name_ = name;
pos_ = 0; pos_ = 0;
S3ClientWrapper::GetInstance().GetObjectStr(name_, buffer_); return (S3ClientWrapper::GetInstance().GetObjectStr(name_, buffer_).ok());
} }
void void
S3IOReader::read(void* ptr, size_t size) { S3IOReader::read(void* ptr, int64_t size) {
memcpy(ptr, buffer_.data() + pos_, size); memcpy(ptr, buffer_.data() + pos_, size);
} }
void void
S3IOReader::seekg(size_t pos) { S3IOReader::seekg(int64_t pos) {
pos_ = pos; pos_ = pos;
} }
size_t int64_t
S3IOReader::length() { S3IOReader::length() {
return buffer_.length(); return buffer_.length();
} }

View File

@ -32,16 +32,16 @@ class S3IOReader : public IOReader {
S3IOReader& S3IOReader&
operator=(S3IOReader&&) = delete; operator=(S3IOReader&&) = delete;
void bool
open(const std::string& name) override; open(const std::string& name) override;
void void
read(void* ptr, size_t size) override; read(void* ptr, int64_t size) override;
void void
seekg(size_t pos) override; seekg(int64_t pos) override;
size_t int64_t
length() override; length() override;
void void
@ -50,7 +50,7 @@ class S3IOReader : public IOReader {
public: public:
std::string name_; std::string name_;
std::string buffer_; std::string buffer_;
size_t pos_; int64_t pos_;
}; };
using S3IOReaderPtr = std::shared_ptr<S3IOReader>; using S3IOReaderPtr = std::shared_ptr<S3IOReader>;

View File

@ -15,20 +15,21 @@
namespace milvus { namespace milvus {
namespace storage { namespace storage {
void bool
S3IOWriter::open(const std::string& name) { S3IOWriter::open(const std::string& name) {
name_ = name; name_ = name;
len_ = 0; len_ = 0;
buffer_ = ""; buffer_ = "";
return true;
} }
void void
S3IOWriter::write(void* ptr, size_t size) { S3IOWriter::write(void* ptr, int64_t size) {
buffer_ += std::string(reinterpret_cast<char*>(ptr), size); buffer_ += std::string(reinterpret_cast<char*>(ptr), size);
len_ += size; len_ += size;
} }
size_t int64_t
S3IOWriter::length() { S3IOWriter::length() {
return len_; return len_;
} }

View File

@ -32,13 +32,13 @@ class S3IOWriter : public IOWriter {
S3IOWriter& S3IOWriter&
operator=(S3IOWriter&&) = delete; operator=(S3IOWriter&&) = delete;
void bool
open(const std::string& name) override; open(const std::string& name) override;
void void
write(void* ptr, size_t size) override; write(void* ptr, int64_t size) override;
size_t int64_t
length() override; length() override;
void void
@ -46,7 +46,7 @@ class S3IOWriter : public IOWriter {
public: public:
std::string name_; std::string name_;
size_t len_; int64_t len_;
std::string buffer_; std::string buffer_;
}; };

View File

@ -208,4 +208,4 @@ add_subdirectory(metrics)
add_subdirectory(scheduler) add_subdirectory(scheduler)
add_subdirectory(server) add_subdirectory(server)
add_subdirectory(thirdparty) add_subdirectory(thirdparty)
#add_subdirectory(storage) add_subdirectory(storage)

View File

@ -12,7 +12,8 @@
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
set(test_files set(test_files
${CMAKE_CURRENT_SOURCE_DIR}/test_s3_client.cpp # ${CMAKE_CURRENT_SOURCE_DIR}/test_s3_client.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_disk.cpp
${CMAKE_CURRENT_SOURCE_DIR}/utils.cpp ${CMAKE_CURRENT_SOURCE_DIR}/utils.cpp
) )

View File

@ -0,0 +1,62 @@
// Copyright (C) 2019-2020 Zilliz. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
// or implied. See the License for the specific language governing permissions and limitations under the License.
#include <gtest/gtest.h>
#include "easyloggingpp/easylogging++.h"
#include "storage/disk/DiskIOReader.h"
#include "storage/disk/DiskIOWriter.h"
#include "storage/utils.h"
INITIALIZE_EASYLOGGINGPP
TEST_F(StorageTest, DISK_RW_TEST) {
const std::string index_name = "/tmp/test_index";
const std::string content = "abcdefg";
{
milvus::storage::DiskIOWriter writer;
ASSERT_TRUE(writer.open(index_name));
size_t len = content.length();
writer.write(&len, sizeof(len));
writer.write((void*)(content.data()), len);
ASSERT_TRUE(len + sizeof(len) == writer.length());
writer.close();
}
{
milvus::storage::DiskIOReader reader;
ASSERT_FALSE(reader.open("/tmp/notexist"));
ASSERT_TRUE(reader.open(index_name));
int64_t length = reader.length();
int64_t rp = 0;
reader.seekg(rp);
std::string content_out;
while (rp < length) {
size_t len;
reader.read(&len, sizeof(len));
rp += sizeof(len);
reader.seekg(rp);
auto data = new char[len];
reader.read(data, len);
rp += len;
reader.seekg(rp);
content_out += std::string(data, len);
delete[] data;
}
ASSERT_TRUE(content == content_out);
reader.close();
}
}