}
break;
default:
- if (in_hit_set) {
- promote_object(obc, missing_oid, oloc, promote_op);
- } else {
- // Check if in other hit sets
- map<time_t,HitSetRef>::iterator itor;
- bool in_other_hit_sets = false;
- unsigned max_in_memory_read = pool.info.min_read_recency_for_promote > 0 ? pool.info.min_read_recency_for_promote - 1 : 0;
- unsigned max_in_memory_write = pool.info.min_write_recency_for_promote > 0 ? pool.info.min_write_recency_for_promote - 1 : 0;
- unsigned max_in_memory = MAX(max_in_memory_read, max_in_memory_write);
- for (itor = agent_state->hit_set_map.begin(); itor != agent_state->hit_set_map.end() && max_in_memory--; ++itor) {
- if (obc.get()) {
- if (obc->obs.oi.soid != hobject_t() && itor->second->contains(obc->obs.oi.soid)) {
- in_other_hit_sets = true;
- break;
- }
- } else {
- if (missing_oid != hobject_t() && itor->second->contains(missing_oid)) {
- in_other_hit_sets = true;
- break;
- }
- }
+ {
+ unsigned count = (int)in_hit_set;
+ if (count) {
+ // Check if in other hit sets
+ const hobject_t& oid = obc.get() ? obc->obs.oi.soid : missing_oid;
+ for (map<time_t,HitSetRef>::iterator itor = agent_state->hit_set_map.begin();
+ itor != agent_state->hit_set_map.end();
+ ++itor) {
+ if (!itor->second->contains(oid)) {
+ break;
+ }
+ ++count;
+ if (count >= recency) {
+ break;
+ }
+ }
}
- if (in_other_hit_sets) {
- promote_object(obc, missing_oid, oloc, promote_op);
+ if (count >= recency) {
+ promote_object(obc, missing_oid, oloc, promote_op);
} else {
// not promoting
- return false;
+ return false;
}
}
break;