* `+http://example.com/*|shards=alpha,beta+` will put 50% of the cache on
`+http://example.com/alpha+` and 50% on `+http://example.com/beta+`.
--
-* *share-hits*: If *true*, write hits for this backend to primary storage. The
- default is *true*.
=== Storage interaction
| *Primary storage* | *Secondary storage* | *What happens*
| miss | miss | Compile, write to primary, write to secondary^[1]^
-| miss | hit | Read from secondary, write to primary^[2]^
-| hit | - | Read from primary, don't write to secondary^[3]^
+| miss | hit | Read from secondary, write to primary
+| hit | - | Read from primary, don't write to secondary^[2]^
|==============================================================================
^[1]^ Unless secondary storage has attribute `read-only=true`. +
-^[2]^ Unless secondary storage has attribute `share-hits=false`. +
-^[3]^ Unless primary storage is set to share its cache hits with the
+^[2]^ Unless primary storage is set to share its cache hits with the
<<config_reshare,*reshare*>> option.
#include <third_party/url.hpp>
-#include <algorithm>
#include <cmath>
#include <unordered_map>
#include <vector>
std::vector<SecondaryStorageShardConfig> shards;
secondary::SecondaryStorage::Backend::Params params;
bool read_only = false;
- bool share_hits = true;
};
struct SecondaryStorageBackendEntry
result.shards.push_back({std::string(name), weight});
}
- } else if (key == "share-hits") {
- result.share_hits = (value == "true");
}
result.params.attributes.push_back(
return std::nullopt;
}
- const auto value_and_share_hits = get_from_secondary_storage(key);
- if (!value_and_share_hits) {
+ const auto value = get_from_secondary_storage(key);
+ if (!value) {
return std::nullopt;
}
- const auto& value = value_and_share_hits->first;
- const auto& share_hits = value_and_share_hits->second;
TemporaryFile tmp_file(FMT("{}/tmp.get", m_config.temporary_dir()));
m_tmp_files.push_back(tmp_file.path);
try {
- util::write_file(tmp_file.path, value);
+ util::write_file(tmp_file.path, *value);
} catch (const core::Error& e) {
throw core::Fatal(FMT("Error writing to {}: {}", tmp_file.path, e.what()));
}
- if (share_hits) {
- primary.put(key, type, [&](const auto& path) {
- try {
- Util::ensure_dir_exists(Util::dir_name(path));
- Util::copy_file(tmp_file.path, path);
- } catch (const core::Error& e) {
- LOG("Failed to copy {} to {}: {}", tmp_file.path, path, e.what());
- // Don't indicate failure since get from primary storage was OK.
- }
- return true;
- });
- }
+ primary.put(key, type, [&](const auto& path) {
+ try {
+ Util::ensure_dir_exists(Util::dir_name(path));
+ Util::copy_file(tmp_file.path, path);
+ } catch (const core::Error& e) {
+ LOG("Failed to copy {} to {}: {}", tmp_file.path, path, e.what());
+ // Don't indicate failure since get from primary storage was OK.
+ }
+ return true;
+ });
return tmp_file.path;
}
}
}
-std::optional<std::pair<util::Blob, bool>>
+std::optional<util::Blob>
Storage::get_from_secondary_storage(const Digest& key)
{
MTR_SCOPE("secondary_storage", "get");
backend->url_for_logging,
ms);
primary.increment_statistic(core::Statistic::secondary_storage_hit);
- return std::make_pair(*value, entry->config.share_hits);
+ return *value;
} else {
LOG("No {} in {} ({:.2f} ms)",
key.to_string(),
#include <memory>
#include <optional>
#include <string>
-#include <utility>
#include <vector>
class Digest;
const Digest& key,
std::string_view operation_description,
const bool for_writing);
- std::optional<std::pair<util::Blob, bool>>
- get_from_secondary_storage(const Digest& key);
+ std::optional<util::Blob> get_from_secondary_storage(const Digest& key);
void put_in_secondary_storage(const Digest& key,
const util::Blob& value,
bool
SecondaryStorage::Backend::is_framework_attribute(const std::string& name)
{
- return name == "read-only" || name == "shards" || name == "share-hits";
+ return name == "read-only" || name == "shards";
}
std::chrono::milliseconds
expect_stat secondary_storage_miss 0
expect_file_count 3 '*' secondary # CACHEDIR.TAG + result + manifest
- # -------------------------------------------------------------------------
- TEST "Don't share hits"
-
- $CCACHE_COMPILE -c test.c
- expect_stat direct_cache_hit 0
- expect_stat cache_miss 1
- expect_stat files_in_cache 2
- expect_stat primary_storage_hit 0
- expect_stat primary_storage_miss 2
- expect_stat secondary_storage_hit 0
- expect_stat secondary_storage_miss 2
- expect_file_count 3 '*' secondary # CACHEDIR.TAG + result + manifest
-
- $CCACHE -C >/dev/null
- expect_stat files_in_cache 0
-
- CCACHE_SECONDARY_STORAGE+="|share-hits=false"
- $CCACHE_COMPILE -c test.c
- expect_stat direct_cache_hit 1
- expect_stat cache_miss 1
- expect_stat files_in_cache 0
- expect_stat primary_storage_hit 0
- expect_stat primary_storage_miss 4
- expect_stat secondary_storage_hit 2
- expect_stat secondary_storage_miss 2
- expect_file_count 3 '*' secondary # CACHEDIR.TAG + result + manifest
-
# -------------------------------------------------------------------------
TEST "Recache"