[#220] Support configuring web server timeout params #252
6 changed files with 87 additions and 0 deletions
|
@ -48,6 +48,7 @@ This document outlines major changes between releases.
|
||||||
- Use gate key to form object owner (#175)
|
- Use gate key to form object owner (#175)
|
||||||
- Apply placement policies and copies if there is at least one valid value (#168)
|
- Apply placement policies and copies if there is at least one valid value (#168)
|
||||||
- Generalise config param `use_default_xmlns_for_complete_multipart` to `use_default_xmlns` so that use default xmlns for all requests (#221)
|
- Generalise config param `use_default_xmlns_for_complete_multipart` to `use_default_xmlns` so that use default xmlns for all requests (#221)
|
||||||
|
- Set server IdleTimeout and ReadHeaderTimeout to `30s` and allow to configure them (#220)
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
- Drop `tree.service` param (now endpoints from `peers` section are used) (#133)
|
- Drop `tree.service` param (now endpoints from `peers` section are used) (#133)
|
||||||
|
|
|
@ -528,6 +528,10 @@ func (a *App) Serve(ctx context.Context) {
|
||||||
srv := new(http.Server)
|
srv := new(http.Server)
|
||||||
srv.Handler = chiRouter
|
srv.Handler = chiRouter
|
||||||
srv.ErrorLog = zap.NewStdLog(a.log)
|
srv.ErrorLog = zap.NewStdLog(a.log)
|
||||||
|
srv.ReadTimeout = a.cfg.GetDuration(cfgWebReadTimeout)
|
||||||
|
srv.ReadHeaderTimeout = a.cfg.GetDuration(cfgWebReadHeaderTimeout)
|
||||||
|
srv.WriteTimeout = a.cfg.GetDuration(cfgWebWriteTimeout)
|
||||||
|
srv.IdleTimeout = a.cfg.GetDuration(cfgWebIdleTimeout)
|
||||||
|
|
||||||
a.startServices()
|
a.startServices()
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,9 @@ const (
|
||||||
defaultMaxClientsDeadline = time.Second * 30
|
defaultMaxClientsDeadline = time.Second * 30
|
||||||
|
|
||||||
defaultSoftMemoryLimit = math.MaxInt64
|
defaultSoftMemoryLimit = math.MaxInt64
|
||||||
|
|
||||||
|
defaultReadHeaderTimeout = 30 * time.Second
|
||||||
|
defaultIdleTimeout = 30 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
var defaultCopiesNumbers = []uint32{0}
|
var defaultCopiesNumbers = []uint32{0}
|
||||||
|
@ -134,6 +137,12 @@ const ( // Settings.
|
||||||
cfgKludgeCompleteMultipartUploadKeepalive = "kludge.complete_multipart_keepalive"
|
cfgKludgeCompleteMultipartUploadKeepalive = "kludge.complete_multipart_keepalive"
|
||||||
cfgKludgeBypassContentEncodingCheckInChunks = "kludge.bypass_content_encoding_check_in_chunks"
|
cfgKludgeBypassContentEncodingCheckInChunks = "kludge.bypass_content_encoding_check_in_chunks"
|
||||||
|
|
||||||
|
// Web.
|
||||||
|
cfgWebReadTimeout = "web.read_timeout"
|
||||||
|
cfgWebReadHeaderTimeout = "web.read_header_timeout"
|
||||||
|
cfgWebWriteTimeout = "web.write_timeout"
|
||||||
|
cfgWebIdleTimeout = "web.idle_timeout"
|
||||||
|
|
||||||
// Command line args.
|
// Command line args.
|
||||||
cmdHelp = "help"
|
cmdHelp = "help"
|
||||||
cmdVersion = "version"
|
cmdVersion = "version"
|
||||||
|
@ -541,6 +550,10 @@ func newSettings() *viper.Viper {
|
||||||
v.SetDefault(cfgKludgeCompleteMultipartUploadKeepalive, 10*time.Second)
|
v.SetDefault(cfgKludgeCompleteMultipartUploadKeepalive, 10*time.Second)
|
||||||
v.SetDefault(cfgKludgeBypassContentEncodingCheckInChunks, false)
|
v.SetDefault(cfgKludgeBypassContentEncodingCheckInChunks, false)
|
||||||
|
|
||||||
|
// web
|
||||||
|
v.SetDefault(cfgWebReadHeaderTimeout, defaultReadHeaderTimeout)
|
||||||
|
v.SetDefault(cfgWebIdleTimeout, defaultIdleTimeout)
|
||||||
|
|
||||||
// Bind flags
|
// Bind flags
|
||||||
if err := bindFlags(v, flags); err != nil {
|
if err := bindFlags(v, flags); err != nil {
|
||||||
panic(fmt.Errorf("bind flags: %w", err))
|
panic(fmt.Errorf("bind flags: %w", err))
|
||||||
|
|
|
@ -152,3 +152,26 @@ S3_GW_TRACING_EXPORTER="otlp_grpc"
|
||||||
S3_GW_RUNTIME_SOFT_MEMORY_LIMIT=1073741824
|
S3_GW_RUNTIME_SOFT_MEMORY_LIMIT=1073741824
|
||||||
|
|
||||||
S3_GW_FEATURES_MD5_ENABLED=false
|
S3_GW_FEATURES_MD5_ENABLED=false
|
||||||
|
|
||||||
|
# ReadTimeout is the maximum duration for reading the entire
|
||||||
|
# request, including the body. A zero or negative value means
|
||||||
|
# there will be no timeout.
|
||||||
|
S3_GW_WEB_READ_TIMEOUT=0
|
||||||
|
# ReadHeaderTimeout is the amount of time allowed to read
|
||||||
|
# request headers. The connection's read deadline is reset
|
||||||
|
# after reading the headers and the Handler can decide what
|
||||||
|
# is considered too slow for the body. If ReadHeaderTimeout
|
||||||
|
# is zero, the value of ReadTimeout is used. If both are
|
||||||
|
# zero, there is no timeout.
|
||||||
|
S3_GW_WEB_READ_HEADER_TIMEOUT=30s
|
||||||
|
# WriteTimeout is the maximum duration before timing out
|
||||||
|
# writes of the response. It is reset whenever a new
|
||||||
|
# request's header is read. Like ReadTimeout, it does not
|
||||||
|
# let Handlers make decisions on a per-request basis.
|
||||||
|
# A zero or negative value means there will be no timeout.
|
||||||
|
S3_GW_WEB_WRITE_TIMEOUT=0
|
||||||
|
# IdleTimeout is the maximum amount of time to wait for the
|
||||||
|
# next request when keep-alives are enabled. If IdleTimeout
|
||||||
|
# is zero, the value of ReadTimeout is used. If both are
|
||||||
|
# zero, there is no timeout.
|
||||||
|
S3_GW_WEB_IDLE_TIMEOUT=30s
|
||||||
|
|
|
@ -180,3 +180,30 @@ runtime:
|
||||||
features:
|
features:
|
||||||
md5:
|
md5:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
|
||||||
|
web:
|
||||||
|
# ReadTimeout is the maximum duration for reading the entire
|
||||||
|
# request, including the body. A zero or negative value means
|
||||||
|
# there will be no timeout.
|
||||||
|
read_timeout: 0
|
||||||
|
|
||||||
|
# ReadHeaderTimeout is the amount of time allowed to read
|
||||||
|
# request headers. The connection's read deadline is reset
|
||||||
|
# after reading the headers and the Handler can decide what
|
||||||
|
# is considered too slow for the body. If ReadHeaderTimeout
|
||||||
|
# is zero, the value of ReadTimeout is used. If both are
|
||||||
|
# zero, there is no timeout.
|
||||||
|
read_header_timeout: 30s
|
||||||
|
|
||||||
|
# WriteTimeout is the maximum duration before timing out
|
||||||
|
# writes of the response. It is reset whenever a new
|
||||||
|
# request's header is read. Like ReadTimeout, it does not
|
||||||
|
# let Handlers make decisions on a per-request basis.
|
||||||
|
# A zero or negative value means there will be no timeout.
|
||||||
|
write_timeout: 0
|
||||||
|
|
||||||
|
# IdleTimeout is the maximum amount of time to wait for the
|
||||||
|
# next request when keep-alives are enabled. If IdleTimeout
|
||||||
|
# is zero, the value of ReadTimeout is used. If both are
|
||||||
|
# zero, there is no timeout.
|
||||||
|
idle_timeout: 30s
|
||||||
|
|
|
@ -187,6 +187,7 @@ There are some custom types used for brevity:
|
||||||
| `kludge` | [Different kludge configuration](#kludge-section) |
|
| `kludge` | [Different kludge configuration](#kludge-section) |
|
||||||
| `runtime` | [Runtime configuration](#runtime-section) |
|
| `runtime` | [Runtime configuration](#runtime-section) |
|
||||||
| `features` | [Features configuration](#features-section) |
|
| `features` | [Features configuration](#features-section) |
|
||||||
|
| `web` | [Web server configuration](#web-section) |
|
||||||
|
|
||||||
### General section
|
### General section
|
||||||
|
|
||||||
|
@ -576,3 +577,21 @@ features:
|
||||||
| Parameter | Type | SIGHUP reload | Default value | Description |
|
| Parameter | Type | SIGHUP reload | Default value | Description |
|
||||||
|---------------|--------|---------------|---------------|----------------------------------------------------------------|
|
|---------------|--------|---------------|---------------|----------------------------------------------------------------|
|
||||||
| `md5.enabled` | `bool` | yes | false | Flag to enable return MD5 checksum in ETag headers and fields. |
|
| `md5.enabled` | `bool` | yes | false | Flag to enable return MD5 checksum in ETag headers and fields. |
|
||||||
|
|
||||||
|
# `web` section
|
||||||
|
Contains web server configuration parameters.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
web:
|
||||||
|
read_timeout: 0
|
||||||
|
read_header_timeout: 30s
|
||||||
|
write_timeout: 0
|
||||||
|
idle_timeout: 30s
|
||||||
|
```
|
||||||
|
|
||||||
|
| Parameter | Type | SIGHUP reload | Default value | Description |
|
||||||
|
|-----------------------|------------|---------------|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| `read_timeout` | `duration` | no | `0` | The maximum duration for reading the entire request, including the body. A zero or negative value means there will be no timeout. |
|
||||||
|
| `read_header_timeout` | `duration` | no | `30s` | The amount of time allowed to read request headers. If `read_header_timeout` is zero, the value of `read_timeout` is used. If both are zero, there is no timeout. |
|
||||||
|
| `write_timeout` | `duration` | no | `0` | The maximum duration before timing out writes of the response. A zero or negative value means there will be no timeout. |
|
||||||
|
| `idle_timeout` | `duration` | no | `30s` | The maximum amount of time to wait for the next request when keep-alives are enabled. If `idle_timeout` is zero, the value of `read_timeout` is used. If both are zero, there is no timeout. |
|
||||||
|
|
Loading…
Reference in a new issue