address comments

This commit is contained in:
Han Fei 2024-05-06 15:38:29 +02:00
parent 894fd4f395
commit aa41ad12f6
6 changed files with 627 additions and 1649 deletions

View File

@ -70,7 +70,7 @@ public:
void setRocksDBDisk(DiskPtr disk);
DiskPtr getTemporaryRocksDBDisk() const;
void setRocksDBOptions(std::shared_ptr<rocksdb::Options> rocksdb_options_);
void setRocksDBOptions(std::shared_ptr<rocksdb::Options> rocksdb_options_ = nullptr);
std::shared_ptr<rocksdb::Options> getRocksDBOptions() const { return rocksdb_options; }
UInt64 getKeeperMemorySoftLimit() const { return memory_soft_limit; }

View File

@ -1745,63 +1745,53 @@ struct KeeperStorageListRequestProcessor final : public KeeperStorageRequestProc
if (path_prefix.empty())
throw DB::Exception(ErrorCodes::LOGICAL_ERROR, "Path cannot be empty");
if constexpr (Storage::use_rocksdb)
const auto & get_children = [&]()
{
const auto & children = container.getChildren(request.path);
response.names.reserve(children.size());
const auto add_child = [&](const auto & child)
if constexpr (Storage::use_rocksdb)
return container.getChildren(request.path);
else
return node_it->value.getChildren();
};
const auto & children = get_children();
response.names.reserve(children.size());
const auto add_child = [&](const auto & child)
{
using enum Coordination::ListRequestType;
auto list_request_type = ALL;
if (auto * filtered_list = dynamic_cast<Coordination::ZooKeeperFilteredListRequest *>(&request))
{
using enum Coordination::ListRequestType;
auto list_request_type = ALL;
if (auto * filtered_list = dynamic_cast<Coordination::ZooKeeperFilteredListRequest *>(&request))
{
list_request_type = filtered_list->list_request_type;
}
if (list_request_type == ALL)
return true;
const auto is_ephemeral = child.second.isEphemeral();
return (is_ephemeral && list_request_type == EPHEMERAL_ONLY) || (!is_ephemeral && list_request_type == PERSISTENT_ONLY);
};
for (const auto & child : children)
{
if (add_child(child))
response.names.push_back(child.first);
list_request_type = filtered_list->list_request_type;
}
}
else
{
const auto & children = node_it->value.getChildren();
response.names.reserve(children.size());
const auto add_child = [&](const auto child)
if (list_request_type == ALL)
return true;
bool is_ephemeral;
if constexpr (!Storage::use_rocksdb)
{
using enum Coordination::ListRequestType;
auto list_request_type = ALL;
if (auto * filtered_list = dynamic_cast<Coordination::ZooKeeperFilteredListRequest *>(&request))
{
list_request_type = filtered_list->list_request_type;
}
if (list_request_type == ALL)
return true;
auto child_path = (std::filesystem::path(request.path) / child.toView()).generic_string();
auto child_it = container.find(child_path);
if (child_it == container.end())
onStorageInconsistency();
const auto is_ephemeral = child_it->value.isEphemeral();
return (is_ephemeral && list_request_type == EPHEMERAL_ONLY) || (!is_ephemeral && list_request_type == PERSISTENT_ONLY);
};
for (const auto child : children)
is_ephemeral = child_it->value.isEphemeral();
}
else
{
if (add_child(child))
is_ephemeral = child.second.isEphemeral();
}
return (is_ephemeral && list_request_type == EPHEMERAL_ONLY) || (!is_ephemeral && list_request_type == PERSISTENT_ONLY);
};
for (const auto & child : children)
{
if (add_child(child))
{
if constexpr (Storage::use_rocksdb)
response.names.push_back(child.first);
else
response.names.push_back(child.toString());
}
}

View File

@ -93,6 +93,13 @@ struct KeeperRocksNodeInfo
ephemeral_or_children_data.children_info.num_children = num_children;
}
/// dummy interface for test
void addChild(StringRef) {}
auto getChildren() const
{
return std::vector<int>(numChildren());
}
void increaseNumChildren()
{
chassert(!isEphemeral());

View File

@ -31,6 +31,20 @@ struct RocksDBContainer
using Node = Node_;
private:
/// MockNode is only use in test to mock `getChildren()` and `getData()`
struct MockNode
{
std::vector<int> children;
std::string data;
MockNode(size_t children_num, std::string_view data_)
: children(std::vector<int>(children_num)),
data(data_)
{
}
std::vector<int> getChildren() { return children; }
std::string getData() { return data; }
};
UInt16 getKeyDepth(const std::string & key)
{
@ -262,6 +276,13 @@ public:
return const_iterator(kv);
}
MockNode getValue(StringRef key)
{
auto it = find(key);
chassert(it != end());
return MockNode(it->value.numChildren(), it->value.getData());
}
const_iterator updateValue(StringRef key_, ValueUpdater updater)
{
/// rocksdb::PinnableSlice slice;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff