-
Notifications
You must be signed in to change notification settings - Fork 2.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Major compaction 1st edition #31804
Major compaction 1st edition #31804
Conversation
Signed-off-by: wayblink <[email protected]>
Signed-off-by: wayblink <[email protected]>
Signed-off-by: Cai Zhang <[email protected]>
Signed-off-by: wayblink <[email protected]>
Signed-off-by: wayblink <[email protected]>
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: wayblink The full list of commands accepted by this bot can be found here.
Needs approval from an approver in each of these files:
Approvers can indicate their approval by writing |
|
configs/milvus.yaml
Outdated
@@ -435,6 +435,22 @@ dataCoord: | |||
maxParallelTaskNum: 10 # max parallel compaction task number | |||
indexBasedCompaction: true | |||
|
|||
major: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
About the terminology here:we have major and L2:
I think L2 request user to understand the concept of segment type and relationships between different compaction types and segment types. Here compaction is actually L1 + L2 -> L2, and we will add L2 single compaction, L2 merge compaction in the future. So I think L2 may cause more confusion.
For major compaction, we will split one major compaction into multi sub compaction tasks to handle large dataset and handoff. It is a little weird to also call these subTask as major
. We developers should notice that.
I prefer major
than L2
for easier user understanding. And here is another proposal ——clusteringCompaction
.
clustering
is more accurate and echos the concept of clusteringKey
.
Final compaction type will be like:
Level0DeleteCompaction
SingleCompaction: add support for L2
MinorCompaction: add support for L2
ClusteringCompaction(MajorCompaction): L1+L2 -> L2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
But since there is a L0 and L1 segment, does it make more sense to have L2 segment and thus L2 compaction?
Clustering compaction looks clearer for me, but definitely not major compaction.
Major compaction usaully means merge all segments/shards into one
Signed-off-by: wayblink <[email protected]>
|
Signed-off-by: wayblink <[email protected]>
Signed-off-by: wayblink <[email protected]>
GetRemoteCentroidsObjectPrefix() const { | ||
return rcm_->GetRootPath() + "/files" + std::string(ANALYZE_ROOT_PATH) + | ||
"/" + std::to_string(index_meta_.build_id) + "/" + | ||
std::to_string(index_meta_.index_version) + "/" + |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it's not a good idea to put index_version and buildID before collectionID.
much better to put collectionID at front so we get all collection info in one S3 subdir. Any thing block us from doing this?
throw SegcoreError(FileOpenFailed, err_msg.str()); | ||
} | ||
auto fileName = GetFileName(file); | ||
auto fileSize = local_chunk_manager->Size(file); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
there is no need to do a exist then size.
Size should return error if file not exist.
|
||
auto parallel_degree = 16; | ||
|
||
if (batch_remote_files.size() >= parallel_degree) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You don't really need to control parallel_degree here, Simply submit all task one by one and AddBatchCompactionResultFiles could handle that.
std::unordered_map<std::string, int64_t>& map) { | ||
auto local_chunk_manager = | ||
LocalChunkManagerSingleton::GetInstance().GetChunkManager(); | ||
auto& pool = ThreadPools::GetThreadPool(milvus::ThreadPoolPriority::HIGH); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think it's a good idea to read everything then write.
Why not simply use high priority pool to read the file out then write back to remote?
It's gonna to be easy to control memory (Fully based on thread pool worker numbers)
BTW, should you use milvus::ThreadPoolPriority::HIGH? or other threadpool? becasue I saw PutCompactionResultData use thread pool MIDDLE
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This could also trigger a deadlock here. If I'm correct it's always middle pool trigger task for HIGH priority thread pool but not vice versa.
namespace milvus::indexbuilder { | ||
|
||
template <typename T> | ||
KmeansMajorCompaction<T>::KmeansMajorCompaction( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should not be name as Major compaction.
This is indead KMeansAnalysis.
Compaction is happened on Milvus and has nothing to do with index
train_num = data_num; | ||
} | ||
auto train_size_new = train_num * dim * sizeof(T); | ||
auto buf = Sample(data_files, offsets, train_size_new, data_size); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
need a log for sample time
res.what())); | ||
} | ||
dataset.reset(); // release train data | ||
auto centroids = reinterpret_cast<const T*>(res.value()->GetTensor()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Move the rest of the function to another function
result_files_.emplace_back(centroid_stats_path); | ||
WritePBFile(stats, centroid_stats_path); | ||
|
||
auto compute_num_in_centroid = [&](const uint32_t* centroid_id_mapping, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
all the below should be another function
std::vector<std::string> data_files; | ||
std::vector<uint64_t> offsets; | ||
uint32_t dim = 0; | ||
auto data_size = file_manager_->CacheCompactionRawDataToDisk( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
when did cached file cleaned?
We need to check everywhere about the cache file. It should be cleaned if the analysis cleaned or failed
it != insert_files.value().end(); | ||
it++) { | ||
gather_segment_id.emplace_back(it->first); | ||
gather_size += offsets[i]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is there a special reason this has to be grouped?
how large WritePBFile could be? I'm assuming we can write everything into one file.
If stats is less than 10GB, we can parallelly read all the files and concurrently write into a same stats , and finally writePBFile to psersistent
CompactionStagePath = `compaction_stage` | ||
|
||
// AnalyzeStatsPath storage path const for analyze. | ||
AnalyzeStatsPath = `filesanalyze_stats` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is not same as cpp has
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
seems there are many other places share this path.
|
||
func NewScalarFieldValue(dtype schemapb.DataType, data interface{}) ScalarFieldValue { | ||
switch dtype { | ||
case schemapb.DataType_Int8: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what happened to boolean?
} | ||
ats.updateTaskState(taskID, taskInProgress) | ||
case taskRetry: | ||
if !ats.dropIndexTask(taskID, t.NodeID) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what is differnece bewteen analysisTask and indexTask? can we simply use one scheduler?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think wise to use a new Concept Job. Index is a job, analysis is another job.
The scheduler works ob job but don't need to worry about what job it is.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
current implementation is a weird combination with index and analysis task
configs/milvus.yaml
Outdated
@@ -435,6 +435,22 @@ dataCoord: | |||
maxParallelTaskNum: 10 # max parallel compaction task number | |||
indexBasedCompaction: true | |||
|
|||
major: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
But since there is a L0 and L1 segment, does it make more sense to have L2 segment and thus L2 compaction?
Clustering compaction looks clearer for me, but definitely not major compaction.
Major compaction usaully means merge all segments/shards into one
internal/datacoord/compaction.go
Outdated
@@ -516,6 +510,50 @@ func (c *compactionPlanHandler) handleMergeCompactionResult(plan *datapb.Compact | |||
return nil | |||
} | |||
|
|||
func (c *compactionPlanHandler) handleMajorCompactionResult(plan *datapb.CompactionPlan, result *datapb.CompactionPlanResult) error { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what is the difference between handleMajorCompactionResult && handleMajorCompactionResult?
@@ -289,6 +289,18 @@ func (s *Server) GetMetrics(ctx context.Context, request *milvuspb.GetMetricsReq | |||
return s.indexnode.GetMetrics(ctx, request) | |||
} | |||
|
|||
func (s *Server) Analysis(ctx context.Context, request *indexpb.AnalysisRequest) (*commonpb.Status, error) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
use CreateJob and it should support both AnalysisRequest and IndexRequest, something like
message CreateJobRequestV2 {
AnalysisRequest
IndexRequest
}
"github.com/milvus-io/milvus/pkg/common" | ||
"github.com/milvus-io/milvus/pkg/log" | ||
"github.com/milvus-io/milvus/pkg/util/distance" | ||
"github.com/milvus-io/milvus/pkg/util/funcutil" | ||
"github.com/milvus-io/milvus/pkg/util/merr" | ||
"github.com/milvus-io/milvus/pkg/util/typeutil" | ||
) | ||
|
||
const defaultFilterRatio float64 = 0.5 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
need monitering metrics about pruned ratio here.
@@ -152,6 +164,7 @@ func FilterSegmentsByVector(partitionStats *storage.PartitionStatsSnapshot, | |||
} | |||
// currently, we only support float vector and only one center one segment | |||
if disErr != nil { | |||
log.Error("calculate distance error", zap.Error(disErr)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Below this line
switch searchReq.GetMetricType() {
case distance.L2:
sort.SliceStable(segmentsToSearch, func(i, j int) bool {
return segmentsToSearch[i].distance < segmentsToSearch[j].distance
})
case distance.IP, distance.COSINE:
sort.SliceStable(segmentsToSearch, func(i, j int) bool {
return segmentsToSearch[i].distance > segmentsToSearch[j].distance
})
}
what if search request don't have metric type?
"github.com/milvus-io/milvus/pkg/common" | ||
"github.com/milvus-io/milvus/pkg/log" | ||
"github.com/milvus-io/milvus/pkg/util/distance" | ||
"github.com/milvus-io/milvus/pkg/util/funcutil" | ||
"github.com/milvus-io/milvus/pkg/util/merr" | ||
"github.com/milvus-io/milvus/pkg/util/typeutil" | ||
) | ||
|
||
const defaultFilterRatio float64 = 0.5 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
filter ratio might not be good enough, we need a lookup table here.
If segment <= 16 , do not filtering
[17, 32], segment * 0.5
[33, 256], 16 + (segment - 32) * 0.2
[256, 1024], 60 + (segment - 256) * 0.05
[1024, more], 98 + (segment - 1024) * 0.01
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
and we should make sure this is tunable
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
need to test recall on multiple dataset as well
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ideally we expect segment size to be 100+
auto local_chunk_manager = | ||
storage::LocalChunkManagerSingleton::GetInstance().GetChunkManager(); | ||
// train data fits in memory, read by sequence and generate centroids and id_mapping in one pass | ||
if (train_size >= total_size) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggest moving the code that reads data into buffer to another method.
if constexpr (!std::is_same_v<T, float>) { | ||
PanicInfo( | ||
ErrorCode::UnexpectedError, | ||
fmt::format("kmeans major compaction only supports float32 now")); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
shall we add the current type to error message?
auto insert_files = milvus::index::GetValueFromConfig< | ||
std::map<int64_t, std::vector<std::string>>>(config_, "insert_files"); | ||
AssertInfo(insert_files.has_value(), | ||
"insert file paths is empty when major compaction"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
clustering instead of all major compaction concepts on segcore layer.
std::string id_mapping_path = | ||
output_path + std::to_string(gather_segment_id[j]); | ||
result_files_.emplace_back(id_mapping_path); | ||
WritePBFile(stats, id_mapping_path); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there any guarantee to clean generated files when occurs some errors?
auto& config = analysis_info->config; | ||
config["insert_files"] = analysis_info->insert_files; | ||
config["segment_size"] = analysis_info->segment_size; | ||
config["train_size"] = analysis_info->train_size; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
add a log for each configuration of analysis
} | ||
|
||
func (kc *Catalog) SaveAnalysisTask(ctx context.Context, task *model.AnalysisTask) error { | ||
key := buildAnalysisTaskKey(task.TaskID) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggest adding d bid and collection id into the key which scan keys is easier in multiple db and collections scene
we can not assume we can use local disk for caching(Currently I thought It should be more like pure memory + remote storage mode). All of the IOs need to be done through chunkManager. and We should carefully design the cleanup path |
Signed-off-by: wayblink <[email protected]>
Signed-off-by: wayblink <[email protected]>
Signed-off-by: wayblink <[email protected]>
Signed-off-by: wayblink <[email protected]>
Signed-off-by: wayblink <[email protected]>
Signed-off-by: wayblink <[email protected]>
Signed-off-by: wayblink <[email protected]>
@@ -109,6 +111,37 @@ class IndexFactory { | |||
throw std::invalid_argument(invalid_dtype_msg); | |||
} | |||
} | |||
|
|||
MajorCompactionBasePtr | |||
CreateCompactionJob(DataType type, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- It is weird to create a clustering job in an index factory.
- This factory itself is a bad design legacy, which is an only a collection of function instead of object.
- For now we don't have to have a creator/factory for
jobs
, and we can simply make a function in an unnamed namespace inanalysis_c.cpp
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it is OK to create a new folder for Clustering Job
} | ||
|
||
CStatus | ||
AppendAnalysisFieldMetaInfo(CAnalysisInfo c_analysis_info, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just curios, why we need these bunch of appending API? Did we analyze the cost of CGo call? Some potential alternative solutions:
- Just pass the params through the CGO function call.
- If we need more flexibility, can Json help on this?
auto& config = analysis_info->config; | ||
config["insert_files"] = analysis_info->insert_files; | ||
config["segment_size"] = analysis_info->segment_size; | ||
config["train_size"] = analysis_info->train_size; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why we need to have an empty JSON in the c_analysis_info
Object and fill it with other fields of this object?
@@ -64,6 +64,12 @@ class DiskFileManagerImpl : public FileManagerImpl { | |||
std::string | |||
GetLocalRawDataObjectPrefix(); | |||
|
|||
std::string |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
FileManager
's API is from Knowhere, its target is helping Knowhere manipulate files stored in Milvus' storage. We should not add any API more than that
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like so many misusing here, including Tantivy's support
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For all Disk interactions of this clustering work, let's move it to a clustering io util file
@@ -435,6 +435,23 @@ dataCoord: | |||
maxParallelTaskNum: 10 # max parallel compaction task number | |||
indexBasedCompaction: true | |||
|
|||
clustering: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
need to talk about the configuration
Train() override; | ||
|
||
BinarySet | ||
Upload() override; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why we need to separate these two parts?
Also Train
& Upload
are not suitable APIs for a Job
, a Job
can only do run.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Two many disk operations without error handling, destruction mixed with clustering job logic. Let's create a new disk util file to handle all these
err_msg << "Error: write local file '" << file_path << " failed, " | ||
<< strerror(errno); | ||
throw SegcoreError(FileWriteFailed, err_msg.str()); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Need to close the stream
b1ce6ac
to
edc71bd
Compare
Signed-off-by: wayblink <[email protected]> Signed-off-by: Cai Zhang <[email protected]> Signed-off-by: chasingegg <[email protected]> Co-authored-by: chasingegg <[email protected]>
Signed-off-by: wayblink <[email protected]> Signed-off-by: Cai Zhang <[email protected]> Signed-off-by: chasingegg <[email protected]> Co-authored-by: chasingegg <[email protected]>
Signed-off-by: wayblink <[email protected]> Signed-off-by: Cai Zhang <[email protected]> Signed-off-by: chasingegg <[email protected]> Co-authored-by: chasingegg <[email protected]>
Signed-off-by: chyezh <[email protected]> Add metric for lru and fix lost delete data when enable lazy load (milvus-io#31868) Signed-off-by: chyezh <[email protected]> feat: Support stream reduce v1 (milvus-io#31873) related: milvus-io#31410 --------- Signed-off-by: MrPresent-Han <[email protected]> Change do wait lru dev (milvus-io#31878) Signed-off-by: sunby <[email protected]> enhance: add config for disk cache (milvus-io#31881) fix config not initialized (milvus-io#31890) Signed-off-by: sunby <[email protected]> fix error handle in search (milvus-io#31895) Signed-off-by: sunby <[email protected]> fix: thread safe vector (milvus-io#31898) fix: insert record cannot reinsert (milvus-io#31900) enhance: cancel concurrency restrict for stream reduce and add metrics (milvus-io#31892) Signed-off-by: MrPresent-Han <[email protected]> fix: bit set (milvus-io#31905) fix bitset clear to reset (milvus-io#31908) Signed-off-by: MrPresent-Han <[email protected]> Fix 0404 lru dev (milvus-io#31914) fix: 1. sealed_segment num_rows reset to std::null opt 2. sealed_segment lazy_load reset to true after evicting to avoid shortcut --------- Signed-off-by: MrPresent-Han <[email protected]> fix possible block due to unpin fifo activating principle (milvus-io#31924) Signed-off-by: MrPresent-Han <[email protected]> Add lru reloader lru dev (milvus-io#31952) Signed-off-by: sunby <[email protected]> fix query limit (milvus-io#32060) Signed-off-by: sunby <[email protected]> fix: lru cache lost delete and wrong mem size (milvus-io#32072) issue: milvus-io#30361 Signed-off-by: chyezh <[email protected]> enhance: add more metrics for cache and search (milvus-io#31777) (milvus-io#32097) issue: milvus-io#30931 Signed-off-by: chyezh <[email protected]> fix:panic due to empty search result when stream reducing(milvus-io#32009) (milvus-io#32083) related: milvus-io#32009 Signed-off-by: MrPresent-Han <[email protected]> fix: sealed segment may not exist when throw (milvus-io#32098) issue: milvus-io#30361 Signed-off-by: chyezh <[email protected]> Major compaction 1st edition (milvus-io#31804) (milvus-io#32116) Signed-off-by: wayblink <[email protected]> Signed-off-by: Cai Zhang <[email protected]> Signed-off-by: chasingegg <[email protected]> Co-authored-by: chasingegg <[email protected]> fix: inconsistent between state lock and load state (milvus-io#32171) issue: milvus-io#30361 Signed-off-by: chyezh <[email protected]> enhance: Throw error instead of crash when index cannot be built (milvus-io#31844) issue: milvus-io#27589 --------- Signed-off-by: Cai Zhang <[email protected]> (cherry picked from commit 1b76766) Signed-off-by: jaime <[email protected]> update knowhere to support clustering (milvus-io#32188) Signed-off-by: chasingegg <[email protected]> fix: segment release is not sync with cache (milvus-io#32212) issue: milvus-io#32206 Signed-off-by: chyezh <[email protected]> fix: incorrect pinCount resulting unexpected eviction(milvus-io#32136) (milvus-io#32238) related: milvus-io#32136 Signed-off-by: MrPresent-Han <[email protected]> fix: possible panic when stream reducing (milvus-io#32247) related: milvus-io#32009 Signed-off-by: MrPresent-Han <[email protected]> enhance: [lru-dev] add the related data size for the read apis (milvus-io#32274) cherry-pick: milvus-io#31816 --------- Signed-off-by: SimFG <[email protected]> add debug log (milvus-io#32303) Signed-off-by: Cai Zhang <[email protected]> Refine code for analyze task scheduler (milvus-io#32122) Signed-off-by: Cai Zhang <[email protected]> fix: memory leak on stream reduce (milvus-io#32345) related: milvus-io#32304 Signed-off-by: MrPresent-Han <[email protected]> feat: adding cache stats support (milvus-io#32344) See milvus-io#32067 Signed-off-by: Ted Xu <[email protected]> Fix bug for version (milvus-io#32363) Signed-off-by: Cai Zhang <[email protected]> fix: remove sub entity in load delta log, update entity num in segment itself (milvus-io#32350) issue: milvus-io#30361 Signed-off-by: chyezh <[email protected]> fix: clear data when loading failure (milvus-io#32370) issue: milvus-io#30361 Signed-off-by: chyezh <[email protected]> fix: stream reduce memory leak for failing to release stream reducer(milvus-io#32345) (milvus-io#32381) related: milvus-io#32345 Signed-off-by: MrPresent-Han <[email protected]> Keep InProgress state when getting task state is init (milvus-io#32394) Signed-off-by: Cai Zhang <[email protected]> add log for search failed (milvus-io#32367) related: milvus-io#32136 Signed-off-by: MrPresent-Han <[email protected]> enable asan by default (milvus-io#32423) Signed-off-by: sunby <[email protected]> Major compaction refactoring (milvus-io#32149) Signed-off-by: wayblink <[email protected]> Lru dev debug (milvus-io#32414) Co-authored-by: wayblink <[email protected]> fix: protect loadInfo with atomic, remove rlock at cache to avoid dead lock (milvus-io#32436) issue: milvus-io#32435 Signed-off-by: chyezh <[email protected]> fix: use Get but not GetBy of SegmentManager (milvus-io#32438) issue: milvus-io#32435 Signed-off-by: chyezh <[email protected]> fix: return growing segment when sealed (milvus-io#32460) issue: milvus-io#32435 Signed-off-by: chyezh <[email protected]> enhance: add request resource for lru loading process(milvus-io#32205) (milvus-io#32452) related: milvus-io#32205 Signed-off-by: MrPresent-Han <[email protected]> fix: unexpected deleted index files when lazy loading(milvus-io#32136) (milvus-io#32469) related: milvus-io#32136 Signed-off-by: MrPresent-Han <[email protected]> fix: reference count leak cause release blocked (milvus-io#32465) issue: milvus-io#32379 Signed-off-by: chyezh <[email protected]> Fix compaction fail (milvus-io#32473) Signed-off-by: wayblink <[email protected]>
Signed-off-by: wayblink <[email protected]> Signed-off-by: Cai Zhang <[email protected]> Signed-off-by: chasingegg <[email protected]> Co-authored-by: chasingegg <[email protected]>
Signed-off-by: wayblink <[email protected]> Signed-off-by: Cai Zhang <[email protected]> Signed-off-by: chasingegg <[email protected]> Co-authored-by: chasingegg <[email protected]>
No description provided.