if (dir->inode->parent)
dir = dir->inode->parent->dir;
else
- return false; // root on replica
+ break; // root on replica
}
+ return make_pair(freezing, frozen);
}
+ CDir *CDir::get_freezing_tree_root()
+ {
+ if (num_freezing_trees == 0)
+ return nullptr;
+ CDir *dir = this;
+ while (true) {
+ if (dir->is_freezing_tree_root())
+ return dir;
+ if (dir->is_subtree_root())
+ return nullptr;
+ if (dir->inode->parent)
+ dir = dir->inode->parent->dir;
+ else
+ return nullptr;
+ }
+ }
+
CDir *CDir::get_frozen_tree_root()
{
assert(is_frozen());
void maybe_finish_freeze();
- bool is_freezing() const override { return is_freezing_tree() || is_freezing_dir(); }
- bool is_freezing_tree() const;
+ pair<bool,bool> is_freezing_or_frozen_tree() const;
+
+ bool is_freezing() const override { return is_freezing_dir() || is_freezing_tree(); }
+ bool is_freezing_tree() const {
+ if (!num_freezing_trees)
+ return false;
+ return is_freezing_or_frozen_tree().first;
+ }
bool is_freezing_tree_root() const { return state & STATE_FREEZINGTREE; }
bool is_freezing_dir() const { return state & STATE_FREEZINGDIR; }
+ CDir *get_freezing_tree_root();
bool is_frozen() const override { return is_frozen_dir() || is_frozen_tree(); }
- bool is_frozen_tree() const;
+ bool is_frozen_tree() const {
+ if (!num_frozen_trees)
+ return false;
+ return is_freezing_or_frozen_tree().second;
+ }
bool is_frozen_tree_root() const { return state & STATE_FROZENTREE; }
bool is_frozen_dir() const { return state & STATE_FROZENDIR; }