Commit 8a27e663 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Remove the client source address accounting, it is unused and a performance

bottleneck.

The original idea was anti-DoS measures along the lines of
	sub vcl_recv {
		if (client.bandwith > 1 mbit/s) {
			delay (100 ms);
		}
	}

But there are does not seem to be a pressing need, wherefore it has
never been completed, and even if it was, it would not solve the
problem across a server farm.



git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@3884 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent f1989fc5
......@@ -211,7 +211,6 @@ struct worker {
ssize_t liov;
struct VCL_conf *vcl;
struct srcaddr *srcaddr;
unsigned char *wlb, *wlp, *wle;
unsigned wlr;
......@@ -352,7 +351,6 @@ struct sess {
/* formatted ascii client address */
char *addr;
char *port;
struct srcaddr *srcaddr;
/* HTTP request */
const char *doclose;
......@@ -579,7 +577,6 @@ void WRW_Sendfile(struct worker *w, int fd, off_t off, unsigned len);
void SES_Init(void);
struct sess *SES_New(const struct sockaddr *addr, unsigned len);
void SES_Delete(struct sess *sp);
void SES_RefSrcAddr(struct sess *sp);
void SES_Charge(struct sess *sp);
void SES_ResetBackendTimeouts(struct sess *sp);
void SES_InheritBackendTimeouts(struct sess *sp);
......
......@@ -581,7 +581,6 @@ cnt_first(struct sess *sp)
HTC_Init(sp->htc, sp->ws, sp->fd);
sp->wrk->lastused = sp->t_open;
sp->acct_req.sess++;
SES_RefSrcAddr(sp);
do
i = HTC_Rx(sp->htc);
while (i == 0);
......
......@@ -372,8 +372,6 @@ wrk_thread_real(struct wq *qp, unsigned shm_workspace, unsigned sess_workspace)
if (w->vcl != NULL)
VCL_Rel(&w->vcl);
AZ(pthread_cond_destroy(&w->cond));
if (w->srcaddr != NULL)
free(w->srcaddr);
HSH_Cleanup(w);
WRK_SumStat(w);
return (NULL);
......
......@@ -30,14 +30,6 @@
*
* Session and Client management.
*
* The srcaddr structures are kept around only as a convenience feature to
* make it possible to track down offenders and misconfigured caches.
* As such it is pure overhead and we do not want to spend too much time
* on maintaining it.
*
* We identify srcaddrs instead of full addr+port because the desired level
* of granularity is "whois is abuse@ or tech-c@ in the RIPE database.
*
* XXX: The two-list session management is actually not a good idea
* XXX: come to think of it, because we want the sessions reused in
* XXX: Most Recently Used order.
......@@ -83,131 +75,8 @@ static struct lock ses_mem_mtx;
/*--------------------------------------------------------------------*/
struct srcaddr {
unsigned magic;
#define SRCADDR_MAGIC 0x375111db
unsigned hash;
VTAILQ_ENTRY(srcaddr) list;
struct srcaddrhead *sah;
char addr[TCP_ADDRBUFSIZE];
unsigned nref;
/* How long to keep entry around. Inherits timescale from t_open */
double ttl;
struct acct acct;
};
static struct srcaddrhead {
unsigned magic;
#define SRCADDRHEAD_MAGIC 0x38231a8b
VTAILQ_HEAD(,srcaddr) head;
struct lock mtx;
} *srchash;
static unsigned nsrchash;
static struct lock stat_mtx;
/*--------------------------------------------------------------------
* Assign a srcaddr to this session.
*
* Each hash bucket is sorted in least recently used order and if we
* need to make a new entry we recycle the first expired entry we find.
* If we find more expired entries during our search, we delete them.
*/
void
SES_RefSrcAddr(struct sess *sp)
{
unsigned u, v;
struct srcaddr *c, *c2, *c3;
struct srcaddrhead *ch;
double now;
if (params->srcaddr_ttl == 0) {
sp->srcaddr = NULL;
return;
}
AZ(sp->srcaddr);
u = crc32_l(sp->addr, strlen(sp->addr));
v = u % nsrchash;
ch = &srchash[v];
CHECK_OBJ(ch, SRCADDRHEAD_MAGIC);
now = sp->t_open;
if (sp->wrk->srcaddr == NULL) {
sp->wrk->srcaddr = calloc(sizeof *sp->wrk->srcaddr, 1);
XXXAN(sp->wrk->srcaddr);
}
Lck_Lock(&ch->mtx);
c3 = NULL;
VTAILQ_FOREACH_SAFE(c, &ch->head, list, c2) {
if (c->hash == u && !strcmp(c->addr, sp->addr)) {
if (c->nref == 0)
VSL_stats->n_srcaddr_act++;
c->nref++;
c->ttl = now + params->srcaddr_ttl;
sp->srcaddr = c;
VTAILQ_REMOVE(&ch->head, c, list);
VTAILQ_INSERT_TAIL(&ch->head, c, list);
if (c3 != NULL) {
VTAILQ_REMOVE(&ch->head, c3, list);
VSL_stats->n_srcaddr--;
}
Lck_Unlock(&ch->mtx);
if (c3 != NULL)
free(c3);
return;
}
if (c->nref > 0 || c->ttl > now)
continue;
if (c3 == NULL)
c3 = c;
}
if (c3 == NULL) {
c3 = sp->wrk->srcaddr;
sp->wrk->srcaddr = NULL;
VSL_stats->n_srcaddr++;
} else
VTAILQ_REMOVE(&ch->head, c3, list);
AN(c3);
memset(c3, 0, sizeof *c3);
c3->magic = SRCADDR_MAGIC;
strcpy(c3->addr, sp->addr);
c3->hash = u;
c3->acct.first = now;
c3->ttl = now + params->srcaddr_ttl;
c3->nref = 1;
c3->sah = ch;
VSL_stats->n_srcaddr_act++;
VTAILQ_INSERT_TAIL(&ch->head, c3, list);
sp->srcaddr = c3;
Lck_Unlock(&ch->mtx);
}
/*--------------------------------------------------------------------*/
static void
ses_relsrcaddr(struct sess *sp)
{
struct srcaddrhead *ch;
if (sp->srcaddr == NULL)
return;
CHECK_OBJ(sp->srcaddr, SRCADDR_MAGIC);
ch = sp->srcaddr->sah;
CHECK_OBJ(ch, SRCADDRHEAD_MAGIC);
Lck_Lock(&ch->mtx);
assert(sp->srcaddr->nref > 0);
sp->srcaddr->nref--;
if (sp->srcaddr->nref == 0)
VSL_stats->n_srcaddr_act--;
sp->srcaddr = NULL;
Lck_Unlock(&ch->mtx);
}
/*--------------------------------------------------------------------*/
static void
......@@ -223,22 +92,8 @@ void
SES_Charge(struct sess *sp)
{
struct acct *a = &sp->acct_req;
struct acct b;
ses_sum_acct(&sp->acct, a);
if (sp->srcaddr != NULL) {
/* XXX: only report once per second ? */
CHECK_OBJ(sp->srcaddr, SRCADDR_MAGIC);
Lck_Lock(&sp->srcaddr->sah->mtx);
ses_sum_acct(&sp->srcaddr->acct, a);
b = sp->srcaddr->acct;
Lck_Unlock(&sp->srcaddr->sah->mtx);
WSL(sp->wrk, SLT_StatAddr, 0,
"%s 0 %.0f %ju %ju %ju %ju %ju %ju %ju",
sp->srcaddr->addr, sp->t_end - b.first,
b.sess, b.req, b.pipe, b.pass,
b.fetch, b.hdrbytes, b.bodybytes);
}
Lck_Lock(&stat_mtx);
#define ACCT(foo) VSL_stats->s_##foo += a->foo;
#include "acct_fields.h"
......@@ -335,7 +190,6 @@ SES_Delete(struct sess *sp)
AZ(sp->obj);
AZ(sp->vcl);
VSL_stats->n_sess--;
ses_relsrcaddr(sp);
assert(!isnan(b->first));
assert(!isnan(sp->t_end));
VSL(SLT_StatSess, sp->id, "%s %s %.0f %ju %ju %ju %ju %ju %ju %ju",
......@@ -357,16 +211,7 @@ SES_Delete(struct sess *sp)
void
SES_Init()
{
int i;
nsrchash = params->srcaddr_hash;
srchash = calloc(sizeof *srchash, nsrchash);
XXXAN(srchash);
for (i = 0; i < nsrchash; i++) {
srchash[i].magic = SRCADDRHEAD_MAGIC;
VTAILQ_INIT(&srchash[i].head);
Lck_New(&srchash[i].mtx);
}
Lck_New(&stat_mtx);
Lck_New(&ses_mem_mtx);
}
......
......@@ -125,10 +125,6 @@ struct params {
/* Listen depth */
unsigned listen_depth;
/* Srcaddr hash */
unsigned srcaddr_hash;
unsigned srcaddr_ttl;
/* HTTP proto behaviour */
unsigned backend_http11;
unsigned client_http11;
......
......@@ -576,16 +576,6 @@ static const struct parspec input_parspec[] = {
"Listen queue depth.",
MUST_RESTART,
"1024", "connections" },
{ "srcaddr_hash", tweak_uint, &master.srcaddr_hash, 63, UINT_MAX,
"Number of source address hash buckets.\n"
"Powers of two are bad, prime numbers are good.",
EXPERIMENTAL | MUST_RESTART,
"1049", "buckets" },
{ "srcaddr_ttl", tweak_uint, &master.srcaddr_ttl, 0, UINT_MAX,
"Lifetime of srcaddr entries.\n"
"Zero will disable srcaddr accounting entirely.",
EXPERIMENTAL,
"30", "seconds" },
{ "backend_http11", tweak_bool, &master.backend_http11, 0, 0,
"Force all backend requests to be HTTP/1.1.\n"
"By default we copy the protocol version from the "
......
......@@ -41,7 +41,6 @@
SLTM(Debug)
SLTM(Error)
SLTM(CLI)
SLTM(StatAddr)
SLTM(StatSess)
SLTM(ReqEnd)
SLTM(SessionOpen)
......
......@@ -45,8 +45,6 @@ MAC_STAT(backend_reuse, uint64_t, 0, 'a', "Backend connections reuses")
MAC_STAT(backend_recycle, uint64_t, 0, 'a', "Backend connections recycles")
MAC_STAT(backend_unused, uint64_t, 0, 'a', "Backend connections unused")
MAC_STAT(n_srcaddr, uint64_t, 0, 'i', "N struct srcaddr")
MAC_STAT(n_srcaddr_act, uint64_t, 0, 'i', "N active struct srcaddr")
MAC_STAT(n_sess_mem, uint64_t, 0, 'i', "N struct sess_mem")
MAC_STAT(n_sess, uint64_t, 0, 'i', "N struct sess")
MAC_STAT(n_object, uint64_t, 1, 'i', "N struct object")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment