• sundb's avatar
    Fix the wrong reisze of querybuf (#9003) · e5d8a5eb
    sundb authored
    The initialize memory of `querybuf` is `PROTO_IOBUF_LEN(1024*16) * 2` (due to sdsMakeRoomFor being greedy), under `jemalloc`, the allocated memory will be 40k.
    This will most likely result in the `querybuf` being resized when call `clientsCronResizeQueryBuffer` unless the client requests it fast enough.
    
    Note that this bug existed even before #7875, since the condition for resizing includes the sds headers (32k+6).
    
    ## Changes
    1. Use non-greedy sdsMakeRoomFor when allocating the initial query buffer (of 16k).
    1. Also use non-greedy allocation when working with BIG_ARG (we won't use that extra space anyway)
    2. in case we did use a greedy allocation, read as much as we can into the buffer we got (including internal frag), to reduce system calls.
    3. introduce a dedicated constant for the shrinking (same value as before)
    3. Add test for querybuf.
    4. improve a maxmemory test by ignoring the effect of replica query buffers (can accumulate many ACKs on slow env)
    5. improve a maxmemory by disabling slowlog (it will cause slight memory growth on slow env).
    e5d8a5eb
server.h 129 KB