class LRUObject {
private:
LRUObject *lru_next, *lru_prev;
- bool lru_expireable;
+ bool lru_pinned;
class LRU *lru;
class LRUList *lru_list;
LRUObject() {
lru_next = lru_prev = NULL;
lru_list = 0;
- lru_expireable = true;
+ lru_pinned = false;
lru = 0;
}
// pin/unpin item in cache
void lru_pin();
void lru_unpin();
- bool lru_is_expireable() { return lru_expireable; }
+ bool lru_is_expireable() { return !lru_pinned; }
friend class LRU;
friend class LRUList;
lru_max = max;
}
- __uint32_t lru_get_size() {
- return lru_num;
- }
- __uint32_t lru_get_max() {
- return lru_max;
- }
- __uint32_t lru_get_num_pinned() {
- return lru_num_pinned;
- }
+ __uint32_t lru_get_size() { return lru_num; }
+ __uint32_t lru_get_top() { return lru_top.get_length(); }
+ __uint32_t lru_get_bot() { return lru_bot.get_length(); }
+ __uint32_t lru_get_pintail() { return lru_pintail.get_length(); }
+ __uint32_t lru_get_max() { return lru_max; }
+ __uint32_t lru_get_num_pinned() { return lru_num_pinned; }
+
void lru_set_max(__uint32_t m) { lru_max = m; }
void lru_set_midpoint(float f) { lru_midpoint = f; }
o->lru = this;
lru_top.insert_head( o );
lru_num++;
- lru_num_pinned += !o->lru_expireable;
+ if (o->lru_pinned) lru_num_pinned++;
lru_adjust();
}
o->lru = this;
lru_bot.insert_head(o);
lru_num++;
- lru_num_pinned += !o->lru_expireable;
+ if (o->lru_pinned) lru_num_pinned++;
}
// insert at bottom of lru
o->lru = this;
lru_bot.insert_tail(o);
lru_num++;
- lru_num_pinned += !o->lru_expireable;
+ if (o->lru_pinned) lru_num_pinned++;
}
+ /*
// insert at bottom of lru
void lru_insert_pintail(LRUObject *o) {
assert(!o->lru);
o->lru = this;
- assert(!o->lru_is_expireable());
+ assert(o->lru_pinned);
lru_pintail.insert_head(o);
lru_num++;
- lru_num_pinned += !o->lru_expireable;
+ lru_num_pinned += o->lru_pinned;
}
+ */
if (!lru_max) return;
__uint32_t topwant = (__uint32_t)(lru_midpoint * (double)lru_max);
- while (0 && lru_top.get_length() > 0 &&
+ while (lru_top.get_length() > 0 &&
lru_top.get_length() > topwant) {
// remove from tail of top, stick at head of bot
// FIXME: this could be way more efficient by moving a whole chain of items.
assert(0);
lru_num--;
- lru_num_pinned -= !o->lru_expireable;
+ if (o->lru_pinned) lru_num_pinned--;
o->lru = 0;
return o;
}
while (lru_bot.get_length()) {
p = lru_bot.get_tail();
- if (p->lru_expireable)
+ if (!p->lru_pinned)
return lru_remove(p); // yay.
// move to pintail
+ lru_bot.remove(p);
lru_pintail.insert_head(p);
}
// ok, try head then
while (lru_top.get_length()) {
p = lru_top.get_tail();
- if (p->lru_expireable)
+ if (!p->lru_pinned)
return lru_remove( p );
// move to pintail
+ lru_top.remove(p);
lru_pintail.insert_head(p);
}
inline void LRUObject::lru_pin()
{
- lru_expireable = false;
+ lru_pinned = true;
if (lru) lru->lru_num_pinned++;
}
inline void LRUObject::lru_unpin() {
- lru_expireable = true;
+ lru_pinned = false;
if (lru) {
lru->lru_num_pinned--;
- // move out of tail?
+ // move from pintail -> bot
if (lru_list == &lru->lru_pintail) {
lru->lru_pintail.remove(this);
lru->lru_bot.insert_tail(this);
export_empty_import(diri->dir);
}
+
+ mds->logger->inc("cex");
}
/* hack
// log some stats *****
mds->logger->set("c", lru.lru_get_size());
mds->logger->set("cpin", lru.lru_get_num_pinned());
- mds->logger->set("cmax", lru.lru_get_max());
+ mds->logger->set("ctop", lru.lru_get_top());
+ mds->logger->set("cbot", lru.lru_get_bot());
+ mds->logger->set("cptail", lru.lru_get_pintail());
if (g_conf.log_pins) {
// pin
mds_logtype.add_inc("fw");
mds_logtype.add_inc("cfw");
+ mds_logtype.add_set("cmax");
mds_logtype.add_set("c");
+ mds_logtype.add_set("ctop");
+ mds_logtype.add_set("cbot");
+ mds_logtype.add_set("cptail");
mds_logtype.add_set("cpin");
- mds_logtype.add_set("cmax");
+ mds_logtype.add_inc("cex");
mds_logtype.add_inc("dis");
mds_logtype.add_inc("cmiss");
mds_logtype.add_set("nex");
mds_logtype.add_set("nim");
+ mds->logger->set("cmax", lru.lru_get_max());
+
+
char n[80];
sprintf(n, "mds%d.cache", whoami);
logger2 = new Logger(n, (LogType*)&mds_cache_logtype);
if (messenger) { delete messenger; messenger = NULL; }
if (logger) { delete logger; logger = 0; }
+ if (logger2) { delete logger2; logger2 = 0; }
}