/*
- * Copyright (C) 1996-2018 The Squid Software Foundation and contributors
+ * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
*
* Squid software is distributed under GPLv2+ license and includes
* contributions from numerous individuals and organizations.
*/
#include "squid.h"
-#include "Debug.h"
+#include "debug/Stream.h"
#include "event.h"
#include "globals.h"
#include "mgr/Registration.h"
#include "PeerDigest.h"
#include "refresh.h"
#include "SquidConfig.h"
-#include "SquidTime.h"
#include "Store.h"
#include "StoreSearch.h"
#include "util.h"
StoreDigestCBlock cblock;
int rebuild_lock = 0; ///< bucket number
StoreEntry * rewrite_lock = nullptr; ///< points to store entry with the digest
+ StoreEntry * publicEntry = nullptr; ///< points to the previous store entry with the digest
StoreSearchPointer theSearch;
int rewrite_offset = 0;
int rebuild_count = 0;
#if USE_CACHE_DIGESTS
if (!Config.onoff.digest_generation) {
- store_digest = NULL;
+ store_digest = nullptr;
debugs(71, 3, "Local cache digest generation disabled");
return;
}
#if USE_CACHE_DIGESTS
if (Config.onoff.digest_generation) {
- storeDigestRebuildStart(NULL);
- storeDigestRewriteStart(NULL);
+ storeDigestRebuildStart(nullptr);
+ storeDigestRewriteStart(nullptr);
}
#endif
debugs(71, 6, "storeDigestDel: deled entry, key: " << entry->getMD5Text());
}
}
+#else
+ (void)entry;
#endif //USE_CACHE_DIGESTS
}
} else {
storeAppendPrintf(e, "store digest: disabled.\n");
}
-
+#else
+ (void)e;
#endif //USE_CACHE_DIGESTS
}
/* rebuilds digest from scratch */
static void
-storeDigestRebuildStart(void *datanotused)
+storeDigestRebuildStart(void *)
{
assert(store_digest);
/* prevent overlapping if rebuild schedule is too tight */
sd_stats = StoreDigestStats();
- eventAdd("storeDigestRebuildStep", storeDigestRebuildStep, NULL, 0.0, 1);
+ eventAdd("storeDigestRebuildStep", storeDigestRebuildStep, nullptr, 0.0, 1);
}
/* finishes swap out sequence for the digest; schedules next rebuild */
sd_state.rebuild_lock = 0;
++sd_state.rebuild_count;
debugs(71, 2, "storeDigestRebuildFinish: done.");
- eventAdd("storeDigestRebuildStart", storeDigestRebuildStart, NULL, (double)
+ eventAdd("storeDigestRebuildStart", storeDigestRebuildStart, nullptr, (double)
Config.digest.rebuild_period, 1);
/* resume pending Rewrite if any */
/* recalculate a few hash buckets per invocation; schedules next step */
static void
-storeDigestRebuildStep(void *datanotused)
+storeDigestRebuildStep(void *)
{
/* TODO: call Store::Root().size() to determine this.. */
int count = Config.Store.objectsPerBucket * (int) ceil((double) store_hash_buckets *
if (sd_state.theSearch->isDone())
storeDigestRebuildFinish();
else
- eventAdd("storeDigestRebuildStep", storeDigestRebuildStep, NULL, 0.0, 1);
+ eventAdd("storeDigestRebuildStep", storeDigestRebuildStep, nullptr, 0.0, 1);
}
/* starts swap out sequence for the digest */
static void
-storeDigestRewriteStart(void *datanotused)
+storeDigestRewriteStart(void *)
{
assert(store_digest);
/* prevent overlapping if rewrite schedule is too tight */
debugs(71, 2, "storeDigestRewrite: start rewrite #" << sd_state.rewrite_count + 1);
const char *url = internalLocalUri("/squid-internal-periodic/", SBuf(StoreDigestFileName));
- const MasterXaction::Pointer mx = new MasterXaction(XactionInitiator::initCacheDigest);
- auto req = HttpRequest::FromUrl(url, mx);
+ const auto mx = MasterXaction::MakePortless<XactionInitiator::initCacheDigest>();
+ auto req = HttpRequest::FromUrlXXX(url, mx);
RequestFlags flags;
- flags.cachable = true;
+ flags.cachable.support(); // prevent RELEASE_REQUEST in storeCreateEntry()
StoreEntry *e = storeCreateEntry(url, url, flags, Http::METHOD_GET);
assert(e);
e = sd_state.rewrite_lock;
sd_state.rewrite_offset = 0;
EBIT_SET(e->flags, ENTRY_SPECIAL);
- /* setting public key will purge old digest entry if any */
+ /* setting public key will mark the old digest entry for removal once unlocked */
e->setPublicKey();
+ if (const auto oldEntry = sd_state.publicEntry) {
+ oldEntry->release(true);
+ sd_state.publicEntry = nullptr;
+ oldEntry->unlock("storeDigestRewriteResume");
+ }
+ assert(e->locked());
+ sd_state.publicEntry = e;
/* fake reply */
HttpReply *rep = new HttpReply;
rep->setHeaders(Http::scOkay, "Cache Digest OK",
" (" << std::showpos << (int) (e->expires - squid_curtime) << ")");
/* is this the write order? @?@ */
e->mem_obj->unlinkRequest();
- e->unlock("storeDigestRewriteFinish");
- sd_state.rewrite_lock = NULL;
+ sd_state.rewrite_lock = nullptr;
++sd_state.rewrite_count;
- eventAdd("storeDigestRewriteStart", storeDigestRewriteStart, NULL, (double)
+ eventAdd("storeDigestRewriteStart", storeDigestRewriteStart, nullptr, (double)
Config.digest.rewrite_period, 1);
/* resume pending Rebuild if any */