@@ -64,46 +64,61 @@ HnswFileWorker::~HnswFileWorker() {
6464 mmap_ = nullptr ;
6565}
6666
67- bool HnswFileWorker::Write (std::shared_ptr<HnswHandler> &data,
68- std::unique_ptr<LocalFileHandle> &file_handle,
69- bool &prepare_success,
70- const FileWorkerSaveCtx &ctx) {
71- std::unique_lock l (mutex_);
72-
73- auto fd = file_handle->fd ();
74- mmap_size_ = data->CalcSize ();
75- ftruncate (fd, mmap_size_);
76-
77- mmap_ = mmap (nullptr , mmap_size_, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0 );
78-
79- size_t offset{};
80- data->SaveToPtr (mmap_, offset);
67+ // bool HnswFileWorker::Write(std::shared_ptr<HnswHandler> &data,
68+ // std::unique_ptr<LocalFileHandle> &file_handle,
69+ // bool &prepare_success,
70+ // const FileWorkerSaveCtx &ctx) {
71+ // std::unique_lock l(mutex_);
72+ //
73+ // auto fd = file_handle->fd();
74+ // mmap_size_ = data->CalcSize();
75+ // ftruncate(fd, mmap_size_);
76+ //
77+ // mmap_ = mmap(nullptr, mmap_size_, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
78+ //
79+ // size_t offset{};
80+ // data->SaveToPtr(mmap_, offset);
81+ //
82+ // auto &path = *rel_file_path_;
83+ // auto &cache_manager = InfinityContext::instance().storage()->fileworker_manager()->hnsw_map_.cache_manager_;
84+ // cache_manager.Set(path, data, data->MemUsage());
85+ // prepare_success = true;
86+ // return true;
87+ // }
88+
89+ void HnswFileWorker::Read (HnswHandler *&data, std::unique_ptr<LocalFileHandle> &file_handle, size_t file_size) {
90+ // std::unique_lock l(mutex_);
91+ // auto &path = *rel_file_path_;
92+ // std::println("{}", path);
93+ //
94+ // data = HnswHandler::Make(index_base_.get(), column_def_).release();
95+ // if (!mmap_) {
96+ // mmap_size_ = file_handle->FileSize();
97+ // auto fd = file_handle->fd();
98+ // mmap_ = mmap(nullptr, mmap_size_, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
99+ // }
100+ // data->LoadFromPtr(mmap_, mmap_size_, file_size);
81101
82102 auto &path = *rel_file_path_;
83- auto &cache_manager = InfinityContext::instance (). storage ()-> fileworker_manager ()-> hnsw_map_ . cache_manager_ ;
84- cache_manager. Set (path, data, data-> MemUsage ());
85- prepare_success = true ;
86- return true ;
87- }
103+ auto tmp_path = GetFilePathTemp () ;
104+ if (!inited_) {
105+ if (! VirtualStore::Exists ( " /var/infinity/tmp " )) {
106+ VirtualStore::MakeDirectory ( " /var/infinity/tmp " ) ;
107+ }
88108
89- void HnswFileWorker::Read (std::shared_ptr<HnswHandler> &data, std::unique_ptr<LocalFileHandle> &file_handle, size_t file_size) {
90- std::unique_lock l (mutex_);
91- if (!file_handle) {
92- return ;
93- }
94- auto &path = *rel_file_path_;
95- auto &cache_manager = InfinityContext::instance ().storage ()->fileworker_manager ()->hnsw_map_ .cache_manager_ ;
96- bool flag = cache_manager.Get (path, data);
97- if (!flag) {
98- data = HnswHandler::Make (index_base_.get (), column_def_);
99- if (!mmap_) {
100- mmap_size_ = file_handle->FileSize ();
101- auto fd = file_handle->fd ();
102- mmap_ = mmap (nullptr , mmap_size_, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0 );
109+ if (!VirtualStore::Exists (tmp_path.c_str ())) {
110+ auto [handle, status] = VirtualStore::Open (tmp_path, FileAccessMode::kReadWrite );
111+ close (handle->fd ());
112+ VirtualStore::DeleteFile (tmp_path.c_str ());
103113 }
104- data->LoadFromPtr (mmap_, mmap_size_, file_size);
105- cache_manager.Set (path, data, data->MemUsage ());
114+ segment_ = boost::interprocess::managed_mapped_file (boost::interprocess::open_or_create_infinity, tmp_path.c_str (), 1145141919ull );
115+ auto *sm = segment_.get_segment_manager ();
116+ data = segment_.find_or_construct <HnswHandler>(path.c_str ())(index_base_.get (), column_def_, sm);
117+ inited_ = true ;
118+ return ;
106119 }
120+ auto result = segment_.find <HnswHandler>(path.c_str ());
121+ data = result.first ;
107122}
108123
109124} // namespace infinity
0 commit comments