From d96b3f0082886e7e748adea985d4b12625e9a0cc Mon Sep 17 00:00:00 2001 From: Chen Chen Date: Mon, 11 Sep 2023 20:56:12 +0800 Subject: [PATCH] Add a flag to enable or disable aio_write (#10394) * Add a flag to enable or disable aio_write Signed-off-by: z1cheng * Fix e2e test for aio_write Signed-off-by: z1cheng * Remove redundant spaces to fix the 2e test Signed-off-by: z1cheng --------- Signed-off-by: z1cheng --- .../nginx-configuration/configmap.md | 5 ++ internal/ingress/controller/config/config.go | 5 ++ rootfs/etc/nginx/template/nginx.tmpl | 3 ++ test/e2e/settings/aio_write.go | 54 +++++++++++++++++++ 4 files changed, 67 insertions(+) create mode 100644 test/e2e/settings/aio_write.go diff --git a/docs/user-guide/nginx-configuration/configmap.md b/docs/user-guide/nginx-configuration/configmap.md index d771d16b2..1bb205ad3 100644 --- a/docs/user-guide/nginx-configuration/configmap.md +++ b/docs/user-guide/nginx-configuration/configmap.md @@ -97,6 +97,7 @@ The following table shows a configuration option's name, type, and the default v |[ssl-buffer-size](#ssl-buffer-size)|string|"4k"|| |[use-proxy-protocol](#use-proxy-protocol)|bool|"false"|| |[proxy-protocol-header-timeout](#proxy-protocol-header-timeout)|string|"5s"|| +|[enable-aio-write](#enable-aio-write)|bool|"true"|| |[use-gzip](#use-gzip)|bool|"false"|| |[use-geoip](#use-geoip)|bool|"true"|| |[use-geoip2](#use-geoip2)|bool|"false"|| @@ -709,6 +710,10 @@ Enables or disables the [PROXY protocol](https://www.nginx.com/resources/admin-g Sets the timeout value for receiving the proxy-protocol headers. The default of 5 seconds prevents the TLS passthrough handler from waiting indefinitely on a dropped connection. _**default:**_ 5s +## enable-aio-write + +Enables or disables the directive [aio_write](https://nginx.org/en/docs/http/ngx_http_core_module.html#aio_write) that writes files asynchronously. _**default:**_ true + ## use-gzip Enables or disables compression of HTTP responses using the ["gzip" module](https://nginx.org/en/docs/http/ngx_http_gzip_module.html). MIME types to compress are controlled by [gzip-types](#gzip-types). _**default:**_ false diff --git a/internal/ingress/controller/config/config.go b/internal/ingress/controller/config/config.go index 09983308e..56fd2699f 100644 --- a/internal/ingress/controller/config/config.go +++ b/internal/ingress/controller/config/config.go @@ -424,6 +424,10 @@ type Configuration struct { // Example '60s' ProxyProtocolHeaderTimeout time.Duration `json:"proxy-protocol-header-timeout,omitempty"` + // Enables or disables the directive aio_write that writes files files asynchronously + // https://nginx.org/en/docs/http/ngx_http_core_module.html#aio_write + EnableAioWrite bool `json:"enable-aio-write,omitempty"` + // Enables or disables the use of the nginx module that compresses responses using the "gzip" method // http://nginx.org/en/docs/http/ngx_http_gzip_module.html UseGzip bool `json:"use-gzip,omitempty"` @@ -938,6 +942,7 @@ func NewDefault() Configuration { SSLSessionTickets: false, SSLSessionTimeout: sslSessionTimeout, EnableBrotli: false, + EnableAioWrite: true, UseGzip: false, UseGeoIP: true, UseGeoIP2: false, diff --git a/rootfs/etc/nginx/template/nginx.tmpl b/rootfs/etc/nginx/template/nginx.tmpl index ccd7b4411..e3145e6a5 100644 --- a/rootfs/etc/nginx/template/nginx.tmpl +++ b/rootfs/etc/nginx/template/nginx.tmpl @@ -296,7 +296,10 @@ http { {{ end }} aio threads; + + {{ if $cfg.EnableAioWrite }} aio_write on; + {{ end }} tcp_nopush on; tcp_nodelay on; diff --git a/test/e2e/settings/aio_write.go b/test/e2e/settings/aio_write.go new file mode 100644 index 000000000..bcfe2a4de --- /dev/null +++ b/test/e2e/settings/aio_write.go @@ -0,0 +1,54 @@ +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package settings + +import ( + "strings" + + "github.com/onsi/ginkgo/v2" + + "k8s.io/ingress-nginx/test/e2e/framework" +) + +var _ = framework.DescribeSetting("aio-write", func() { + f := framework.NewDefaultFramework("aio-write") + + ginkgo.It("should be enabled by default", func() { + f.WaitForNginxConfiguration( + func(cfg string) bool { + return strings.Contains(cfg, "aio_write on") + }) + }) + + ginkgo.It("should be enabled when setting is true", func() { + f.UpdateNginxConfigMapData("enable-aio-write", "true") + + f.WaitForNginxConfiguration( + func(cfg string) bool { + return strings.Contains(cfg, "aio_write on") + }) + }) + + ginkgo.It("should be disabled when setting is false", func() { + f.UpdateNginxConfigMapData("enable-aio-write", "false") + + f.WaitForNginxConfiguration( + func(cfg string) bool { + return !strings.Contains(cfg, "aio_write on") + }) + }) +})