BUG/MEDIUM: unique_id: HTTP request counter must be unique!

The HTTP request counter is incremented non atomically, which means that
many requests can log the same ID. Let's increment it when it is consumed
so that we avoid this case.

This bug was reported by Patrick Hemmer. It's 1.5-specific and does not
need to be backported.
This commit is contained in:
Willy Tarreau 2013-08-13 17:51:07 +02:00
parent 82ffa39bfd
commit 9f09521f2d
3 changed files with 3 additions and 5 deletions

View File

@ -90,7 +90,7 @@ struct global {
int rlimit_memmax; /* default ulimit-d in megs value : 0=unset */
long maxzlibmem; /* max RAM for zlib in bytes */
int mode;
unsigned int req_count; /* HTTP request counter */
unsigned int req_count; /* HTTP request counter for logs and unique_id */
int last_checks;
int spread_checks;
char *chroot;

View File

@ -1448,13 +1448,13 @@ int build_logline(struct session *s, char *dst, size_t maxsize, struct list *lis
case LOG_FMT_COUNTER: // %rt
if (tmp->options & LOG_OPT_HEXA) {
iret = snprintf(tmplog, dst + maxsize - tmplog, "%04X", global.req_count);
iret = snprintf(tmplog, dst + maxsize - tmplog, "%04X", global.req_count++);
if (iret < 0 || iret > dst + maxsize - tmplog)
goto out;
last_isspace = 0;
tmplog += iret;
} else {
ret = ltoa_o(global.req_count, tmplog, dst + maxsize - tmplog);
ret = ltoa_o(global.req_count++, tmplog, dst + maxsize - tmplog);
if (ret == NULL)
goto out;
tmplog = ret;

View File

@ -8289,8 +8289,6 @@ void http_init_txn(struct session *s)
txn->flags = 0;
txn->status = -1;
global.req_count++;
txn->cookie_first_date = 0;
txn->cookie_last_date = 0;