Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

direct memory always increases when adding custom filter to get request body size #3383

Open
sweat123 opened this issue May 3, 2024 · 0 comments

Comments

@sweat123
Copy link

sweat123 commented May 3, 2024

I 've built a spring cloud gateway application, gateway version 2.2.9.RELEASE.
And I have created a filter to get request body size.
The filter 'RequestBodySizeFilter' to get request body size:

@Component
public class RequestBodySizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        NettyDataBufferFactory factory = (NettyDataBufferFactory) exchange.getResponse().bufferFactory();
        return DataBufferUtils.join(exchange.getRequest().getBody())
                .defaultIfEmpty(factory.wrap(new EmptyByteBuf(factory.getByteBufAllocator())))
                .flatMap(dataBuffer -> {
                    int size = dataBuffer.readableByteCount();
                    log.info("request body size: {}", size);
                    if (size == 0) {
                        DataBufferUtils.release(dataBuffer);
                        return chain.filter(exchange);
                    }
                    ServerHttpRequest mutatedReq = new ServerHttpRequestDecorator(exchange.getRequest()) {
                        @Override
                        public Flux<DataBuffer> getBody() {
                            return Flux.just(dataBuffer);
                        }
                    };
                    return chain.filter(exchange.mutate().request(mutatedReq).build());
                });
    }
}

I monitor the direct memory by getting value from PlatformDependent#DIRECT_MEMORY_COUNTER.
I have sent some request with file or large body, the direct memory is always increase.
But the direct memory in Gateway without RequestBodySizeFilter will not increase when sending large body request(picture left part).
directMemoryMonitor

We add -Dio.netty.allocator.type=unpooled and direct memory will release with RequestBodySizeFilter.
image

I'm not sure if this is the right way to get request body size, can anyone give me some advice. Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant