Status Driver::insertAsync()

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;
}