MOSDMap *mm = static_cast<MOSDMap*>(m);
Session *s = static_cast<Session*>(m->get_connection()->get_priv());
if (s) {
- s->received_map_lock.Lock();
+ s->received_map_lock.lock();
s->received_map_epoch = mm->get_last();
- s->received_map_lock.Unlock();
+ s->received_map_lock.unlock();
s->put();
}
}
Session *s = static_cast<Session*>(op->get_req()->
get_connection()->get_priv());
if (s) {
- s->received_map_lock.Lock();
+ s->received_map_lock.lock();
epoch_t received_epoch = s->received_map_epoch;
- s->received_map_lock.Unlock();
+ s->received_map_lock.unlock();
if (received_epoch < msg_epoch) {
osdmap_subscribe(msg_epoch, false);
}
void finish(ThreadPool::TPHandle& tp) {
OSD::Session *session = static_cast<OSD::Session *>(
con->get_priv());
+ epoch_t last_sent_epoch;
if (session) {
- session->sent_epoch_lock.Lock();
+ session->sent_epoch_lock.lock();
+ last_sent_epoch = session->last_sent_epoch;
+ session->sent_epoch_lock.unlock();
}
osd->service.share_map(
name,
con.get(),
map_epoch,
osdmap,
- session ? &session->last_sent_epoch : NULL);
+ session ? &last_sent_epoch : NULL);
if (session) {
- session->sent_epoch_lock.Unlock();
+ session->sent_epoch_lock.lock();
+ if (session->last_sent_epoch < last_sent_epoch) {
+ session->last_sent_epoch = last_sent_epoch;
+ }
+ session->sent_epoch_lock.unlock();
session->put();
}
}
send_map_on_destruct share_map(this, m, osdmap, m->get_map_epoch());
Session *client_session =
static_cast<Session*>(m->get_connection()->get_priv());
+ epoch_t last_sent_epoch;
if (client_session) {
- client_session->sent_epoch_lock.Lock();
+ client_session->sent_epoch_lock.lock();
+ last_sent_epoch = client_session->last_sent_epoch;
+ client_session->sent_epoch_lock.unlock();
}
share_map.should_send = service.should_share_map(
m->get_source(), m->get_connection().get(), m->get_map_epoch(),
- osdmap, &client_session->last_sent_epoch);
+ osdmap, client_session ? &last_sent_epoch : NULL);
if (client_session) {
- client_session->sent_epoch_lock.Unlock();
client_session->put();
}
bool should_share_map = false;
Session *peer_session =
static_cast<Session*>(m->get_connection()->get_priv());
+ epoch_t last_sent_epoch;
if (peer_session) {
- peer_session->sent_epoch_lock.Lock();
+ peer_session->sent_epoch_lock.lock();
+ last_sent_epoch = peer_session->last_sent_epoch;
+ peer_session->sent_epoch_lock.unlock();
}
should_share_map = service.should_share_map(
m->get_source(), m->get_connection().get(), m->map_epoch,
osdmap,
- peer_session ? &peer_session->last_sent_epoch : NULL);
+ peer_session ? &last_sent_epoch : NULL);
if (peer_session) {
- peer_session->sent_epoch_lock.Unlock();
peer_session->put();
}
if (op->send_map_update) {
Message *m = op->get_req();
Session *session = static_cast<Session *>(m->get_connection()->get_priv());
+ epoch_t last_sent_epoch;
if (session) {
- session->sent_epoch_lock.Lock();
+ session->sent_epoch_lock.lock();
+ last_sent_epoch = session->last_sent_epoch;
+ session->sent_epoch_lock.unlock();
}
service.share_map(
m->get_source(),
m->get_connection().get(),
op->sent_epoch,
osdmap,
- session ? &session->last_sent_epoch : NULL);
+ session ? &last_sent_epoch : NULL);
if (session) {
- session->sent_epoch_lock.Unlock();
+ session->sent_epoch_lock.lock();
+ if (session->last_sent_epoch < last_sent_epoch) {
+ session->last_sent_epoch = last_sent_epoch;
+ }
+ session->sent_epoch_lock.unlock();
session->put();
}
}
#include "common/sharedptr_registry.hpp"
#include "common/PrioritizedQueue.h"
#include "messages/MOSDOp.h"
+#include "include/Spinlock.h"
#define CEPH_OSD_PROTOCOL 10 /* cluster internal */
OSDMapRef osdmap; /// Map as of which waiting_for_pg is current
map<spg_t, list<OpRequestRef> > waiting_for_pg;
- Mutex sent_epoch_lock;
+ Spinlock sent_epoch_lock;
epoch_t last_sent_epoch;
- Mutex received_map_lock;
+ Spinlock received_map_lock;
epoch_t received_map_epoch; // largest epoch seen in MOSDMap from here
Session(CephContext *cct) :
RefCountedObject(cct),
auid(-1), con(0),
- session_dispatch_lock("Session::session_dispatch_lock"),
- sent_epoch_lock("Session::sent_epoch_lock"), last_sent_epoch(0),
- received_map_lock("Session::received_map_lock"), received_map_epoch(0)
+ session_dispatch_lock("Session::session_dispatch_lock"),
+ last_sent_epoch(0), received_map_epoch(0)
{}