未验证 提交 dbff431d 编写于 作者: X XuPeng-SH 提交者: GitHub

(db/snapshot): Add new TypeNameField and update some ut (#3100)

* (db/snapshot): Add TypeNameField
Signed-off-by: Npeng.xu <peng.xu@zilliz.com>

* (db/snapshot): add test for DropAllIndexOperation
Signed-off-by: Npeng.xu <peng.xu@zilliz.com>
Co-authored-by: NJin Hai <hai.jin@zilliz.com>
上级 69f4f4d5
...@@ -29,6 +29,7 @@ extern const char* F_NAME; ...@@ -29,6 +29,7 @@ extern const char* F_NAME;
extern const char* F_PARAMS; extern const char* F_PARAMS;
extern const char* F_SIZE; extern const char* F_SIZE;
extern const char* F_ROW_COUNT; extern const char* F_ROW_COUNT;
extern const char* F_TYPE_NAME;
//////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
// Table names // Table names
......
...@@ -34,6 +34,7 @@ const char* F_NAME = snapshot::NameField::Name; ...@@ -34,6 +34,7 @@ const char* F_NAME = snapshot::NameField::Name;
const char* F_PARAMS = snapshot::ParamsField::Name; const char* F_PARAMS = snapshot::ParamsField::Name;
const char* F_SIZE = snapshot::SizeField::Name; const char* F_SIZE = snapshot::SizeField::Name;
const char* F_ROW_COUNT = snapshot::RowCountField::Name; const char* F_ROW_COUNT = snapshot::RowCountField::Name;
const char* F_TYPE_NAME = snapshot::TypeNameField::Name;
const char* TABLE_COLLECTION = snapshot::Collection::Name; const char* TABLE_COLLECTION = snapshot::Collection::Name;
const char* TABLE_COLLECTION_COMMIT = snapshot::CollectionCommit::Name; const char* TABLE_COLLECTION_COMMIT = snapshot::CollectionCommit::Name;
...@@ -72,7 +73,8 @@ ResourceAttrMapOf(const std::string& table, std::vector<std::string>& attrs) { ...@@ -72,7 +73,8 @@ ResourceAttrMapOf(const std::string& table, std::vector<std::string>& attrs) {
{snapshot::FieldCommit::Name, {snapshot::FieldCommit::Name,
{F_COLLECTON_ID, F_FIELD_ID, F_MAPPINGS, F_ID, F_LSN, F_STATE, F_CREATED_ON, F_UPDATED_ON}}, {F_COLLECTON_ID, F_FIELD_ID, F_MAPPINGS, F_ID, F_LSN, F_STATE, F_CREATED_ON, F_UPDATED_ON}},
{snapshot::FieldElement::Name, {snapshot::FieldElement::Name,
{F_COLLECTON_ID, F_FIELD_ID, F_NAME, F_FTYPE, F_PARAMS, F_ID, F_LSN, F_STATE, F_CREATED_ON, F_UPDATED_ON}}, {F_COLLECTON_ID, F_FIELD_ID, F_NAME, F_FTYPE, F_TYPE_NAME, F_PARAMS, F_ID, F_LSN, F_STATE, F_CREATED_ON,
F_UPDATED_ON}},
}; };
if (ResourceAttrMap.find(table) == ResourceAttrMap.end()) { if (ResourceAttrMap.find(table) == ResourceAttrMap.end()) {
......
...@@ -152,6 +152,10 @@ AttrValue2Str(typename ResourceContext<ResourceT>::ResPtr src, const std::string ...@@ -152,6 +152,10 @@ AttrValue2Str(typename ResourceContext<ResourceT>::ResPtr src, const std::string
auto name_field = std::dynamic_pointer_cast<snapshot::NameField>(src); auto name_field = std::dynamic_pointer_cast<snapshot::NameField>(src);
str_value = name_field->GetName(); str_value = name_field->GetName();
str2str(str_value, value); str2str(str_value, value);
} else if (F_TYPE_NAME == attr) {
auto type_name_field = std::dynamic_pointer_cast<snapshot::TypeNameField>(src);
str_value = type_name_field->GetTypeName();
str2str(str_value, value);
} else if (F_PARAMS == attr) { } else if (F_PARAMS == attr) {
auto params_field = std::dynamic_pointer_cast<snapshot::ParamsField>(src); auto params_field = std::dynamic_pointer_cast<snapshot::ParamsField>(src);
json_value = params_field->GetParams(); json_value = params_field->GetParams();
......
...@@ -304,6 +304,14 @@ MetaSession::Select(const std::string& field, const std::vector<U>& values, ...@@ -304,6 +304,14 @@ MetaSession::Select(const std::string& field, const std::vector<U>& values,
} }
} }
auto tn_p = std::dynamic_pointer_cast<snapshot::TypeNameField>(resource);
if (tn_p != nullptr) {
iter = raw.find(F_TYPE_NAME);
if (iter != raw.end()) {
tn_p->SetTypeName(iter->second);
}
}
resources.push_back(std::move(resource)); resources.push_back(std::move(resource));
} }
......
...@@ -48,6 +48,7 @@ static const MetaField MetaUpdatedOnField = MetaField(F_UPDATED_ON, "BIGINT", "N ...@@ -48,6 +48,7 @@ static const MetaField MetaUpdatedOnField = MetaField(F_UPDATED_ON, "BIGINT", "N
static const MetaField MetaParamsField = MetaField(F_PARAMS, "JSON", "NOT NULL"); static const MetaField MetaParamsField = MetaField(F_PARAMS, "JSON", "NOT NULL");
static const MetaField MetaSizeField = MetaField(F_SIZE, "BIGINT", "NOT NULL"); static const MetaField MetaSizeField = MetaField(F_SIZE, "BIGINT", "NOT NULL");
static const MetaField MetaRowCountField = MetaField(F_ROW_COUNT, "BIGINT", "NOT NULL"); static const MetaField MetaRowCountField = MetaField(F_ROW_COUNT, "BIGINT", "NOT NULL");
static const MetaField MetaTypeNameField = MetaField(F_TYPE_NAME, "VARCHAR(255)", "NOT NULL");
// Environment schema // Environment schema
static const MetaSchema COLLECTION_SCHEMA(TABLE_COLLECTION, {MetaIdField, MetaNameField, MetaLSNField, MetaParamsField, static const MetaSchema COLLECTION_SCHEMA(TABLE_COLLECTION, {MetaIdField, MetaNameField, MetaLSNField, MetaParamsField,
...@@ -99,8 +100,8 @@ static const MetaSchema FIELDCOMMIT_SCHEMA(TABLE_FIELD_COMMIT, ...@@ -99,8 +100,8 @@ static const MetaSchema FIELDCOMMIT_SCHEMA(TABLE_FIELD_COMMIT,
static const MetaSchema FIELDELEMENT_SCHEMA(TABLE_FIELD_ELEMENT, static const MetaSchema FIELDELEMENT_SCHEMA(TABLE_FIELD_ELEMENT,
{MetaIdField, MetaCollectionIdField, MetaFieldIdField, MetaNameField, {MetaIdField, MetaCollectionIdField, MetaFieldIdField, MetaNameField,
MetaFtypeField, MetaParamsField, MetaLSNField, MetaStateField, MetaFtypeField, MetaTypeNameField, MetaParamsField, MetaLSNField,
MetaCreatedOnField, MetaUpdatedOnField}); MetaStateField, MetaCreatedOnField, MetaUpdatedOnField});
} // namespace } // namespace
......
...@@ -44,6 +44,7 @@ static const MetaField MetaUpdatedOnField = MetaField(F_UPDATED_ON, "BIGINT", "N ...@@ -44,6 +44,7 @@ static const MetaField MetaUpdatedOnField = MetaField(F_UPDATED_ON, "BIGINT", "N
static const MetaField MetaParamsField = MetaField(F_PARAMS, "VARCHAR(255)", "NOT NULL"); static const MetaField MetaParamsField = MetaField(F_PARAMS, "VARCHAR(255)", "NOT NULL");
static const MetaField MetaSizeField = MetaField(F_SIZE, "BIGINT", "NOT NULL"); static const MetaField MetaSizeField = MetaField(F_SIZE, "BIGINT", "NOT NULL");
static const MetaField MetaRowCountField = MetaField(F_ROW_COUNT, "BIGINT", "NOT NULL"); static const MetaField MetaRowCountField = MetaField(F_ROW_COUNT, "BIGINT", "NOT NULL");
static const MetaField MetaTypeNameField = MetaField(F_TYPE_NAME, "VARCHAR(255)", "NOT NULL");
// Environment schema // Environment schema
static const MetaSchema COLLECTION_SCHEMA(TABLE_COLLECTION, {MetaIdField, MetaNameField, MetaLSNField, MetaParamsField, static const MetaSchema COLLECTION_SCHEMA(TABLE_COLLECTION, {MetaIdField, MetaNameField, MetaLSNField, MetaParamsField,
...@@ -117,8 +118,8 @@ static const MetaSchema FIELDCOMMIT_SCHEMA(TABLE_FIELD_COMMIT, ...@@ -117,8 +118,8 @@ static const MetaSchema FIELDCOMMIT_SCHEMA(TABLE_FIELD_COMMIT,
static const MetaSchema FIELDELEMENT_SCHEMA(TABLE_FIELD_ELEMENT, static const MetaSchema FIELDELEMENT_SCHEMA(TABLE_FIELD_ELEMENT,
{MetaIdField, MetaCollectionIdField, MetaFieldIdField, MetaNameField, {MetaIdField, MetaCollectionIdField, MetaFieldIdField, MetaNameField,
MetaFtypeField, MetaParamsField, MetaLSNField, MetaStateField, MetaFtypeField, MetaTypeNameField, MetaParamsField, MetaLSNField,
MetaCreatedOnField, MetaUpdatedOnField}); MetaStateField, MetaCreatedOnField, MetaUpdatedOnField});
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
static AttrsMapList* QueryData = nullptr; static AttrsMapList* QueryData = nullptr;
......
...@@ -921,18 +921,19 @@ CreateCollectionOperation::DoExecute(StorePtr store) { ...@@ -921,18 +921,19 @@ CreateCollectionOperation::DoExecute(StorePtr store) {
AddStepWithLsn(*field, c_context_.lsn, f_ctx_p); AddStepWithLsn(*field, c_context_.lsn, f_ctx_p);
MappingT element_ids = {}; MappingT element_ids = {};
FieldElementPtr raw_element; FieldElementPtr raw_element;
status = store->CreateResource<FieldElement>( status =
FieldElement(collection->GetID(), field->GetID(), DEFAULT_RAW_DATA_NAME, FieldElementType::FET_RAW), store->CreateResource<FieldElement>(FieldElement(collection->GetID(), field->GetID(), DEFAULT_RAW_DATA_NAME,
raw_element); FieldElementType::FET_RAW, DEFAULT_RAW_DATA_NAME),
raw_element);
auto fe_ctx_p = ResourceContextBuilder<FieldElement>().SetOp(meta::oUpdate).CreatePtr(); auto fe_ctx_p = ResourceContextBuilder<FieldElement>().SetOp(meta::oUpdate).CreatePtr();
AddStepWithLsn(*raw_element, c_context_.lsn, fe_ctx_p); AddStepWithLsn(*raw_element, c_context_.lsn, fe_ctx_p);
element_ids.insert(raw_element->GetID()); element_ids.insert(raw_element->GetID());
for (auto& element_schema : field_elements) { for (auto& element_schema : field_elements) {
FieldElementPtr element; FieldElementPtr element;
status = status = store->CreateResource<FieldElement>(
store->CreateResource<FieldElement>(FieldElement(collection->GetID(), field->GetID(), FieldElement(collection->GetID(), field->GetID(), element_schema->GetName(), element_schema->GetFtype(),
element_schema->GetName(), element_schema->GetFtype()), element_schema->GetTypeName()),
element); element);
auto t_fe_ctx_p = ResourceContextBuilder<FieldElement>().SetOp(meta::oUpdate).CreatePtr(); auto t_fe_ctx_p = ResourceContextBuilder<FieldElement>().SetOp(meta::oUpdate).CreatePtr();
AddStepWithLsn(*element, c_context_.lsn, t_fe_ctx_p); AddStepWithLsn(*element, c_context_.lsn, t_fe_ctx_p);
element_ids.insert(element->GetID()); element_ids.insert(element->GetID());
......
...@@ -186,12 +186,13 @@ FieldCommit::FieldCommit(ID_TYPE collection_id, ID_TYPE field_id, const MappingT ...@@ -186,12 +186,13 @@ FieldCommit::FieldCommit(ID_TYPE collection_id, ID_TYPE field_id, const MappingT
} }
FieldElement::FieldElement(ID_TYPE collection_id, ID_TYPE field_id, const std::string& name, FTYPE_TYPE ftype, FieldElement::FieldElement(ID_TYPE collection_id, ID_TYPE field_id, const std::string& name, FTYPE_TYPE ftype,
const json& params, ID_TYPE id, LSN_TYPE lsn, State state, TS_TYPE created_on, const std::string& type_name, const json& params, ID_TYPE id, LSN_TYPE lsn, State state,
TS_TYPE updated_on) TS_TYPE created_on, TS_TYPE updated_on)
: CollectionIdField(collection_id), : CollectionIdField(collection_id),
FieldIdField(field_id), FieldIdField(field_id),
NameField(name), NameField(name),
FtypeField(ftype), FtypeField(ftype),
TypeNameField(type_name),
ParamsField(params), ParamsField(params),
IdField(id), IdField(id),
LsnField(lsn), LsnField(lsn),
......
...@@ -349,6 +349,27 @@ class SegmentIdField { ...@@ -349,6 +349,27 @@ class SegmentIdField {
ID_TYPE segment_id_; ID_TYPE segment_id_;
}; };
class TypeNameField {
public:
static constexpr const char* Name = "TypeName";
explicit TypeNameField(std::string val) : type_name_(std::move(val)) {
}
const std::string&
GetTypeName() const {
return type_name_;
}
void
SetTypeName(const std::string& val) {
type_name_ = val;
}
protected:
std::string type_name_;
};
class NameField { class NameField {
public: public:
static constexpr const char* Name = "name"; static constexpr const char* Name = "name";
...@@ -709,6 +730,7 @@ class FieldElement : public BaseResource<FieldElement>, ...@@ -709,6 +730,7 @@ class FieldElement : public BaseResource<FieldElement>,
public FieldIdField, public FieldIdField,
public NameField, public NameField,
public FtypeField, public FtypeField,
public TypeNameField,
public ParamsField, public ParamsField,
public IdField, public IdField,
public LsnField, public LsnField,
...@@ -723,8 +745,9 @@ class FieldElement : public BaseResource<FieldElement>, ...@@ -723,8 +745,9 @@ class FieldElement : public BaseResource<FieldElement>,
using VecT = std::vector<Ptr>; using VecT = std::vector<Ptr>;
static constexpr const char* Name = "FieldElement"; static constexpr const char* Name = "FieldElement";
FieldElement(ID_TYPE collection_id, ID_TYPE field_id, const std::string& name, FTYPE_TYPE ftype, FieldElement(ID_TYPE collection_id, ID_TYPE field_id, const std::string& name, FTYPE_TYPE ftype,
const json& params = JEmpty, ID_TYPE id = 0, LSN_TYPE lsn = 0, State status = PENDING, const std::string& type_name = "", const json& params = JEmpty, ID_TYPE id = 0, LSN_TYPE lsn = 0,
TS_TYPE created_on = GetMicroSecTimeStamp(), TS_TYPE UpdatedOnField = GetMicroSecTimeStamp()); State status = PENDING, TS_TYPE created_on = GetMicroSecTimeStamp(),
TS_TYPE UpdatedOnField = GetMicroSecTimeStamp());
}; };
using FieldElementPtr = FieldElement::Ptr; using FieldElementPtr = FieldElement::Ptr;
......
...@@ -19,13 +19,11 @@ namespace snapshot { ...@@ -19,13 +19,11 @@ namespace snapshot {
void void
Snapshot::RefAll() { Snapshot::RefAll() {
/* std::cout << this << " RefAll SS=" << GetID() << " SS RefCnt=" << ref_count() << std::endl; */
std::apply([this](auto&... resource) { ((DoRef(resource)), ...); }, resources_); std::apply([this](auto&... resource) { ((DoRef(resource)), ...); }, resources_);
} }
void void
Snapshot::UnRefAll() { Snapshot::UnRefAll() {
/* std::cout << this << " UnRefAll SS=" << GetID() << " SS RefCnt=" << ref_count() << std::endl; */
std::apply([this](auto&... resource) { ((DoUnRef(resource)), ...); }, resources_); std::apply([this](auto&... resource) { ((DoUnRef(resource)), ...); }, resources_);
} }
...@@ -249,6 +247,7 @@ Snapshot::ToString() const { ...@@ -249,6 +247,7 @@ Snapshot::ToString() const {
for (auto& fe_id : fc_m) { for (auto& fe_id : fc_m) {
auto fe = GetResource<FieldElement>(fe_id); auto fe = GetResource<FieldElement>(fe_id);
ss << "\n\tFieldElement: id=" << fe_id << ",name=" << fe->GetName() << " CID=" << fe->GetCollectionId(); ss << "\n\tFieldElement: id=" << fe_id << ",name=" << fe->GetName() << " CID=" << fe->GetCollectionId();
ss << ",ftype=" << fe->GetFtype() << ",typename=" << fe->GetTypeName();
} }
} }
......
...@@ -541,31 +541,41 @@ TEST_F(SnapshotTest, IndexTest) { ...@@ -541,31 +541,41 @@ TEST_F(SnapshotTest, IndexTest) {
sf_collector->Iterate(); sf_collector->Iterate();
auto prev_total = sf_collector->segment_files_.size(); auto prev_total = sf_collector->segment_files_.size();
decltype(sf_context) osf_context;
SFContextBuilder(osf_context, ss, {sf_context.field_element_name});
std::vector<SegmentFileContext> sfs_context = {sf_context, osf_context};
auto new_total = 0; auto new_total = 0;
auto partitions = ss->GetResources<Partition>(); auto partitions = ss->GetResources<Partition>();
for (auto& kv : partitions) { for (auto& kv : partitions) {
num = RandomInt(2, 5); num = RandomInt(2, 5);
auto row_cnt = 1024; auto row_cnt = 1024;
for (auto i = 0; i < num; ++i) { for (auto i = 0; i < num; ++i) {
ASSERT_TRUE(CreateSegment(ss, kv.first, next_lsn(), sf_context, row_cnt).ok()); ASSERT_TRUE(CreateSegment(ss, kv.first, next_lsn(), sfs_context, row_cnt).ok());
} }
new_total += num; new_total += num * sfs_context.size();
} }
status = Snapshots::GetInstance().GetSnapshot(ss, ss->GetName()); status = Snapshots::GetInstance().GetSnapshot(ss, ss->GetName());
ASSERT_TRUE(status.ok()); ASSERT_TRUE(status.ok());
std::cout << ss->ToString() << std::endl;
sf_collector = std::make_shared<SegmentFileCollector>(ss, filter2); sf_collector = std::make_shared<SegmentFileCollector>(ss, filter2);
sf_collector->Iterate(); sf_collector->Iterate();
auto total = sf_collector->segment_files_.size(); auto total = sf_collector->segment_files_.size();
ASSERT_EQ(total, prev_total + new_total); ASSERT_EQ(total, prev_total + new_total);
auto field_element_id = ss->GetFieldElementId(sf_context.field_name, std::set<ID_TYPE> fe_ids;
sf_context.field_element_name);
ASSERT_NE(field_element_id, 0); for (auto ctx : sfs_context) {
auto field_element_id = ss->GetFieldElementId(ctx.field_name,
ctx.field_element_name);
ASSERT_NE(field_element_id, 0);
fe_ids.insert(field_element_id);
}
auto filter3 = [&](SegmentFile::Ptr segment_file) -> bool { auto filter3 = [&](SegmentFile::Ptr segment_file) -> bool {
return segment_file->GetFieldElementId() == field_element_id; return fe_ids.find(segment_file->GetFieldElementId()) != fe_ids.end();
}; };
sf_collector = std::make_shared<SegmentFileCollector>(ss, filter3); sf_collector = std::make_shared<SegmentFileCollector>(ss, filter3);
sf_collector->Iterate(); sf_collector->Iterate();
...@@ -573,14 +583,9 @@ TEST_F(SnapshotTest, IndexTest) { ...@@ -573,14 +583,9 @@ TEST_F(SnapshotTest, IndexTest) {
OperationContext d_a_i_ctx; OperationContext d_a_i_ctx;
d_a_i_ctx.lsn = next_lsn(); d_a_i_ctx.lsn = next_lsn();
d_a_i_ctx.stale_field_elements.push_back(ss->GetResource<FieldElement>(field_element_id)); for (auto fe_id : fe_ids) {
d_a_i_ctx.stale_field_elements.push_back(ss->GetResource<FieldElement>(fe_id));
FieldElement::Ptr fe; }
status = ss->GetFieldElement(sf_context.field_name, sf_context.field_element_name,
fe);
ASSERT_TRUE(status.ok());
ASSERT_EQ(fe, d_a_i_ctx.stale_field_elements[0]);
auto drop_all_index_op = std::make_shared<DropAllIndexOperation>(d_a_i_ctx, ss); auto drop_all_index_op = std::make_shared<DropAllIndexOperation>(d_a_i_ctx, ss);
status = drop_all_index_op->Push(); status = drop_all_index_op->Push();
...@@ -605,14 +610,18 @@ TEST_F(SnapshotTest, IndexTest) { ...@@ -605,14 +610,18 @@ TEST_F(SnapshotTest, IndexTest) {
/* } */ /* } */
/* } */ /* } */
std::cout << ss->ToString() << std::endl;
sf_collector = std::make_shared<SegmentFileCollector>(ss, filter2); sf_collector = std::make_shared<SegmentFileCollector>(ss, filter2);
sf_collector->Iterate(); sf_collector->Iterate();
ASSERT_EQ(sf_collector->segment_files_.size(), total - specified_segment_files_cnt); ASSERT_EQ(sf_collector->segment_files_.size(), total - specified_segment_files_cnt);
std::cout << "sf size = " << sf_collector->segment_files_.size() << std::endl;
std::cout << "total = " << total << std::endl;
std::cout << "specified_segment_files_cnt = " << specified_segment_files_cnt << std::endl;
{ {
auto& field_elements = ss->GetResources<FieldElement>(); auto& field_elements = ss->GetResources<FieldElement>();
for (auto& kv : field_elements) { for (auto& kv : field_elements) {
ASSERT_NE(kv.second->GetID(), field_element_id); ASSERT_EQ(fe_ids.find(kv.second->GetID()), fe_ids.end());
} }
} }
} }
......
...@@ -98,10 +98,15 @@ RandomInt(int start, int end) { ...@@ -98,10 +98,15 @@ RandomInt(int start, int end) {
} }
inline void inline void
SFContextBuilder(SegmentFileContext& ctx, ScopedSnapshotT sss) { SFContextBuilder(SegmentFileContext& ctx, ScopedSnapshotT sss,
const std::set<std::string>& exclude_field_element_names = {}) {
auto field = sss->GetResources<Field>().begin()->second; auto field = sss->GetResources<Field>().begin()->second;
ctx.field_name = field->GetName(); ctx.field_name = field->GetName();
for (auto& kv : sss->GetResources<FieldElement>()) { for (auto& kv : sss->GetResources<FieldElement>()) {
auto name = kv.second->GetName();
if (exclude_field_element_names.find(name) != exclude_field_element_names.end()) {
continue;
}
ctx.field_element_name = kv.second->GetName(); ctx.field_element_name = kv.second->GetName();
break; break;
} }
...@@ -286,6 +291,30 @@ CreateSegment(ScopedSnapshotT ss, ID_TYPE partition_id, LSN_TYPE lsn, const Segm ...@@ -286,6 +291,30 @@ CreateSegment(ScopedSnapshotT ss, ID_TYPE partition_id, LSN_TYPE lsn, const Segm
return op->GetSnapshot(ss); return op->GetSnapshot(ss);
} }
inline Status
CreateSegment(ScopedSnapshotT ss, ID_TYPE partition_id, LSN_TYPE lsn,
const std::vector<SegmentFileContext>& sfs_context,
SIZE_TYPE row_cnt) {
OperationContext context;
context.lsn = lsn;
context.prev_partition = ss->GetResource<Partition>(partition_id);
auto op = std::make_shared<NewSegmentOperation>(context, ss);
SegmentPtr new_seg;
STATUS_CHECK(op->CommitNewSegment(new_seg));
for (auto& sf_context : sfs_context) {
SegmentFilePtr seg_file;
auto nsf_context = sf_context;
nsf_context.segment_id = new_seg->GetID();
nsf_context.partition_id = new_seg->GetPartitionId();
STATUS_CHECK(op->CommitNewSegmentFile(nsf_context, seg_file));
seg_file->SetSize(row_cnt * 10);
}
op->CommitRowCount(row_cnt);
STATUS_CHECK(op->Push());
return op->GetSnapshot(ss);
}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
class BaseTest : public ::testing::Test { class BaseTest : public ::testing::Test {
protected: protected:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册