Invalid parsed value for keys_zone. Is this a problem?

Hi,

driven by a wrong undestand of proxy_cache’s keys_zone parameter I have
set it to a very high value:

    proxy_cache_path  /tmp/cache levels=2:2:2 keys_zone=cache:10000m
max_size=50g inactive=5m;

What happens is that 10G should be 10485760000, not 1895825408:

Breakpoint 3, ngx_http_file_cache_set_slot (cf=0xbfffef58,
cmd=0x80ee980, conf=0x0) at src/http/ngx_http_file_cache.c:1598
(gdb) p s
$1 = {len = 6, data = 0x811e2a3 "10000m"}
1598                  size = ngx_parse_size(&s);
(gdb) p size
$2 = 1895825408
(gdb) n
1599                  if (size > 8191) {
(gdb) n
1600                      continue;
(gdb) quit

Even being an unreasonable value for in-memory cache, shouldn’t this
unexpected result be avoided?

Posted at Nginx Forum:

Hi,

On 18/01/2011 16:20, Igor S. wrote:

10485760000 is 0x271000000 in hex. On 32-bit platform it’s truncated to
0x71000000, i.e., 1895825408. Yes, it should be checked.

Also, would it not be better to use off64_t or some other larger type
for storing the max_size of the cache (or indeed for parsing off’s in
general)? I’m not sure about all Posix systems, but on Debian off_t is
long int, hence a 32-bit value on 32-bit systems. I’ve not checked in
the code, but I’m assuming that the max size of a file cache on 32-bit
systems may then be 2GB.

Marcus.

On Tue, Jan 18, 2011 at 08:35:10AM -0500, caruccio wrote:

What happens is that 10G should be 10485760000, not 1895825408:
1599 if (size > 8191) {
(gdb) n
1600 continue;
(gdb) quit
[/code]

Even being an unreasonable value for in-memory cache, shouldn’t this
unexpected result be avoided?

10485760000 is 0x271000000 in hex. On 32-bit platform it’s truncated to
0x71000000, i.e., 1895825408. Yes, it should be checked.


Igor S.
http://sysoev.ru/en/

On Tue, Jan 18, 2011 at 04:29:16PM +0200, Eugaia wrote:

the code, but I’m assuming that the max size of a file cache on 32-bit
systems may then be 2GB.

nginx uses 64-bit offsets on Linux with
#define _FILE_OFFSET_BITS 64


Igor S.
http://sysoev.ru/en/

On 18/01/2011 16:40, Igor S. wrote:

general)? I’m not sure about all Posix systems, but on Debian off_t is
long int, hence a 32-bit value on 32-bit systems. I’ve not checked in
the code, but I’m assuming that the max size of a file cache on 32-bit
systems may then be 2GB.
nginx uses 64-bit offsets on Linux with
#define _FILE_OFFSET_BITS 64

Right.

Thanks,

Marcus.