in cachelib/navy/driver/Driver.cpp [146:206]
Status Driver::insertAsync(BufferView key,
BufferView value,
InsertCallback cb) {
insertCount_.inc();
const HashedKey hk{key};
if (key.size() > kMaxKeySize) {
rejectedCount_.inc();
rejectedBytes_.add(hk.key().size() + value.size());
return Status::Rejected;
}
if (!admissionTest(hk, value)) {
return Status::Rejected;
}
scheduler_->enqueueWithKey(
[this, cb = std::move(cb), hk, value, skipInsertion = false]() mutable {
auto selection = select(hk.key(), value);
Status status = Status::Ok;
if (!skipInsertion) {
status = selection.first.insert(hk, value);
if (status == Status::Retry) {
return JobExitCode::Reschedule;
}
skipInsertion = true;
}
if (status != Status::DeviceError) {
auto rs = selection.second.remove(hk);
if (status == Status::Retry) {
return JobExitCode::Reschedule;
}
if (rs != Status::Ok && rs != Status::NotFound) {
XLOGF(ERR, "Insert failed to remove other: {}", toString(rs));
status = Status::BadState;
}
}
if (cb) {
cb(status, hk.key());
}
parcelMemory_.sub(hk.key().size() + value.size());
concurrentInserts_.dec();
switch (status) {
case Status::Ok:
succInsertCount_.inc();
break;
case Status::BadState:
case Status::DeviceError:
ioErrorCount_.inc();
break;
default:;
}
return JobExitCode::Done;
},
"insert",
JobType::Write,
hk.keyHash());
return Status::Ok;
}