]>
Commit | Line | Data |
---|---|---|
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 | 19 | DelayTagged::DelayTagged() |
20 | { | |
21 | DelayPools::registerForUpdates (this); | |
22 | } | |
23 | ||
1e4f953d | 24 | static Splay<DelayTaggedBucket::Pointer>::SPLAYFREE DelayTaggedFree; |
1e5562e3 | 25 | |
26 | DelayTagged::~DelayTagged() | |
27 | { | |
28 | DelayPools::deregisterForUpdates (this); | |
d6349cfb | 29 | buckets.destroy(DelayTaggedFree); |
1e5562e3 | 30 | } |
31 | ||
1e4f953d | 32 | static Splay<DelayTaggedBucket::Pointer>::SPLAYCMP DelayTaggedCmp; |
1e5562e3 | 33 | |
34 | int | |
35 | DelayTaggedCmp(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 | ||
41 | void | |
42 | DelayTaggedFree(DelayTaggedBucket::Pointer &) | |
43 | {} | |
44 | ||
f5dc4237 FC |
45 | struct DelayTaggedStatsVisitor { |
46 | StoreEntry *sentry; | |
d6349cfb | 47 | explicit DelayTaggedStatsVisitor(StoreEntry *se): sentry(se) {} |
f5dc4237 FC |
48 | void operator() (DelayTaggedBucket::Pointer const ¤t) { |
49 | current->stats(sentry); | |
50 | } | |
51 | }; | |
1e5562e3 | 52 | |
53 | void | |
54 | DelayTagged::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 | ||
73 | void | |
74 | DelayTagged::dump(StoreEntry *entry) const | |
75 | { | |
76 | spec.dump(entry); | |
77 | } | |
78 | ||
26ac0430 AJ |
79 | struct DelayTaggedUpdater { |
80 | DelayTaggedUpdater (DelaySpec &_spec, int _incr):spec(_spec),incr(_incr) {}; | |
1e5562e3 | 81 | |
82 | DelaySpec spec; | |
83 | int incr; | |
84 | }; | |
85 | ||
d6349cfb FC |
86 | struct DelayTaggedUpdateVisitor { |
87 | DelayTaggedUpdater *updater; | |
88 | explicit DelayTaggedUpdateVisitor(DelayTaggedUpdater *u) : updater(u) {} | |
89 | void operator() (DelayTaggedBucket::Pointer const ¤t) { | |
90 | const_cast<DelayTaggedBucket *>(current.getRaw())->theBucket.update(updater->spec, updater->incr); | |
91 | } | |
92 | }; | |
93 | ||
1e5562e3 | 94 | void |
95 | DelayTagged::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 | ||
103 | void | |
104 | DelayTagged::parse() | |
105 | { | |
106 | spec.parse(); | |
107 | } | |
108 | ||
109 | DelayIdComposite::Pointer | |
110 | ||
111 | DelayTagged::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 | 119 | DelayTaggedBucket::DelayTaggedBucket(const SBuf &aTag): tag(aTag) |
1e5562e3 | 120 | { |
bf8fe701 | 121 | debugs(77, 3, "DelayTaggedBucket::DelayTaggedBucket"); |
1e5562e3 | 122 | } |
123 | ||
124 | DelayTaggedBucket::~DelayTaggedBucket() | |
125 | { | |
bf8fe701 | 126 | debugs(77, 3, "DelayTaggedBucket::~DelayTaggedBucket"); |
1e5562e3 | 127 | } |
128 | ||
129 | void | |
78b06ec5 | 130 | DelayTaggedBucket::stats(StoreEntry *entry) const |
1e5562e3 | 131 | { |
b78b376d | 132 | storeAppendPrintf(entry, " " SQUIDSBUFPH ":", SQUIDSBUFPRINT(tag)); |
78b06ec5 | 133 | theBucket.stats(entry); |
1e5562e3 | 134 | } |
135 | ||
b78b376d | 136 | DelayTagged::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 | ||
150 | DelayTagged::Id::~Id() | |
151 | { | |
bf8fe701 | 152 | debugs(77, 3, "DelayTagged::Id::~Id"); |
1e5562e3 | 153 | } |
154 | ||
155 | int | |
156 | DelayTagged::Id::bytesWanted (int min, int max) const | |
157 | { | |
158 | return theBucket->theBucket.bytesWanted(min,max); | |
159 | } | |
160 | ||
161 | void | |
162 | DelayTagged::Id::bytesIn(int qty) | |
163 | { | |
164 | theBucket->theBucket.bytesIn(qty); | |
165 | } | |
166 | ||
288d8048 | 167 | void |
a928fdfd | 168 | DelayTagged::Id::delayRead(const AsyncCall::Pointer &aRead) |
288d8048 | 169 | { |
170 | theTagged->delayRead(aRead); | |
171 | } | |
172 | ||
1e5562e3 | 173 | #endif |
f53969cc | 174 |