bool pausewr = osdmap->test_flag(CEPH_OSDMAP_PAUSEWR) || osdmap_full_flag();
// was/is paused?
- if (was_pauserd || was_pausewr || pauserd || pausewr) {
+ if (was_pauserd || was_pausewr || pauserd || pausewr || osdmap->get_epoch() < epoch_barrier) {
int r = _maybe_request_map();
assert(r == 0);
}
bool pausewr = osdmap->test_flag(CEPH_OSDMAP_PAUSEWR) || osdmap_full_flag();
return (t->flags & CEPH_OSD_FLAG_READ && pauserd) ||
- (t->flags & CEPH_OSD_FLAG_WRITE && pausewr);
+ (t->flags & CEPH_OSD_FLAG_WRITE && pausewr) ||
+ (osdmap->get_epoch() < epoch_barrier);
}
assert(!logger);
}
+/**
+ * Wait until this OSD map epoch is received before
+ * sending any more operations to OSDs. Use this
+ * when it is known that the client can't trust
+ * anything from before this epoch (e.g. due to
+ * client blacklist at this epoch).
+ */
+void Objecter::set_epoch_barrier(epoch_t epoch)
+{
+ RWLock::WLocker wl(rwlock);
+
+ ldout(cct, 7) << __func__ << ": barrier " << epoch << " (was " << epoch_barrier
+ << ") current epoch " << osdmap->get_epoch() << dendl;
+ if (epoch >= epoch_barrier) {
+ epoch_barrier = epoch;
+ _maybe_request_map();
+ }
+}
+
mon_timeout(mon_timeout),
osd_timeout(osd_timeout),
op_throttle_bytes(cct, "objecter_bytes", cct->_conf->objecter_inflight_op_bytes),
- op_throttle_ops(cct, "objecter_ops", cct->_conf->objecter_inflight_ops)
+ op_throttle_ops(cct, "objecter_ops", cct->_conf->objecter_inflight_ops),
+ epoch_barrier(0)
{ }
~Objecter();
bool force_new);
void blacklist_self(bool set);
+
+private:
+ epoch_t epoch_barrier;
+public:
+ void set_epoch_barrier(epoch_t epoch);
};
#endif