assert(expired_inode); // we had better have this.
CDir *parent_dir = expired_inode->get_approx_dirfrag(p->first.frag);
assert(parent_dir);
-
+
+ int export_state = -1;
+ if (parent_dir->is_auth() && parent_dir->is_exporting()) {
+ export_state = migrator->get_export_state(parent_dir);
+ assert(export_state >= 0);
+ }
+
if (!parent_dir->is_auth() ||
- (parent_dir->is_auth() && parent_dir->is_exporting() &&
- ((migrator->get_export_state(parent_dir) == Migrator::EXPORT_WARNING &&
+ (export_state != -1 &&
+ ((export_state == Migrator::EXPORT_WARNING &&
migrator->export_has_warned(parent_dir,from)) ||
- migrator->get_export_state(parent_dir) == Migrator::EXPORT_EXPORTING))) {
+ export_state == Migrator::EXPORT_EXPORTING ||
+ export_state == Migrator::EXPORT_LOGGINGFINISH ||
+ (export_state == Migrator::EXPORT_NOTIFYING &&
+ !migrator->export_has_notified(parent_dir,from))))) {
+
// not auth.
dout(7) << "delaying nonauth|warned expires for " << *parent_dir << dendl;
assert(parent_dir->is_frozen_tree_root());
delayed_expire[parent_dir][from]->add_realm(p->first, p->second);
continue;
}
- assert(!(parent_dir->is_auth() && parent_dir->is_exporting()) ||
- migrator->get_export_state(parent_dir) <= Migrator::EXPORT_PREPPING ||
- (migrator->get_export_state(parent_dir) == Migrator::EXPORT_WARNING &&
- !migrator->export_has_warned(parent_dir, from)));
+ assert(export_state <= Migrator::EXPORT_PREPPING ||
+ (export_state == Migrator::EXPORT_WARNING &&
+ !migrator->export_has_warned(parent_dir, from)));
dout(7) << "expires for " << *parent_dir << dendl;
} else {
return (export_warning_ack_waiting[dir].count(who) == 0);
}
-
-
+ bool export_has_notified(CDir *dir, int who) {
+ assert(is_exporting(dir));
+ assert(export_state[dir] == EXPORT_NOTIFYING);
+ return (export_notify_ack_waiting[dir].count(who) == 0);
+ }
// -- misc --
void handle_mds_failure_or_stop(int who);