]> git.ipfire.org Git - thirdparty/squid.git/blame - src/DelayTagged.cc
CI: Upgrade GitHub Setup Node and CodeQL actions to Node 20 (#1845)
[thirdparty/squid.git] / src / DelayTagged.cc
CommitLineData
1e5562e3 1/*
b8ae064d 2 * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
26ac0430 3 *
bbc27441
AJ
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
1e5562e3 7 */
8
bbc27441
AJ
9/* DEBUG: section 77 Delay Pools */
10
f7f3304a 11#include "squid.h"
1e5562e3 12
9a0a18de 13#if USE_DELAY_POOLS
1b76e6c1 14#include "comm/Connection.h"
1e5562e3 15#include "DelayTagged.h"
1e5562e3 16#include "NullDelayId.h"
17#include "Store.h"
18
1e5562e3 19DelayTagged::DelayTagged()
20{
21 DelayPools::registerForUpdates (this);
22}
23
1e4f953d 24static Splay<DelayTaggedBucket::Pointer>::SPLAYFREE DelayTaggedFree;
1e5562e3 25
26DelayTagged::~DelayTagged()
27{
28 DelayPools::deregisterForUpdates (this);
d6349cfb 29 buckets.destroy(DelayTaggedFree);
1e5562e3 30}
31
1e4f953d 32static Splay<DelayTaggedBucket::Pointer>::SPLAYCMP DelayTaggedCmp;
1e5562e3 33
34int
35DelayTaggedCmp(DelayTaggedBucket::Pointer const &left, DelayTaggedBucket::Pointer const &right)
36{
37 /* for rate limiting, case insensitive */
bb790702 38 return left->tag.caseCmp(right->tag);
1e5562e3 39}
40
41void
42DelayTaggedFree(DelayTaggedBucket::Pointer &)
43{}
44
f5dc4237
FC
45struct DelayTaggedStatsVisitor {
46 StoreEntry *sentry;
d6349cfb 47 explicit DelayTaggedStatsVisitor(StoreEntry *se): sentry(se) {}
f5dc4237
FC
48 void operator() (DelayTaggedBucket::Pointer const &current) {
49 current->stats(sentry);
50 }
51};
1e5562e3 52
53void
54DelayTagged::stats(StoreEntry * sentry)
55{
56 spec.stats (sentry, "Per Tag");
57
58 if (spec.restore_bps == -1)
59 return;
60
61 storeAppendPrintf(sentry, "\t\tCurrent: ");
62
f5dc4237 63 if (buckets.empty()) {
1e5562e3 64 storeAppendPrintf (sentry, "Not used yet.\n\n");
65 return;
66 }
67
f5dc4237
FC
68 DelayTaggedStatsVisitor visitor(sentry);
69 buckets.visit(visitor);
1e5562e3 70 storeAppendPrintf(sentry, "\n\n");
71}
72
73void
74DelayTagged::dump(StoreEntry *entry) const
75{
76 spec.dump(entry);
77}
78
26ac0430
AJ
79struct DelayTaggedUpdater {
80 DelayTaggedUpdater (DelaySpec &_spec, int _incr):spec(_spec),incr(_incr) {};
1e5562e3 81
82 DelaySpec spec;
83 int incr;
84};
85
d6349cfb
FC
86struct DelayTaggedUpdateVisitor {
87 DelayTaggedUpdater *updater;
88 explicit DelayTaggedUpdateVisitor(DelayTaggedUpdater *u) : updater(u) {}
89 void operator() (DelayTaggedBucket::Pointer const &current) {
90 const_cast<DelayTaggedBucket *>(current.getRaw())->theBucket.update(updater->spec, updater->incr);
91 }
92};
93
1e5562e3 94void
95DelayTagged::update(int incr)
96{
97 DelayTaggedUpdater updater(spec, incr);
d6349cfb
FC
98 DelayTaggedUpdateVisitor visitor(&updater);
99 buckets.visit(visitor);
44453ab4 100 kickReads();
1e5562e3 101}
102
103void
104DelayTagged::parse()
105{
106 spec.parse();
107}
108
109DelayIdComposite::Pointer
110
111DelayTagged::id(CompositePoolNode::CompositeSelectionDetails &details)
112{
b78b376d 113 if (!details.tag.length())
1e5562e3 114 return new NullDelayId;
115
116 return new Id(this, details.tag);
117}
118
b78b376d 119DelayTaggedBucket::DelayTaggedBucket(const SBuf &aTag): tag(aTag)
1e5562e3 120{
bf8fe701 121 debugs(77, 3, "DelayTaggedBucket::DelayTaggedBucket");
1e5562e3 122}
123
124DelayTaggedBucket::~DelayTaggedBucket()
125{
bf8fe701 126 debugs(77, 3, "DelayTaggedBucket::~DelayTaggedBucket");
1e5562e3 127}
128
129void
78b06ec5 130DelayTaggedBucket::stats(StoreEntry *entry) const
1e5562e3 131{
b78b376d 132 storeAppendPrintf(entry, " " SQUIDSBUFPH ":", SQUIDSBUFPRINT(tag));
78b06ec5 133 theBucket.stats(entry);
1e5562e3 134}
135
b78b376d 136DelayTagged::Id::Id(const DelayTagged::Pointer &aDelayTagged, const SBuf &aTag): theTagged(aDelayTagged)
1e5562e3 137{
138 theBucket = new DelayTaggedBucket(aTag);
139 DelayTaggedBucket::Pointer const *existing = theTagged->buckets.find(theBucket, DelayTaggedCmp);
140
141 if (existing) {
142 theBucket = *existing;
143 return;
144 }
145
146 theBucket->theBucket.init(theTagged->spec);
d6349cfb 147 theTagged->buckets.insert (theBucket, DelayTaggedCmp);
1e5562e3 148}
149
150DelayTagged::Id::~Id()
151{
bf8fe701 152 debugs(77, 3, "DelayTagged::Id::~Id");
1e5562e3 153}
154
155int
156DelayTagged::Id::bytesWanted (int min, int max) const
157{
158 return theBucket->theBucket.bytesWanted(min,max);
159}
160
161void
162DelayTagged::Id::bytesIn(int qty)
163{
164 theBucket->theBucket.bytesIn(qty);
165}
166
288d8048 167void
a928fdfd 168DelayTagged::Id::delayRead(const AsyncCall::Pointer &aRead)
288d8048 169{
170 theTagged->delayRead(aRead);
171}
172
1e5562e3 173#endif
f53969cc 174