mirror of
https://gitee.com/milvus-io/milvus.git
synced 2026-02-02 01:06:41 +08:00
* refactor LogMgr (#3372) Signed-off-by: Wang Xiangyu <xy.wang@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * add wal unittest (#3367) * add wal unittest Signed-off-by: groot <yihua.mo@zilliz.com> * fix test fail Signed-off-by: groot <yihua.mo@zilliz.com> * Find system headers with cmake and clang-tidy (#3364) Signed-off-by: quicksilver <zhifeng.zhang@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * [skip ci]add google/crc32c into NOTICE.md (#3373) Signed-off-by: Wang Xiangyu <xy.wang@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * prepare change memmanager for wal Signed-off-by: groot <yihua.mo@zilliz.com> * [skip ci]update issue template (#3379) Signed-off-by: Wang Xiangyu <xy.wang@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * fix wal test case Signed-off-by: groot <yihua.mo@zilliz.com> * [skip ci] fix java sdk test case (#3375) * java main class Signed-off-by: zongyufen <zongyufen@foxmail.com> * [skip ci] fix java sdk test Signed-off-by: zongyufen <zongyufen@foxmail.com> * [skip ci] fix java sdk test Signed-off-by: zongyufen <zongyufen@foxmail.com> Signed-off-by: groot <yihua.mo@zilliz.com> * optimize download & compile of sqlite (#3361) * optimize sqlite Signed-off-by: yangxuan <xuan.yang@zilliz.com> * rm sqlite url Signed-off-by: yangxuan <xuan.yang@zilliz.com> * fix bug Signed-off-by: yangxuan <xuan.yang@zilliz.com> Co-authored-by: yangxuan <xuan.yang@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * [skip ci] rm log (#3378) Signed-off-by: shengjun.li <shengjun.li@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * [skip ci] fix generate default entities (#3382) * java main class Signed-off-by: zongyufen <zongyufen@foxmail.com> * [skip ci] fix java sdk test Signed-off-by: zongyufen <zongyufen@foxmail.com> * [skip ci] fix java sdk test Signed-off-by: zongyufen <zongyufen@foxmail.com> * [skip ci] fix generate default entities Signed-off-by: zongyufen <zongyufen@foxmail.com> Signed-off-by: groot <yihua.mo@zilliz.com> * Skip flat search params (#3381) * assert top ids Signed-off-by: zw <zw@milvus.io> * update milvus-helm to 0.11.0 Signed-off-by: zw <zw@milvus.io> Co-authored-by: zw <zw@milvus.io> Signed-off-by: groot <yihua.mo@zilliz.com> * [skip ci] update clang-tidy rules (#3386) * [skip ci] update clang-tidy rules Signed-off-by: yudong.cai <yudong.cai@zilliz.com> * [skip ci] update clang-tidy rules Signed-off-by: yudong.cai <yudong.cai@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * Optimize download & compile of Aws (#3384) * runable aws Signed-off-by: yangxuan <xuan.yang@zilliz.com> * optimize aws Signed-off-by: yangxuan <xuan.yang@zilliz.com> Co-authored-by: yangxuan <xuan.yang@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * [skip ci] modify test flush and compact (#3390) * java main class Signed-off-by: zongyufen <zongyufen@foxmail.com> * [skip ci] fix java sdk test Signed-off-by: zongyufen <zongyufen@foxmail.com> * [skip ci] fix java sdk test Signed-off-by: zongyufen <zongyufen@foxmail.com> * [skip ci] fix generate default entities Signed-off-by: zongyufen <zongyufen@foxmail.com> * [skip ci] modify test flush Signed-off-by: zongyufen <zongyufen@foxmail.com> * [skip ci] modify test compact Signed-off-by: zongyufen <zongyufen@foxmail.com> Signed-off-by: groot <yihua.mo@zilliz.com> * rewrite insert memmanager Signed-off-by: groot <yihua.mo@zilliz.com> * Optimize thirdparty download workflow (#3394) * Optimize thirdparty download workflow Signed-off-by: quicksilver <zhifeng.zhang@zilliz.com> * Optimize thirdparty download workflow Signed-off-by: quicksilver <zhifeng.zhang@zilliz.com> * Optimize thirdparty download workflow Signed-off-by: quicksilver <zhifeng.zhang@zilliz.com> * Optimize thirdparty download workflow Signed-off-by: quicksilver <zhifeng.zhang@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * Enlarge event queue (#3393) Signed-off-by: yinghao.zou <yinghao.zou@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * Add GetPageEntity unittest (#3397) * Add web server interface Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Add unittest/server Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Add web server ut Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Fix web server insert bug Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Fix web server ut crash bug Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Fix web server ut gpu compile error Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Fix codacy quality Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Fix row_num error Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Change row insert to column insert Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Fix dsl issue Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Fix GetEntityByID bug Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Add GetPageEntity interface Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Fix some webserver bugs Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Remove server_config.yaml Signed-off-by: fishpenguin <kun.yu@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * Fix thirdparty not find ccache but still use it (#3398) * fix sqlite ccache Signed-off-by: yangxuan <xuan.yang@zilliz.com> * thirdparty EP using ccache configure Signed-off-by: yangxuan <xuan.yang@zilliz.com> Co-authored-by: yangxuan <xuan.yang@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * optimize oatpp (#3377) * optimize oatpp Signed-off-by: yangxuan <xuan.yang@zilliz.com> * fix some bug Signed-off-by: yangxuan <xuan.yang@zilliz.com> * fit atomic not find bug Signed-off-by: yangxuan <xuan.yang@zilliz.com> * add one config fo oatpp Signed-off-by: yangxuan <xuan.yang@zilliz.com> * change oatpp version Signed-off-by: yangxuan <xuan.yang@zilliz.com> * comment url_md5 Signed-off-by: yangxuan <xuan.yang@zilliz.com> * change oatpp version Signed-off-by: yangxuan <xuan.yang@zilliz.com> * change aws target name Signed-off-by: yangxuan <xuan.yang@zilliz.com> Co-authored-by: yangxuan <xuan.yang@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * Split Ftype into Ftype and FEtype (#3341) * fix include directories not find bug (#3323) Signed-off-by: yangxuan <xuan.yang@zilliz.com> Co-authored-by: yangxuan <xuan.yang@zilliz.com> Signed-off-by: fluorinedog <fluorinedog@gmail.com> * reduce grpc download file size from 380M to 130M (#3326) * reduce grpc download file size from 380M to 130M Signed-off-by: yangxuan <xuan.yang@zilliz.com> * fix bug Signed-off-by: yangxuan <xuan.yang@zilliz.com> Co-authored-by: yangxuan <xuan.yang@zilliz.com> Signed-off-by: fluorinedog <fluorinedog@gmail.com> * update clang-tidy config (#3314) * update clang-tidy config Signed-off-by: yudong.cai <yudong.cai@zilliz.com> * update .clang-tidy Signed-off-by: yudong.cai <yudong.cai@zilliz.com> * update clang-tidy config Signed-off-by: yudong.cai <yudong.cai@zilliz.com> * update clang-tidy HeaderFilterRegex Signed-off-by: yudong.cai <yudong.cai@zilliz.com> Signed-off-by: fluorinedog <fluorinedog@gmail.com> * enable fetype Signed-off-by: fluorinedog <fluorinedog@gmail.com> * rename field_element_method Signed-off-by: fluorinedog <fluorinedog@gmail.com> * add FETYPE_TYPE Signed-off-by: fluorinedog <fluorinedog@gmail.com> * Add WebServer unittest (#3321) * Add web server interface Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Add unittest/server Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Add web server ut Signed-off-by: fishpenguin <kun.yu@zilliz.com> Signed-off-by: fluorinedog <fluorinedog@gmail.com> * modify db schema and remove conversion Signed-off-by: fluorinedog <fluorinedog@gmail.com> * weak fetype Signed-off-by: fluorinedog <fluorinedog@gmail.com> * enforce strong fetype Signed-off-by: fluorinedog <fluorinedog@gmail.com> * lint Signed-off-by: fluorinedog <fluorinedog@gmail.com> * format code Signed-off-by: fluorinedog <fluorinedog@gmail.com> * [skip ci] fix Signed-off-by: fluorinedog <fluorinedog@gmail.com> Co-authored-by: XuanYang-cn <51370125+XuanYang-cn@users.noreply.github.com> Co-authored-by: yangxuan <xuan.yang@zilliz.com> Co-authored-by: Cai Yudong <yudong.cai@zilliz.com> Co-authored-by: yukun <kun.yu@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * Master codacy check (#3366) * codacy fix Signed-off-by: cqy <yaya645@126.com> * codacy Signed-off-by: cqy <yaya645@126.com> * codacy Signed-off-by: cqy <yaya645@126.com> * codacy check Signed-off-by: cqy <yaya645@126.com> * codacy Signed-off-by: cqy <yaya645@126.com> * codacy Signed-off-by: cqy <yaya645@126.com> * codacy Signed-off-by: cqy <yaya645@126.com> * clang-tiny Signed-off-by: cqy <yaya645@126.com> * clang-tidy check Signed-off-by: cqy <yaya645@126.com> * clang-tindy check Signed-off-by: cqy <yaya645@126.com> * clang-tidy check Signed-off-by: cqy <yaya645@126.com> * clang-tidy Signed-off-by: cqy <yaya645@126.com> * clang-tidy check Signed-off-by: cqy <yaya645@126.com> * clang-tidy check Signed-off-by: cqy <yaya645@126.com> * clang-tidy check Signed-off-by: cqy <yaya645@126.com> * clang-tidy check Signed-off-by: cqy <yaya645@126.com> Co-authored-by: Cai Yudong <yudong.cai@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * [skip ci] add constants.java (#3404) Signed-off-by: zw <zw@milvus.io> Co-authored-by: zw <zw@milvus.io> Signed-off-by: groot <yihua.mo@zilliz.com> * fix dsl term with multi fields (#3403) Signed-off-by: zongyufen <zongyufen@foxmail.com> Signed-off-by: groot <yihua.mo@zilliz.com> * [skip ci] comment unused insert case (#3405) Signed-off-by: yinghao.zou <yinghao.zou@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * enable clang-tidy check (#3396) * enable clang-tidy check Signed-off-by: yudong.cai <yudong.cai@zilliz.com> * update run_clang_tidy.py Signed-off-by: yudong.cai <yudong.cai@zilliz.com> * enable clang-tidy check Signed-off-by: yudong.cai <yudong.cai@zilliz.com> * update run_clang_tidy.py Signed-off-by: yudong.cai <yudong.cai@zilliz.com> * update run_clang_tidy.py Signed-off-by: yudong.cai <yudong.cai@zilliz.com> * update run_clang_tidy.py Signed-off-by: yudong.cai <yudong.cai@zilliz.com> * remove rule modernize-use-equals-default Signed-off-by: yudong.cai <yudong.cai@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * fix the bugs of delete all and compact (#3395) * fix the bugs of delete all and compact Signed-off-by: godchen0212 <qingxiang.chen@zilliz.com> * fix the wrong usages in unittest Signed-off-by: godchen0212 <qingxiang.chen@zilliz.com> * fix the bug of insert makes no effect Signed-off-by: godchen0212 <qingxiang.chen@zilliz.com> * add character check in ExtraFileInfo and change the const size and type Signed-off-by: godchen0212 <qingxiang.chen@zilliz.com> * format code Signed-off-by: godchen0212 <qingxiang.chen@zilliz.com> * fix wrong test case Signed-off-by: godchen0212 <qingxiang.chen@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * Fix TestSearchDSL multi fields bug (#3411) Signed-off-by: fishpenguin <kun.yu@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * Optimize fiu and finish thirdparty optimization (#3412) * fiu runable Signed-off-by: yangxuan <xuan.yang@zilliz.com> * runable riu Signed-off-by: yangxuan <xuan.yang@zilliz.com> * optimize fiu and rm ThirdPartyPackages.cmake Signed-off-by: yangxuan <xuan.yang@zilliz.com> * fix bug Signed-off-by: yangxuan <xuan.yang@zilliz.com> * fix test using fiu Signed-off-by: yangxuan <xuan.yang@zilliz.com> Co-authored-by: yangxuan <xuan.yang@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * [skip ci] Java sdk test: add testIndex.java (#3409) * [skip ci] add constants.java Signed-off-by: zw <zw@milvus.io> * [skip ci] add testIndex.java Signed-off-by: zw <zw@milvus.io> * [skip ci] add TestDeleteEntities.java Signed-off-by: zw <zw@milvus.io> Co-authored-by: zw <zw@milvus.io> Signed-off-by: groot <yihua.mo@zilliz.com> * [skip ci] Test get entity by id (#3417) * [skip ci] update for Contasts Signed-off-by: zongyufen <zongyufen@foxmail.com> * [skip ci] test get entity by id Signed-off-by: zongyufen <zongyufen@foxmail.com> * [skip ci] test get entity by id Signed-off-by: zongyufen <zongyufen@foxmail.com> Signed-off-by: groot <yihua.mo@zilliz.com> * update clang-tidy rules (#3416) Signed-off-by: yudong.cai <yudong.cai@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * fix unittest failed Signed-off-by: groot <yihua.mo@zilliz.com> * remove the _id fileld when get collection info (#3414) * fix the bug of issue #3336 Signed-off-by: godchen0212 <qingxiang.chen@zilliz.com> * fix wrong test case Signed-off-by: godchen0212 <qingxiang.chen@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * rewrite insert machinery Signed-off-by: groot <yihua.mo@zilliz.com> * insert fields validation Signed-off-by: groot <yihua.mo@zilliz.com> * code format Signed-off-by: groot <yihua.mo@zilliz.com> * Milvus build stage parallel processing (#3423) * Milvus build stage parallel processing Signed-off-by: quicksilver <zhifeng.zhang@zilliz.com> * Milvus build stage parallel processing Signed-off-by: quicksilver <zhifeng.zhang@zilliz.com> * Milvus build stage parallel processing Signed-off-by: quicksilver <zhifeng.zhang@zilliz.com> * Milvus build stage parallel processing Signed-off-by: quicksilver <zhifeng.zhang@zilliz.com> * Milvus build stage parallel processing Signed-off-by: quicksilver <zhifeng.zhang@zilliz.com> * Milvus build stage parallel processing Signed-off-by: quicksilver <zhifeng.zhang@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * avoid build hang Signed-off-by: groot <yihua.mo@zilliz.com> * fix faiss cannot build gpu bug (#3424) Signed-off-by: yangxuan <xuan.yang@zilliz.com> Co-authored-by: yangxuan <xuan.yang@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * wal path Signed-off-by: groot <yihua.mo@zilliz.com> * typo Signed-off-by: groot <yihua.mo@zilliz.com> * [skip ci] add TestSearchEntities.java (#3433) * [skip ci] add constants.java Signed-off-by: zw <zw@milvus.io> * [skip ci] add testIndex.java Signed-off-by: zw <zw@milvus.io> * [skip ci] add TestDeleteEntities.java Signed-off-by: zw <zw@milvus.io> * update TestSearchEntities.java Signed-off-by: zw <zw@milvus.io> * [skip ci] add TestSearchEntities.java Signed-off-by: zw <zw@milvus.io> Co-authored-by: zw <zw@milvus.io> Signed-off-by: groot <yihua.mo@zilliz.com> * #3265 fix memory leak (#3413) * #3265 fix memory leak Signed-off-by: Wang Xiangyu <xy.wang@zilliz.com> * fix clang-format Signed-off-by: Wang Xiangyu <xy.wang@zilliz.com> * update Signed-off-by: Wang Xiangyu <xy.wang@zilliz.com> * comment some change Signed-off-by: Wang Xiangyu <xy.wang@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * Fix webserver set_config bug (#3425) * Fix TestSearchDSL multi fields bug Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Fix set_config bug Signed-off-by: fishpenguin <kun.yu@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * Update mergify Signed-off-by: jinhai <hai.jin@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * Fix Server get stuck if create index with invalide metric types after entities inserted (#3428) * add create index with invalid metric type case Signed-off-by: yangxuan <xuan.yang@zilliz.com> * fix bin index validation Signed-off-by: yangxuan <xuan.yang@zilliz.com> * change changelog Signed-off-by: yangxuan <xuan.yang@zilliz.com> Co-authored-by: yangxuan <xuan.yang@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * Add partition_tag in GetPageEntities (#3434) * Fix TestSearchDSL multi fields bug Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Fix set_config bug Signed-off-by: fishpenguin <kun.yu@zilliz.com> * Add partition_tag in GetPageEntities Signed-off-by: fishpenguin <kun.yu@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * Fix Server crashed during random test (#3436) Signed-off-by: yinghao.zou <yinghao.zou@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * Optimize clang-tidy workflow for code static analysis (#3432) * Optimize clang-tidy for code static analysis Signed-off-by: quicksilver <zhifeng.zhang@zilliz.com> * Optimize clang-tidy for code static analysis Signed-off-by: quicksilver <zhifeng.zhang@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * [skip ci] add assert by collection stats (#3437) Signed-off-by: zongyufen <zongyufen@foxmail.com> Signed-off-by: groot <yihua.mo@zilliz.com> * fix get entity by id bug Signed-off-by: groot <yihua.mo@zilliz.com> * typo Signed-off-by: groot <yihua.mo@zilliz.com> * fix wal bug Signed-off-by: groot <yihua.mo@zilliz.com> * [skip ci] upgrade master version to v0.11.0 (fix #3449) (#3450) Signed-off-by: yinghao.zou <yinghao.zou@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * fix a bug Signed-off-by: groot <yihua.mo@zilliz.com> * fix wal bug Signed-off-by: groot <yihua.mo@zilliz.com> * fix wal test bug Signed-off-by: groot <yihua.mo@zilliz.com> * fix the data type of crc32c (#3455) Signed-off-by: godchen0212 <qingxiang.chen@zilliz.com> Signed-off-by: groot <yihua.mo@zilliz.com> * fix wal path bug Signed-off-by: groot <yihua.mo@zilliz.com> * Update version (#3454) * [skip ci] add constants.java Signed-off-by: zw <zw@milvus.io> * [skip ci] update server version to 0.11.0 in test cases Signed-off-by: zw <zw@milvus.io> Co-authored-by: zw <zw@milvus.io> Signed-off-by: groot <yihua.mo@zilliz.com> * fix: shards/requirements.txt to reduce vulnerabilities (#3457) The following vulnerabilities are fixed by pinning transitive dependencies: - https://snyk.io/vuln/SNYK-PYTHON-SQLALCHEMY-590109 Signed-off-by: groot <yihua.mo@zilliz.com> * fix test failure Signed-off-by: groot <yihua.mo@zilliz.com> * typo Signed-off-by: groot <yihua.mo@zilliz.com> Co-authored-by: Wang Xiangyu <xy.wang@zilliz.com> Co-authored-by: quicksilver <zhifeng.zhang@zilliz.com> Co-authored-by: ThreadDao <zongyufen@foxmail.com> Co-authored-by: XuanYang-cn <51370125+XuanYang-cn@users.noreply.github.com> Co-authored-by: yangxuan <xuan.yang@zilliz.com> Co-authored-by: shengjun.li <shengjun.li@zilliz.com> Co-authored-by: del-zhenwu <56623710+del-zhenwu@users.noreply.github.com> Co-authored-by: zw <zw@milvus.io> Co-authored-by: Cai Yudong <yudong.cai@zilliz.com> Co-authored-by: BossZou <40255591+BossZou@users.noreply.github.com> Co-authored-by: yukun <kun.yu@zilliz.com> Co-authored-by: FluorineDog <fluorinedog@gmail.com> Co-authored-by: cqy123456 <39671710+cqy123456@users.noreply.github.com> Co-authored-by: chen qingxiang <67679556+godchen0212@users.noreply.github.com> Co-authored-by: jinhai <hai.jin@zilliz.com> Co-authored-by: Snyk bot <snyk-bot@snyk.io>
496 lines
16 KiB
C++
496 lines
16 KiB
C++
// 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 <fiu-control.h>
|
|
#include <fiu/fiu-local.h>
|
|
#include <gtest/gtest.h>
|
|
|
|
#include <algorithm>
|
|
#include <set>
|
|
#include <string>
|
|
#include <experimental/filesystem>
|
|
|
|
#include "db/DBProxy.h"
|
|
#include "db/utils.h"
|
|
#include "db/wal/WalManager.h"
|
|
#include "db/wal/WalFile.h"
|
|
#include "db/wal/WalOperationCodec.h"
|
|
#include "db/wal/WalProxy.h"
|
|
|
|
namespace {
|
|
|
|
using DBProxy = milvus::engine::DBProxy;
|
|
using WalFile = milvus::engine::WalFile;
|
|
using WalManager = milvus::engine::WalManager;
|
|
using WalOperation = milvus::engine::WalOperation;
|
|
using WalOperationPtr = milvus::engine::WalOperationPtr;
|
|
using WalOperationType = milvus::engine::WalOperationType;
|
|
using WalOperationCodec = milvus::engine::WalOperationCodec;
|
|
using InsertEntityOperation = milvus::engine::InsertEntityOperation;
|
|
using InsertEntityOperationPtr = milvus::engine::InsertEntityOperationPtr;
|
|
using DeleteEntityOperation = milvus::engine::DeleteEntityOperation;
|
|
using DeleteEntityOperationPtr = milvus::engine::DeleteEntityOperationPtr;
|
|
using WalProxy = milvus::engine::WalProxy;
|
|
|
|
void CreateChunk(DataChunkPtr& chunk, int64_t row_count, int64_t& chunk_size) {
|
|
chunk = std::make_shared<DataChunk>();
|
|
chunk->count_ = row_count;
|
|
chunk_size = 0;
|
|
{
|
|
// int32 type field
|
|
std::string field_name = "f1";
|
|
auto bin = std::make_shared<BinaryData>();
|
|
bin->data_.resize(chunk->count_ * sizeof(int32_t));
|
|
int32_t* p = (int32_t*)(bin->data_.data());
|
|
for (int64_t i = 0; i < chunk->count_; ++i) {
|
|
p[i] = i;
|
|
}
|
|
chunk->fixed_fields_.insert(std::make_pair(field_name, bin));
|
|
chunk_size += chunk->count_ * sizeof(int32_t);
|
|
}
|
|
{
|
|
// vector type field
|
|
int64_t dimension = 128;
|
|
std::string field_name = "f2";
|
|
auto bin = std::make_shared<BinaryData>();
|
|
bin->data_.resize(chunk->count_ * sizeof(float) * dimension);
|
|
float* p = (float*)(bin->data_.data());
|
|
for (int64_t i = 0; i < chunk->count_; ++i) {
|
|
for (int64_t j = 0; j < dimension; ++j) {
|
|
p[i * dimension + j] = i * j / 100.0;
|
|
}
|
|
}
|
|
chunk->fixed_fields_.insert(std::make_pair(field_name, bin));
|
|
chunk_size += chunk->count_ * sizeof(float) * dimension;
|
|
}
|
|
}
|
|
|
|
class DummyDB : public DBProxy {
|
|
public:
|
|
DummyDB(const DBOptions& options)
|
|
: DBProxy(nullptr, options) {
|
|
}
|
|
|
|
Status
|
|
Insert(const std::string& collection_name,
|
|
const std::string& partition_name,
|
|
DataChunkPtr& data_chunk,
|
|
idx_t op_id) override {
|
|
insert_count_++;
|
|
WalManager::GetInstance().OperationDone(collection_name, op_id);
|
|
return Status::OK();
|
|
}
|
|
|
|
Status
|
|
DeleteEntityByID(const std::string& collection_name,
|
|
const IDNumbers& entity_ids,
|
|
idx_t op_id) override {
|
|
delete_count_++;
|
|
WalManager::GetInstance().OperationDone(collection_name, op_id);
|
|
return Status::OK();
|
|
}
|
|
|
|
int64_t InsertCount() const { return insert_count_; }
|
|
int64_t DeleteCount() const { return delete_count_; }
|
|
|
|
private:
|
|
int64_t insert_count_ = 0;
|
|
int64_t delete_count_ = 0;
|
|
};
|
|
|
|
using DummyDBPtr = std::shared_ptr<DummyDB>;
|
|
|
|
} // namespace
|
|
|
|
TEST_F(WalTest, WalFileTest) {
|
|
std::string path = "/tmp/milvus_wal/test_file";
|
|
idx_t last_id = 12345;
|
|
|
|
{
|
|
WalFile file;
|
|
ASSERT_FALSE(file.IsOpened());
|
|
ASSERT_EQ(file.Size(), 0);
|
|
|
|
int64_t k = 0;
|
|
int64_t bytes = file.Write<int64_t>(&k);
|
|
ASSERT_EQ(bytes, 0);
|
|
|
|
bytes = file.Read<int64_t>(&k);
|
|
ASSERT_EQ(bytes, 0);
|
|
|
|
auto status = file.CloseFile();
|
|
ASSERT_TRUE(status.ok());
|
|
}
|
|
|
|
{
|
|
WalFile file;
|
|
auto status = file.OpenFile(path, WalFile::APPEND_WRITE);
|
|
ASSERT_TRUE(status.ok());
|
|
ASSERT_TRUE(file.IsOpened());
|
|
|
|
int64_t max_size = milvus::engine::MAX_WAL_FILE_SIZE;
|
|
ASSERT_FALSE(file.ExceedMaxSize(max_size));
|
|
|
|
int64_t total_bytes = 0;
|
|
int8_t len = path.size();
|
|
int64_t bytes = file.Write<int8_t>(&len);
|
|
ASSERT_EQ(bytes, sizeof(int8_t));
|
|
total_bytes += bytes;
|
|
|
|
ASSERT_TRUE(file.ExceedMaxSize(max_size));
|
|
|
|
bytes = file.Write(path.data(), 0);
|
|
ASSERT_EQ(bytes, 0);
|
|
|
|
bytes = file.Write(path.data(), len);
|
|
ASSERT_EQ(bytes, len);
|
|
total_bytes += bytes;
|
|
|
|
bytes = file.Write<idx_t>(&last_id);
|
|
ASSERT_EQ(bytes, sizeof(last_id));
|
|
total_bytes += bytes;
|
|
|
|
int64_t file_size = file.Size();
|
|
ASSERT_EQ(total_bytes, file_size);
|
|
|
|
std::string file_path = file.Path();
|
|
ASSERT_EQ(file_path, path);
|
|
|
|
file.Flush();
|
|
file.CloseFile();
|
|
ASSERT_FALSE(file.IsOpened());
|
|
}
|
|
|
|
{
|
|
WalFile file;
|
|
auto status = file.OpenFile(path, WalFile::READ);
|
|
ASSERT_TRUE(status.ok());
|
|
|
|
int8_t len = 0;
|
|
int64_t bytes = file.Read<int8_t>(&len);
|
|
ASSERT_EQ(bytes, sizeof(int8_t));
|
|
|
|
std::string str;
|
|
bytes = file.ReadStr(str, 0);
|
|
ASSERT_EQ(bytes, 0);
|
|
|
|
bytes = file.ReadStr(str, len);
|
|
ASSERT_EQ(bytes, len);
|
|
ASSERT_EQ(str, path);
|
|
|
|
idx_t id_read = 0;
|
|
bytes = file.Read<int64_t>(&id_read);
|
|
ASSERT_EQ(bytes, sizeof(id_read));
|
|
ASSERT_EQ(id_read, last_id);
|
|
|
|
idx_t op_id = 0;
|
|
status = file.ReadLastOpId(op_id);
|
|
ASSERT_TRUE(status.ok());
|
|
ASSERT_EQ(op_id, last_id);
|
|
}
|
|
}
|
|
|
|
TEST_F(WalTest, WalFileCodecTest) {
|
|
std::string collection_name = "c1";
|
|
std::string partition_name = "p1";
|
|
std::string file_path = "/tmp/milvus_wal/test_file";
|
|
auto file = std::make_shared<WalFile>();
|
|
|
|
// record 100 operations
|
|
std::vector<WalOperationPtr> operations;
|
|
for (int64_t i = 1; i <= 100; ++i) {
|
|
if (i % 5 == 0) {
|
|
// delete operation
|
|
auto status = file->OpenFile(file_path, WalFile::APPEND_WRITE);
|
|
ASSERT_TRUE(status.ok());
|
|
|
|
auto pre_size = file->Size();
|
|
|
|
DeleteEntityOperationPtr operation = std::make_shared<DeleteEntityOperation>();
|
|
operation->collection_name_ = collection_name;
|
|
IDNumbers ids = {i + 1, i + 2, i + 3};
|
|
operation->entity_ids_ = ids;
|
|
idx_t op_id = i + 10000;
|
|
operation->SetID(op_id);
|
|
operations.emplace_back(operation);
|
|
|
|
status = WalOperationCodec::WriteDeleteOperation(file, ids, op_id);
|
|
ASSERT_TRUE(status.ok());
|
|
|
|
auto post_size = file->Size();
|
|
ASSERT_GE(post_size - pre_size, ids.size() * sizeof(idx_t));
|
|
|
|
file->CloseFile();
|
|
|
|
WalFile file_read;
|
|
file_read.OpenFile(file_path, WalFile::READ);
|
|
idx_t last_id = 0;
|
|
file_read.ReadLastOpId(last_id);
|
|
ASSERT_EQ(last_id, op_id);
|
|
} else {
|
|
// insert operation
|
|
auto status = file->OpenFile(file_path, WalFile::APPEND_WRITE);
|
|
ASSERT_TRUE(status.ok());
|
|
|
|
InsertEntityOperationPtr operation = std::make_shared<InsertEntityOperation>();
|
|
operation->collection_name_ = collection_name;
|
|
operation->partition_name = partition_name;
|
|
|
|
DataChunkPtr chunk;
|
|
int64_t chunk_size = 0;
|
|
CreateChunk(chunk, 100, chunk_size);
|
|
operation->data_chunk_ = chunk;
|
|
|
|
idx_t op_id = i + 10000;
|
|
operation->SetID(op_id);
|
|
operations.emplace_back(operation);
|
|
|
|
status = WalOperationCodec::WriteInsertOperation(file, partition_name, chunk, op_id);
|
|
ASSERT_TRUE(status.ok());
|
|
ASSERT_GE(file->Size(), chunk_size);
|
|
file->CloseFile();
|
|
|
|
WalFile file_read;
|
|
file_read.OpenFile(file_path, WalFile::READ);
|
|
idx_t last_id = 0;
|
|
file_read.ReadLastOpId(last_id);
|
|
ASSERT_EQ(last_id, op_id);
|
|
}
|
|
}
|
|
|
|
// iterate operations
|
|
{
|
|
auto status = file->OpenFile(file_path, WalFile::READ);
|
|
ASSERT_TRUE(status.ok());
|
|
|
|
Status iter_status;
|
|
int32_t op_index = 0;
|
|
while(iter_status.ok()) {
|
|
WalOperationPtr operation;
|
|
iter_status = WalOperationCodec::IterateOperation(file, operation, 0);
|
|
if (operation == nullptr) {
|
|
continue;
|
|
}
|
|
|
|
if (op_index >= operations.size()) {
|
|
ASSERT_TRUE(false);
|
|
}
|
|
|
|
// validate operation data is correct
|
|
WalOperationPtr compare_operation = operations[op_index];
|
|
ASSERT_EQ(operation->ID(), compare_operation->ID());
|
|
ASSERT_EQ(operation->Type(), compare_operation->Type());
|
|
|
|
if (operation->Type() == WalOperationType::INSERT_ENTITY) {
|
|
InsertEntityOperationPtr op_1 = std::static_pointer_cast<InsertEntityOperation>(operation);
|
|
InsertEntityOperationPtr op_2 = std::static_pointer_cast<InsertEntityOperation>(compare_operation);
|
|
ASSERT_EQ(op_1->partition_name, op_2->partition_name);
|
|
DataChunkPtr chunk_1 = op_1->data_chunk_;
|
|
DataChunkPtr chunk_2 = op_2->data_chunk_;
|
|
ASSERT_NE(chunk_1, nullptr);
|
|
ASSERT_NE(chunk_2, nullptr);
|
|
ASSERT_EQ(chunk_1->count_, chunk_2->count_);
|
|
|
|
for (auto& pair : chunk_1->fixed_fields_) {
|
|
auto iter = chunk_2->fixed_fields_.find(pair.first);
|
|
ASSERT_NE(iter, chunk_2->fixed_fields_.end());
|
|
ASSERT_NE(pair.second, nullptr);
|
|
ASSERT_NE(iter->second, nullptr);
|
|
ASSERT_EQ(pair.second->data_, iter->second->data_);
|
|
}
|
|
for (auto& pair : chunk_1->variable_fields_) {
|
|
auto iter = chunk_2->variable_fields_.find(pair.first);
|
|
ASSERT_NE(iter, chunk_2->variable_fields_.end());
|
|
ASSERT_NE(pair.second, nullptr);
|
|
ASSERT_NE(iter->second, nullptr);
|
|
ASSERT_EQ(pair.second->data_, iter->second->data_);
|
|
}
|
|
} else if(operation->Type() == WalOperationType::DELETE_ENTITY) {
|
|
DeleteEntityOperationPtr op_1 = std::static_pointer_cast<DeleteEntityOperation>(operation);
|
|
DeleteEntityOperationPtr op_2 = std::static_pointer_cast<DeleteEntityOperation>(compare_operation);
|
|
ASSERT_EQ(op_1->entity_ids_, op_2->entity_ids_);
|
|
}
|
|
|
|
++op_index;
|
|
}
|
|
ASSERT_EQ(op_index, operations.size());
|
|
}
|
|
}
|
|
|
|
TEST_F(WalTest, WalProxyTest) {
|
|
std::string collection_name = "col_1";
|
|
std::string partition_name = "part_1";
|
|
|
|
// write over more than 400MB data, 2 wal files
|
|
for (int64_t i = 1; i <= 1000; i++) {
|
|
if (i % 10 == 0) {
|
|
IDNumbers ids = {1, 2, 3};
|
|
auto status = db_->DeleteEntityByID(collection_name, ids, 0);
|
|
ASSERT_TRUE(status.ok());
|
|
} else {
|
|
DataChunkPtr chunk;
|
|
int64_t chunk_size = 0;
|
|
CreateChunk(chunk, 1000, chunk_size);
|
|
|
|
auto status = db_->Insert(collection_name, partition_name, chunk, 0);
|
|
ASSERT_TRUE(status.ok());
|
|
}
|
|
}
|
|
|
|
// find out the wal files
|
|
DBOptions opt = GetOptions();
|
|
std::experimental::filesystem::path collection_path = opt.wal_path_;
|
|
collection_path.append(collection_name);
|
|
|
|
using DirectoryIterator = std::experimental::filesystem::recursive_directory_iterator;
|
|
std::set<idx_t> op_ids;
|
|
{
|
|
DirectoryIterator file_iter(collection_path);
|
|
DirectoryIterator end_iter;
|
|
for (; file_iter != end_iter; ++file_iter) {
|
|
auto file_path = (*file_iter).path();
|
|
std::string file_name = file_path.filename().c_str();
|
|
if (file_name == milvus::engine::WAL_MAX_OP_FILE_NAME) {
|
|
continue;
|
|
}
|
|
|
|
// read all operation ids
|
|
auto file = std::make_shared<WalFile>();
|
|
auto status = file->OpenFile(file_path, WalFile::READ);
|
|
ASSERT_TRUE(status.ok());
|
|
|
|
Status iter_status;
|
|
while (iter_status.ok()) {
|
|
WalOperationPtr operation;
|
|
iter_status = WalOperationCodec::IterateOperation(file, operation, 0);
|
|
if (operation != nullptr) {
|
|
op_ids.insert(operation->ID());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// notify operation done, the wal files will be removed after all operations done
|
|
for (auto id : op_ids) {
|
|
auto status = WalManager::GetInstance().OperationDone(collection_name, id);
|
|
ASSERT_TRUE(status.ok());
|
|
}
|
|
|
|
// wait cleanup thread finish
|
|
WalManager::GetInstance().Stop();
|
|
|
|
// check the wal files
|
|
{
|
|
DirectoryIterator file_iter(collection_path);
|
|
DirectoryIterator end_iter;
|
|
for (; file_iter != end_iter; ++file_iter) {
|
|
auto file_path = (*file_iter).path();
|
|
std::string file_name = file_path.filename().c_str();
|
|
if (file_name == milvus::engine::WAL_MAX_OP_FILE_NAME) {
|
|
continue;
|
|
}
|
|
|
|
// wal file not deleted?
|
|
ASSERT_TRUE(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
TEST_F(WalTest, WalManagerTest) {
|
|
std::string collection_name = "collection";
|
|
|
|
// construct mock db
|
|
DBOptions options;
|
|
options.wal_path_ = "/tmp/milvus_wal";
|
|
options.wal_enable_ = true;
|
|
DummyDBPtr db_1 = std::make_shared<DummyDB>(options);
|
|
|
|
// prepare wal manager
|
|
WalManager::GetInstance().Stop();
|
|
WalManager::GetInstance().Start(options);
|
|
|
|
// write over more than 400MB data, 2 wal files
|
|
int64_t insert_count = 0;
|
|
int64_t delete_count = 0;
|
|
for (int64_t i = 1; i <= 1000; i++) {
|
|
if (i % 100 == 0) {
|
|
auto status = WalManager::GetInstance().DropCollection(collection_name);
|
|
ASSERT_TRUE(status.ok());
|
|
} else if (i % 10 == 0) {
|
|
IDNumbers ids = {1, 2, 3};
|
|
|
|
auto op = std::make_shared<DeleteEntityOperation>();
|
|
op->collection_name_ = collection_name;
|
|
op->entity_ids_ = ids;
|
|
|
|
auto status = WalManager::GetInstance().RecordOperation(op, db_1);
|
|
ASSERT_TRUE(status.ok());
|
|
|
|
delete_count++;
|
|
} else {
|
|
DataChunkPtr chunk;
|
|
int64_t chunk_size = 0;
|
|
CreateChunk(chunk, 1000, chunk_size);
|
|
|
|
auto op = std::make_shared<InsertEntityOperation>();
|
|
op->collection_name_ = collection_name;
|
|
op->partition_name = "";
|
|
op->data_chunk_ = chunk;
|
|
|
|
auto status = WalManager::GetInstance().RecordOperation(op, db_1);
|
|
ASSERT_TRUE(status.ok());
|
|
|
|
insert_count++;
|
|
}
|
|
}
|
|
|
|
ASSERT_EQ(db_1->InsertCount(), insert_count);
|
|
ASSERT_EQ(db_1->DeleteCount(), delete_count);
|
|
|
|
|
|
// test recovery
|
|
insert_count = 0;
|
|
delete_count = 0;
|
|
for (int64_t i = 1; i <= 1000; i++) {
|
|
if (i % 10 == 0) {
|
|
IDNumbers ids = {1, 2, 3};
|
|
|
|
auto op = std::make_shared<DeleteEntityOperation>();
|
|
op->collection_name_ = collection_name;
|
|
op->entity_ids_ = ids;
|
|
|
|
auto status = WalManager::GetInstance().RecordOperation(op, nullptr);
|
|
ASSERT_TRUE(status.ok());
|
|
|
|
delete_count++;
|
|
} else {
|
|
DataChunkPtr chunk;
|
|
int64_t chunk_size = 0;
|
|
CreateChunk(chunk, 1000, chunk_size);
|
|
|
|
auto op = std::make_shared<InsertEntityOperation>();
|
|
op->collection_name_ = collection_name;
|
|
op->partition_name = "";
|
|
op->data_chunk_ = chunk;
|
|
|
|
auto status = WalManager::GetInstance().RecordOperation(op, nullptr);
|
|
ASSERT_TRUE(status.ok());
|
|
|
|
insert_count++;
|
|
}
|
|
}
|
|
|
|
DummyDBPtr db_2 = std::make_shared<DummyDB>(options);
|
|
WalManager::GetInstance().Recovery(db_2);
|
|
ASSERT_EQ(db_2->InsertCount(), insert_count);
|
|
ASSERT_EQ(db_2->DeleteCount(), delete_count);
|
|
}
|