/*
- * DEBUG: section 54 Interprocess Communication
+ * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
+ *
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
*/
+/* DEBUG: section 54 Interprocess Communication */
+
#include "squid.h"
#include "base/TextException.h"
#include "globals.h"
#include "ipc/Kids.h"
-#include "tools.h"
#include "SquidConfig.h"
+#include "tools.h"
Kids TheKids;
-KidName TheKidName;
+SBuf TheKidName;
Kids::Kids()
{
/// maintain n kids
void Kids::init()
{
- if (storage.size() > 0)
- storage.clean();
+ storage.clear();
storage.reserve(NumberOfKids());
- char kid_name[32];
-
- // add Kid records for all workers
- for (int i = 0; i < Config.workers; ++i) {
- snprintf(kid_name, sizeof(kid_name), "(squid-%d)", (int)(storage.size()+1));
- storage.push_back(Kid(kid_name));
- }
+ for (int i = 0; i < Config.workers; ++i)
+ storage.emplace_back("squid", storage.size() + 1);
// add Kid records for all disk processes
- for (int i = 0; i < Config.cacheSwap.n_strands; ++i) {
- snprintf(kid_name, sizeof(kid_name), "(squid-disk-%d)", (int)(storage.size()+1));
- storage.push_back(Kid(kid_name));
- }
+ for (int i = 0; i < Config.cacheSwap.n_strands; ++i)
+ storage.emplace_back("squid-disk", storage.size() + 1);
// if coordination is needed, add a Kid record for Coordinator
- if (storage.size() > 1) {
- snprintf(kid_name, sizeof(kid_name), "(squid-coord-%d)", (int)(storage.size()+1));
- storage.push_back(Kid(kid_name));
- }
+ if (storage.size() > 1)
+ storage.emplace_back("squid-coord", storage.size() + 1);
Must(storage.size() == static_cast<size_t>(NumberOfKids()));
}
return true;
}
+void
+Kids::forgetAllFailures()
+{
+ for (auto &kid: storage)
+ kid.forgetFailures();
+}
+
+time_t
+Kids::forgetOldFailures()
+{
+ time_t nextCheckDelay = 0;
+ for (auto &kid: storage) {
+ if (!kid.hopeless())
+ continue;
+
+ const auto deathDuration = kid.deathDuration(); // protect from time changes
+ if (Config.hopelessKidRevivalDelay <= deathDuration) {
+ kid.forgetFailures(); // this kid will be revived now
+ continue;
+ }
+
+ const auto remainingDeathTime = Config.hopelessKidRevivalDelay - deathDuration;
+ assert(remainingDeathTime > 0);
+ if (remainingDeathTime < nextCheckDelay || !nextCheckDelay)
+ nextCheckDelay = remainingDeathTime;
+ }
+ return nextCheckDelay; // still zero if there were no still-hopeless kids
+}
+
/// whether all kids called exited happy
bool Kids::allExitedHappy() const
{
{
return storage.size();
}
+