Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
21 changes: 17 additions & 4 deletions src/mds/filesystem/partition.cc
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,24 @@ size_t ShardPartition::Bytes() const {

void ShardPartition::AddDeltaOpNoLock(DentryOp&& op) {
op.time_s = utils::Timestamp();

delta_dentry_ops_.push_back(std::move(op));

// keep delta_dentry_ops_ ordered by version, the new op is usually with greater version, so we compare with the last
// op first to avoid unnecessary sort
if (delta_dentry_ops_.size() > 1) {
auto it = delta_dentry_ops_.end();
--it; // last element
auto prev = it;
--prev;
while (true) {
if (it->version >= prev->version) break;
std::iter_swap(it, prev);
if (prev == delta_dentry_ops_.begin()) break;
it = prev;
--prev;
}
}
}

void ShardPartition::ApplyDeltaOpNoLock(DirShardSPtr shard) {
Expand Down Expand Up @@ -491,10 +508,6 @@ bool ShardPartition::Refresh(InodeSPtr inode) {
delta_version_ = std::max(delta_version_, base_version_);
shard_map_.clear();

// apply delta ops
std::sort(delta_dentry_ops_.begin(), delta_dentry_ops_.end(), // NOLINT
[](const DentryOp& a, const DentryOp& b) -> bool { return a.version < b.version; });

delta_version_ = base_version_;
for (auto it = delta_dentry_ops_.begin(); it != delta_dentry_ops_.end();) {
if (it->version <= base_version_) {
Expand Down
2 changes: 1 addition & 1 deletion src/mds/filesystem/partition.h
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ class ShardPartition {

uint64_t base_version_{0};
uint64_t delta_version_{0};
std::vector<DentryOp> delta_dentry_ops_;
std::list<DentryOp> delta_dentry_ops_;

std::vector<std::string> shard_boundaries_;

Expand Down
Loading