// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/storage/blobfs/cache-node.h"

#include <digest/digest.h>

#include "src/storage/blobfs/blob-cache.h"

using digest::Digest;

namespace blobfs {

void CacheNode::fbl_recycle() {
  if (ShouldCache()) {
    // Migrate from the open cache to the closed cache, keeping the Vnode alive.
    //
    // If the node has already been evicted, it is destroyed.
    Cache().Downgrade(this);
  } else {
    // Destroy blobs which don't want to be cached.
    //
    // If we're deleting this node, it must not exist in either hash.
    Cache().EvictUnsafe(this, true);
    ZX_DEBUG_ASSERT(!InContainer());
    delete this;
  }
}

CacheNode::CacheNode(const Digest& digest, std::optional<CachePolicy> override_cache_policy)
    : overriden_cache_policy_(override_cache_policy) {
  digest.CopyTo(digest_, sizeof(digest_));
}
CacheNode::~CacheNode() = default;

}  // namespace blobfs
