dout(10) << "dequeue_op " << *op << " pg " << *pg
<< ", " << (pending_ops-1) << " more pending"
<< dendl;
+
+ // share map?
+ // do this preemptively while we hold osd_lock and pg->lock
+ // to avoid lock ordering issues later.
+ for (unsigned i=1; i<pg->acting.size(); i++)
+ _share_map_outgoing( osdmap->get_inst(pg->acting[i]) );
}
osd_lock.Unlock();
//current implementation is moving averges.
class LoadCalculator {
private:
+ Mutex lock;
deque<double> m_Data ;
unsigned m_Size ;
double m_Total ;
LoadCalculator( unsigned size ) : m_Size(0), m_Total(0) { }
void add( double element ) {
+ Mutex::Locker locker(lock);
+
// add item
m_Data.push_back(element);
m_Total += element;
}
double get_average() {
+ Mutex::Locker locker(lock);
+
if (m_Data.empty())
return -1;
return m_Total / (double)m_Data.size();
iat_data() : last_req_stamp(0), average_iat(0) {}
};
private:
+ mutable Mutex lock;
double alpha;
hash_map<object_t, iat_data> iat_map;
IATAverager(double a) : alpha(a) {}
void add_sample(object_t oid, double now) {
+ Mutex::Locker locker(lock);
iat_data &r = iat_map[oid];
double iat = now - r.last_req_stamp;
r.last_req_stamp = now;
}
bool have(object_t oid) const {
+ Mutex::Locker locker(lock);
return iat_map.count(oid);
}
double get_average_iat(object_t oid) const {
+ Mutex::Locker locker(lock);
hash_map<object_t, iat_data>::const_iterator p = iat_map.find(oid);
assert(p != iat_map.end());
return p->second.average_iat;
}
bool is_flash_crowd_candidate(object_t oid) const {
+ Mutex::Locker locker(lock);
return get_average_iat(oid) <= g_conf.osd_flash_crowd_iat_threshold;
}
};
public:
void lock() {
- cout << this << " " << info.pgid << " lock" << endl;
+ //cout << this << " " << info.pgid << " lock" << endl;
_lock.Lock();
}
void unlock() {
- cout << this << " " << info.pgid << " unlock" << endl;
+ //cout << this << " " << info.pgid << " unlock" << endl;
_lock.Unlock();
}
void get() {
- cout << this << " " << info.pgid << " get " << ref << endl;
+ //cout << this << " " << info.pgid << " get " << ref << endl;
assert(_lock.is_locked());
++ref;
}
void put() {
- cout << this << " " << info.pgid << " put " << ref << endl;
+ //cout << this << " " << info.pgid << " put " << ref << endl;
assert(_lock.is_locked());
--ref;
assert(ref > 0); // last put must be a put_unlock.
}
void put_unlock() {
- cout << this << " " << info.pgid << " put_unlock " << ref << endl;
+ //cout << this << " " << info.pgid << " put_unlock " << ref << endl;
assert(_lock.is_locked());
--ref;
_lock.Unlock();
}
- // share latest osd map with rest of pg?
- osd->osd_lock.Lock();
- {
- for (unsigned i=1; i<acting.size(); i++) {
- osd->_share_map_outgoing( osd->osdmap->get_inst(acting[i]) );
- }
- }
- osd->osd_lock.Unlock();
-
-
// dup op?
if (is_dup(op->get_reqid())) {
dout(-3) << "op_modify " << opname << " dup op " << op->get_reqid()