StoreIOState::Pointer sio;
/// Decision states for StoreEntry::swapoutPossible() and related code.
- typedef enum { swNeedsCheck = 0, swImpossible = -1, swPossible = +1 } Decision;
+ typedef enum { swNeedsCheck = 0, swImpossible = -1, swPossible = +1, swStarted } Decision;
Decision decision; ///< current decision state
};
e->swap_dirn << ", fileno " << std::hex << std::setw(8) << std::setfill('0') <<
std::uppercase << e->swap_filen);
e->swap_status = SWAPOUT_WRITING;
+ mem->swapout.decision = MemObject::SwapOut::swStarted;
/* If we start swapping out objects with OutOfBand Metadata,
* then this code needs changing
*/
assert(mem_obj);
MemObject::SwapOut::Decision &decision = mem_obj->swapout.decision;
- // if we decided that swapout is not possible, do not repeat same checks
+ // if we decided that starting is not possible, do not repeat same checks
if (decision == MemObject::SwapOut::swImpossible) {
debugs(20, 3, HERE << " already rejected");
return false;
}
- // if we decided that swapout is possible, do not repeat same checks
- if (decision == MemObject::SwapOut::swPossible) {
- debugs(20, 3, HERE << "already allowed");
- return true;
- }
-
// if we swapped out already, do not start over
if (swap_status == SWAPOUT_DONE) {
debugs(20, 3, HERE << "already did");
return false;
}
+ // if we stared swapping out already, do not start over
+ if (decision == MemObject::SwapOut::swStarted) {
+ debugs(20, 3, "already started");
+ decision = MemObject::SwapOut::swImpossible;
+ return false;
+ }
+
+ // if we decided that swapout is possible, do not repeat same checks
+ if (decision == MemObject::SwapOut::swPossible) {
+ debugs(20, 3, "already allowed");
+ return true;
+ }
+
if (!checkCachable()) {
debugs(20, 3, HERE << "not cachable");
decision = MemObject::SwapOut::swImpossible;