lock->encode_locked_state(data);
mds->send_message_mds(new MLock(lock, LOCK_AC_LOCKACK, mds->get_nodeid(), data), auth);
((ScatterLock *)lock)->start_flush();
+ // we'll get an AC_LOCKFLUSHED to complete
}
break;
lock->finish_flush();
+ // if replicas may have flushed in a mix->lock state, send another
+ // message so they can finish_flush().
+ if (in->is_replicated()) {
+ switch (lock->get_state()) {
+ case LOCK_MIX_LOCK:
+ case LOCK_MIX_EXCL:
+ case LOCK_MIX_TSYN:
+ send_lock_message(lock, LOCK_AC_LOCKFLUSHED);
+ }
+ }
+
mut->apply();
drop_locks(mut);
mut->cleanup();
break;
}
+ ((ScatterLock *)lock)->finish_flush();
+
// ok
lock->decode_locked_state(m->get_data());
lock->set_state(LOCK_SYNC);
- ((ScatterLock *)lock)->finish_flush();
-
lock->get_rdlock();
lock->finish_waiters(SimpleLock::WAIT_RD|SimpleLock::WAIT_STABLE);
lock->put_rdlock();
eval_gather(lock, true);
break;
+
+ case LOCK_AC_LOCKFLUSHED:
+ ((ScatterLock *)lock)->finish_flush();
+ break;
case LOCK_AC_MIX:
assert(lock->get_state() == LOCK_SYNC ||
lock->decode_locked_state(m->get_data());
lock->set_state(LOCK_MIX);
- ((ScatterLock *)lock)->finish_flush();
-
if (caps)
issue_caps(in);
#define LOCK_AC_SYNC -1
#define LOCK_AC_MIX -2
#define LOCK_AC_LOCK -3
+#define LOCK_AC_LOCKFLUSHED -4
// for auth
#define LOCK_AC_SYNCACK 1
case LOCK_AC_SYNC: return "sync";
case LOCK_AC_MIX: return "mix";
case LOCK_AC_LOCK: return "lock";
+ case LOCK_AC_LOCKFLUSHED: return "lockflushed";
case LOCK_AC_SYNCACK: return "syncack";
case LOCK_AC_MIXACK: return "mixack";