Go to the documentation of this file.
13 #if USE_DELAY_POOLS && USE_AUTH
21 DelayUser::DelayUser()
28 DelayUser::~DelayUser()
37 DelayUserCmp(DelayUserBucket::Pointer
const &left, DelayUserBucket::Pointer
const &right)
40 assert(left->authUser->username() !=
nullptr);
41 assert(right->authUser->username() !=
nullptr);
44 return strcasecmp(left->authUser->username(), right->authUser->username());
48 DelayUserFree(DelayUserBucket::Pointer &)
51 struct DelayUserStatsVisitor {
53 explicit DelayUserStatsVisitor(
StoreEntry *s) : se(s) {}
54 void operator() (DelayUserBucket::Pointer
const ¤t) {
62 spec.stats (sentry,
"Per User");
64 if (spec.restore_bps == -1)
74 DelayUserStatsVisitor visitor(sentry);
85 struct DelayUserUpdater {
86 DelayUserUpdater (
DelaySpec &_spec,
int _incr):spec(_spec),incr(_incr) {};
92 struct DelayUserUpdateVisitor {
94 DelayUserUpdateVisitor(DelayUserUpdater *updater) : t(updater) {}
95 void operator() (DelayUserBucket::Pointer
const ¤t) {
96 const_cast<DelayUserBucket *
>(current.getRaw())->theBucket.update(t->spec, t->incr);
101 DelayUser::update(
int incr)
103 DelayUserUpdater updater(spec, incr);
104 DelayUserUpdateVisitor visitor(&updater);
120 debugs(77, 3,
"Adding a slow-down for User '" << details.
user->
user()->username() <<
"'");
121 return new Id(
this, details.
user->
user());
126 debugs(77, 3,
"DelayUserBucket::DelayUserBucket");
129 DelayUserBucket::~DelayUserBucket()
132 debugs(77, 3,
"DelayUserBucket::~DelayUserBucket");
136 DelayUserBucket::stats (
StoreEntry *entry)
const
139 theBucket.stats(entry);
142 DelayUser::Id::Id(
const DelayUser::Pointer &aDelayUser,
const Auth::User::Pointer &aUser) : theUser(aDelayUser)
144 theBucket =
new DelayUserBucket(aUser);
145 DelayUserBucket::Pointer
const *existing = theUser->buckets.find(theBucket, DelayUserCmp);
148 theBucket = *existing;
152 theBucket->theBucket.init(theUser->spec);
153 theUser->buckets.insert (theBucket, DelayUserCmp);
158 debugs(77, 3,
"DelayUser::Id::~Id");
162 DelayUser::Id::bytesWanted (
int min,
int max)
const
164 return theBucket->theBucket.bytesWanted(
min,
max);
168 DelayUser::Id::bytesIn(
int qty)
170 theBucket->theBucket.bytesIn(qty);
void storeAppendPrintf(StoreEntry *e, const char *fmt,...)
static void deregisterForUpdates(Updateable *)
Auth::UserRequest::Pointer user
const A & max(A const &lhs, A const &rhs)
static struct node * parse(FILE *fp)
virtual User::Pointer user()
static struct tok * buckets[HASHSIZE]
static void registerForUpdates(Updateable *)
#define debugs(SECTION, LEVEL, CONTENT)
const A & min(A const &lhs, A const &rhs)