diff --git a/src/mds/filesystem/partition.cc b/src/mds/filesystem/partition.cc index 396ed3b91..67ccd20aa 100644 --- a/src/mds/filesystem/partition.cc +++ b/src/mds/filesystem/partition.cc @@ -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) { @@ -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_) { diff --git a/src/mds/filesystem/partition.h b/src/mds/filesystem/partition.h index 130c83af2..14e21cfbd 100644 --- a/src/mds/filesystem/partition.h +++ b/src/mds/filesystem/partition.h @@ -204,7 +204,7 @@ class ShardPartition { uint64_t base_version_{0}; uint64_t delta_version_{0}; - std::vector delta_dentry_ops_; + std::list delta_dentry_ops_; std::vector shard_boundaries_;