Skip to content
Merged
Show file tree
Hide file tree
Changes from 122 commits
Commits
Show all changes
123 commits
Select commit Hold shift + click to select a range
a031578
global_lru_cache
iaojnh Apr 3, 2026
ef8194b
add MemoryLimitPool
iaojnh Apr 3, 2026
e2d5a0b
upd
iaojnh Apr 3, 2026
1deed5e
fix memory_block
iaojnh Apr 3, 2026
a122b2c
fix ut
iaojnh Apr 5, 2026
61e70ad
Merge branch 'main' into feat/merge-vector-arrow-buffer
iaojnh Apr 5, 2026
3c9451c
upd
iaojnh Apr 5, 2026
deac223
upd
iaojnh Apr 6, 2026
9f03d87
upd
iaojnh Apr 6, 2026
200e840
fix
iaojnh Apr 6, 2026
ebb7678
fix
iaojnh Apr 6, 2026
2e677f5
fix
iaojnh Apr 6, 2026
9d0d661
fix
iaojnh Apr 6, 2026
b2651bc
fix
iaojnh Apr 6, 2026
0f0cf51
fix
iaojnh Apr 6, 2026
e64dd15
upd
iaojnh Apr 6, 2026
61a5334
fix
iaojnh Apr 6, 2026
2fdf3de
fix
iaojnh Apr 7, 2026
0e478d4
fix
iaojnh Apr 7, 2026
f197ece
upd
iaojnh Apr 7, 2026
e5febfa
fix ut
iaojnh Apr 7, 2026
629dc6b
upd
iaojnh Apr 7, 2026
e708402
upd
iaojnh Apr 7, 2026
f3ec2e1
Merge branch 'main' into feat/merge-vector-arrow-buffer
iaojnh Apr 7, 2026
eeb55ad
upd
iaojnh Apr 7, 2026
4d62794
fix
iaojnh Apr 7, 2026
e2190cc
fix
iaojnh Apr 7, 2026
8ebc279
upd
iaojnh Apr 7, 2026
7a46485
clang format
iaojnh Apr 7, 2026
16f170b
upd
iaojnh Apr 7, 2026
bd6da44
Merge branch 'main' into feat/merge-vector-arrow-buffer
iaojnh Apr 8, 2026
8a00602
decrease memory in FlatStreamerTest.TestLinearSearchWithLRU
iaojnh Apr 8, 2026
56603c5
fix for pr comments
iaojnh Apr 8, 2026
f8cf194
clang format
iaojnh Apr 8, 2026
9ddb4fa
clang format
iaojnh Apr 8, 2026
04f8b91
add TODO
iaojnh Apr 9, 2026
ec4666d
rename
iaojnh Apr 10, 2026
9c61f9b
clang format
iaojnh Apr 10, 2026
8af44e6
fix
iaojnh Apr 10, 2026
0dea74f
fix
iaojnh Apr 10, 2026
76dfef7
Merge branch 'main' into feat/merge-vector-arrow-buffer
iaojnh Apr 13, 2026
02bd7b9
add header
iaojnh Apr 13, 2026
b744478
Merge branch 'feat/merge-vector-arrow-buffer' of https://github.com/i…
iaojnh Apr 13, 2026
17422a4
fix
iaojnh Apr 13, 2026
5aad18f
fix
iaojnh Apr 13, 2026
2769649
fix
iaojnh Apr 13, 2026
105cf60
fix
iaojnh Apr 13, 2026
0f7cf94
clang format
iaojnh Apr 13, 2026
d5f478b
fix
iaojnh Apr 14, 2026
5d8164b
upd
iaojnh Apr 14, 2026
a39163b
add log info
iaojnh Apr 15, 2026
cdd4206
fix
iaojnh Apr 20, 2026
44bfaad
add buffer pool ut
iaojnh Apr 20, 2026
1429cee
Merge branch 'main' into feat/merge-vector-arrow-buffer
iaojnh Apr 21, 2026
91362ea
fix
iaojnh Apr 21, 2026
57f0f52
fix
iaojnh Apr 21, 2026
e09a894
fix
iaojnh Apr 21, 2026
0b0072e
fix
iaojnh Apr 22, 2026
d4fe006
direct io
iaojnh Apr 22, 2026
b037782
change lru to list
iaojnh Apr 22, 2026
cb24abb
change lru to list
iaojnh Apr 23, 2026
242bb05
fix: hnsw chunk size init
iaojnh Apr 23, 2026
acfca08
Merge branch 'main' into feat/hnsw_chunk_size
iaojnh Apr 23, 2026
152088f
clang format
iaojnh Apr 23, 2026
661a6d2
fix
iaojnh Apr 23, 2026
1e5f5ac
Merge branch 'feat/hnsw_chunk_size' of https://github.com/iaojnh/zvec…
iaojnh Apr 23, 2026
0b78353
fix
iaojnh Apr 23, 2026
7dea504
clang-format
iaojnh Apr 23, 2026
200824f
Merge branch 'main' into feat/hnsw_chunk_size
iaojnh Apr 23, 2026
d30e3a9
fix entity
iaojnh Apr 23, 2026
fc5ec32
Merge branch 'feat/hnsw_chunk_size' of https://github.com/iaojnh/zvec…
iaojnh Apr 23, 2026
d133243
Revert "fix entity"
iaojnh Apr 23, 2026
2293dd9
add fast way
iaojnh Apr 24, 2026
bfce95c
fix
iaojnh Apr 24, 2026
c2f7f25
clang-format
iaojnh Apr 24, 2026
cd42dd1
raise kDefaultMaxChunkCnt
iaojnh Apr 24, 2026
24103b4
direct io
iaojnh Apr 22, 2026
1d86543
Merge branch 'main' into feat/hnsw_chunk_size
iaojnh Apr 24, 2026
2f2a8ab
fix
iaojnh Apr 24, 2026
c7d23d6
Merge branch 'test/bufferStorage' into feat/merge-vector-arrow-buffer
iaojnh Apr 24, 2026
d63d279
Merge branch 'main' into feat/merge-vector-arrow-buffer
iaojnh Apr 24, 2026
8ed324b
Merge branch 'feat/hnsw_chunk_size' into test/bufferStorage
iaojnh Apr 24, 2026
d156d5b
rm useless code
iaojnh Apr 24, 2026
5a36ba1
Merge branch 'feat/merge-vector-arrow-buffer' into test/bufferStorage
iaojnh Apr 24, 2026
47a17eb
Merge branch 'main' into feat/merge-vector-arrow-buffer
iaojnh Apr 24, 2026
3ba3290
fix
iaojnh Apr 24, 2026
fa83413
Merge branch 'feat/hnsw_chunk_size' into test/bufferStorage
iaojnh Apr 24, 2026
a4b9764
fix
iaojnh Apr 24, 2026
25c7c9a
fix
iaojnh Apr 24, 2026
07d455e
clang-format
iaojnh Apr 24, 2026
ece7887
rm O_DIRECT
iaojnh Apr 24, 2026
5ca9c87
Merge branch 'feat/hnsw_chunk_size' into test/bufferStorage
iaojnh Apr 24, 2026
f2bd414
skip
iaojnh Apr 24, 2026
410d6ed
fix
iaojnh Apr 24, 2026
3af1bb1
fix
iaojnh Apr 24, 2026
e9371e9
skip
iaojnh Apr 24, 2026
0e2e735
Merge branch 'feat/hnsw_chunk_size' into test/bufferStorage
iaojnh Apr 24, 2026
e4d3487
fix
iaojnh Apr 20, 2026
4ae550f
Merge branch 'feat/hnsw_chunk_size' into test/bufferStorage
iaojnh Apr 24, 2026
74a60f2
fix
iaojnh Apr 24, 2026
700cca5
upd
iaojnh Apr 7, 2026
7ebf741
Merge branch 'feat/hnsw_chunk_size' into test/bufferStorage
iaojnh Apr 24, 2026
4bdf60e
skip
iaojnh Apr 24, 2026
46bca83
skip
iaojnh Apr 24, 2026
466ca2a
Merge branch 'feat/hnsw_chunk_size' into test/bufferStorage
iaojnh Apr 24, 2026
b4824e7
Merge branch 'test/bufferStorage' into feat/merge-vector-arrow-buffer
iaojnh Apr 27, 2026
8ad62b0
rename lru_cache to evict queue
iaojnh Apr 28, 2026
04f339d
Merge branch 'feat/merge-vector-arrow-buffer' of https://github.com/i…
iaojnh Apr 28, 2026
c0cc8b7
fix test
iaojnh Apr 28, 2026
81dc985
fix
iaojnh Apr 28, 2026
1dfd13a
fix
iaojnh Apr 28, 2026
dc981fd
fix
iaojnh Apr 28, 2026
c3c3173
clang format
iaojnh Apr 28, 2026
1f45ef2
fix
iaojnh Apr 28, 2026
923839b
clang format
iaojnh Apr 28, 2026
068560c
clang format
iaojnh Apr 28, 2026
3e49dfa
Merge branch 'main' into feat/merge-vector-arrow-buffer
iaojnh Apr 29, 2026
45fba2a
Merge branch 'main' into feat/merge-vector-arrow-buffer
iaojnh Apr 29, 2026
4d1d64c
fix
iaojnh Apr 29, 2026
db6cbac
fix
iaojnh Apr 29, 2026
0baf2c1
clang format
iaojnh Apr 29, 2026
7135b10
chore: add more info in log.
iaojnh Apr 29, 2026
3ad202e
clang format
iaojnh Apr 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 153 additions & 0 deletions src/ailego/buffer/block_eviction_queue.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
// Copyright 2025-present the zvec project
//
// 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 <zvec/ailego/buffer/parquet_hash_table.h>
#include <zvec/ailego/buffer/vector_page_table.h>
#include <zvec/core/framework/index_logger.h>

namespace zvec {
namespace ailego {

int BlockEvictionQueue::init() {
evict_batch_size_ = 512;
for (size_t i = 0; i < CACHE_QUEUE_NUM; i++) {
evict_queues_.push_back(ConcurrentQueue(evict_batch_size_ * 200));
}
return 0;
}

bool BlockEvictionQueue::evict_single_block(BlockType &item) {
bool found = false;
for (size_t i = 0; i < CACHE_QUEUE_NUM; i++) {
found = evict_queues_[i].try_dequeue(item);
if (found) {
break;
}
}
return found;
}

bool BlockEvictionQueue::is_valid_and_alive(const BlockType &item) {
std::shared_lock<std::shared_mutex> lock(valid_page_tables_mutex_);
if (valid_page_tables_.find(item.page_table) == valid_page_tables_.end()) {
return false;
}
// is_dead_block accesses entries_ under the same shared lock, so the
// VectorPageTable destructor (which holds the unique lock via set_invalid)
// cannot free entries_ while this check is in progress.
return !item.page_table->is_dead_block(item);
}

bool BlockEvictionQueue::evict_block(BlockType &item) {
bool ok = false;
do {
ok = evict_single_block(item);
if (!ok) {
return false;
}
if (item.page_table == nullptr) {
if (!ParquetBufferPool::get_instance().is_dead_node(item)) {
break;
} else {
continue;
}
}
} while (!is_valid_and_alive(item));
return ok;
}

void BlockEvictionQueue::recycle() {
BlockType item;
while (MemoryLimitPool::get_instance().is_full() && evict_block(item)) {
if (item.page_table) {
std::shared_lock<std::shared_mutex> lock(valid_page_tables_mutex_);
if (valid_page_tables_.find(item.page_table) !=
valid_page_tables_.end()) {
item.page_table->evict_block(item.vector_block.first);
}
} else {
ParquetBufferPool::get_instance().evict(item.parquet_buffer_block.first);
}
}
}

bool BlockEvictionQueue::add_single_block(const BlockType &block,
int queue_index) {
bool ok = evict_queues_[queue_index].enqueue(block);
if (!ok) {
LOG_ERROR("enqueue failed.");
return false;
}
return true;
}

int MemoryLimitPool::init(size_t pool_size) {
pool_size_ = 0;
BlockEvictionQueue::get_instance().recycle();
pool_size_ = pool_size;
LOG_INFO("MemoryLimitPool initialized with pool size: %lu", pool_size_);
return 0;
}

bool MemoryLimitPool::try_acquire_buffer(const size_t buffer_size,
char *&buffer) {
size_t expected, desired;
do {
expected = used_size_.load();
if (expected >= pool_size_) {
return false;
}
desired = expected + buffer_size;
} while (!used_size_.compare_exchange_weak(expected, desired));
buffer = (char *)ailego_aligned_malloc(buffer_size, 4096);
if (!buffer) {
used_size_.fetch_sub(buffer_size);
return false;
}
return true;
}

void MemoryLimitPool::acquire_parquet(const size_t buffer_size) {
size_t expected, desired;
do {
expected = used_size_.load();
desired = expected + buffer_size;
} while (!used_size_.compare_exchange_weak(expected, desired));
}

void MemoryLimitPool::release_buffer(char *buffer, const size_t buffer_size) {
size_t expected, desired;
do {
expected = used_size_.load();
desired = expected - buffer_size;
assert(expected >= buffer_size);
} while (!used_size_.compare_exchange_weak(expected, desired));
ailego_free(buffer);
}

void MemoryLimitPool::release_parquet(const size_t buffer_size) {
size_t expected, desired;
do {
expected = used_size_.load();
desired = expected - buffer_size;
assert(expected >= buffer_size);
} while (!used_size_.compare_exchange_weak(expected, desired));
}

bool MemoryLimitPool::is_full() {
return used_size_.load() >= pool_size_;
}

} // namespace ailego
} // namespace zvec
Loading
Loading