#include "MemTable.h" #include "Log.h" namespace zilliz { namespace milvus { namespace engine { MemTable::MemTable(const std::string& table_id, const std::shared_ptr& meta, const Options& options) : table_id_(table_id), meta_(meta), options_(options) { } Status MemTable::Add(VectorSource::Ptr& source) { while (!source->AllAdded()) { MemTableFile::Ptr currentMemTableFile; if (!mem_table_file_list_.empty()) { currentMemTableFile = mem_table_file_list_.back(); } Status status; if (mem_table_file_list_.empty() || currentMemTableFile->IsFull()) { MemTableFile::Ptr newMemTableFile = std::make_shared(table_id_, meta_, options_); status = newMemTableFile->Add(source); if (status.ok()) { mem_table_file_list_.emplace_back(newMemTableFile); } } else { status = currentMemTableFile->Add(source); } if (!status.ok()) { std::string errMsg = "MemTable::Add failed: " + status.ToString(); ENGINE_LOG_ERROR << errMsg; return Status::Error(errMsg); } } return Status::OK(); } void MemTable::GetCurrentMemTableFile(MemTableFile::Ptr& mem_table_file) { mem_table_file = mem_table_file_list_.back(); } size_t MemTable::GetTableFileCount() { return mem_table_file_list_.size(); } Status MemTable::Serialize() { for (auto memTableFile = mem_table_file_list_.begin(); memTableFile != mem_table_file_list_.end(); ) { auto status = (*memTableFile)->Serialize(); if (!status.ok()) { std::string errMsg = "MemTable::Serialize failed: " + status.ToString(); ENGINE_LOG_ERROR << errMsg; return Status::Error(errMsg); } std::lock_guard lock(mutex_); memTableFile = mem_table_file_list_.erase(memTableFile); } return Status::OK(); } bool MemTable::Empty() { return mem_table_file_list_.empty(); } const std::string& MemTable::GetTableId() const { return table_id_; } size_t MemTable::GetCurrentMem() { std::lock_guard lock(mutex_); size_t totalMem = 0; for (auto& memTableFile : mem_table_file_list_) { totalMem += memTableFile->GetCurrentMem(); } return totalMem; } } // namespace engine } // namespace milvus } // namespace zilliz