MM-43733: Set concurrency limits via configuration (#20413)
```release-note We create a new config option MaxImageDecoderConcurrency which indicates how many images can be decoded concurrently at once. The default is -1 which means number of CPUs present. This affects the total memory consumption of the server. The maximum memory of a single image is dictated by MaxImageResolution * 24 bytes. Therefore, a good rule of thumb to follow is that MaxImageResolution * MaxImageDecoderConcurrency * 24 should be less then the allocated memory for image decoding. ``` https://mattermost.atlassian.net/browse/MM-43733
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
4b8cb4e272
Коммит
7c1b8cd937
@@ -1401,28 +1401,29 @@ func (s *PasswordSettings) SetDefaults() {
|
||||
}
|
||||
|
||||
type FileSettings struct {
|
||||
EnableFileAttachments *bool `access:"site_file_sharing_and_downloads,cloud_restrictable"`
|
||||
EnableMobileUpload *bool `access:"site_file_sharing_and_downloads,cloud_restrictable"`
|
||||
EnableMobileDownload *bool `access:"site_file_sharing_and_downloads,cloud_restrictable"`
|
||||
MaxFileSize *int64 `access:"environment_file_storage,cloud_restrictable"`
|
||||
MaxImageResolution *int64 `access:"environment_file_storage,cloud_restrictable"`
|
||||
DriverName *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
Directory *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
EnablePublicLink *bool `access:"site_public_links,cloud_restrictable"`
|
||||
ExtractContent *bool `access:"environment_file_storage,write_restrictable"`
|
||||
ArchiveRecursion *bool `access:"environment_file_storage,write_restrictable"`
|
||||
PublicLinkSalt *string `access:"site_public_links,cloud_restrictable"` // telemetry: none
|
||||
InitialFont *string `access:"environment_file_storage,cloud_restrictable"` // telemetry: none
|
||||
AmazonS3AccessKeyId *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
AmazonS3SecretAccessKey *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
AmazonS3Bucket *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
AmazonS3PathPrefix *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
AmazonS3Region *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
AmazonS3Endpoint *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
AmazonS3SSL *bool `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
AmazonS3SignV2 *bool `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
AmazonS3SSE *bool `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
AmazonS3Trace *bool `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
EnableFileAttachments *bool `access:"site_file_sharing_and_downloads,cloud_restrictable"`
|
||||
EnableMobileUpload *bool `access:"site_file_sharing_and_downloads,cloud_restrictable"`
|
||||
EnableMobileDownload *bool `access:"site_file_sharing_and_downloads,cloud_restrictable"`
|
||||
MaxFileSize *int64 `access:"environment_file_storage,cloud_restrictable"`
|
||||
MaxImageResolution *int64 `access:"environment_file_storage,cloud_restrictable"`
|
||||
MaxImageDecoderConcurrency *int64 `access:"environment_file_storage,cloud_restrictable"`
|
||||
DriverName *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
Directory *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
EnablePublicLink *bool `access:"site_public_links,cloud_restrictable"`
|
||||
ExtractContent *bool `access:"environment_file_storage,write_restrictable"`
|
||||
ArchiveRecursion *bool `access:"environment_file_storage,write_restrictable"`
|
||||
PublicLinkSalt *string `access:"site_public_links,cloud_restrictable"` // telemetry: none
|
||||
InitialFont *string `access:"environment_file_storage,cloud_restrictable"` // telemetry: none
|
||||
AmazonS3AccessKeyId *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
AmazonS3SecretAccessKey *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
AmazonS3Bucket *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
AmazonS3PathPrefix *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
AmazonS3Region *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
AmazonS3Endpoint *string `access:"environment_file_storage,write_restrictable,cloud_restrictable"` // telemetry: none
|
||||
AmazonS3SSL *bool `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
AmazonS3SignV2 *bool `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
AmazonS3SSE *bool `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
AmazonS3Trace *bool `access:"environment_file_storage,write_restrictable,cloud_restrictable"`
|
||||
}
|
||||
|
||||
func (s *FileSettings) SetDefaults(isUpdate bool) {
|
||||
@@ -1446,6 +1447,10 @@ func (s *FileSettings) SetDefaults(isUpdate bool) {
|
||||
s.MaxImageResolution = NewInt64(7680 * 4320) // 8K, ~33MPX
|
||||
}
|
||||
|
||||
if s.MaxImageDecoderConcurrency == nil {
|
||||
s.MaxImageDecoderConcurrency = NewInt64(-1) // Default to NumCPU
|
||||
}
|
||||
|
||||
if s.DriverName == nil {
|
||||
s.DriverName = NewString(ImageDriverLocal)
|
||||
}
|
||||
@@ -3395,6 +3400,10 @@ func (s *FileSettings) isValid() *AppError {
|
||||
return NewAppError("Config.IsValid", "model.config.is_valid.directory.app_error", nil, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if *s.MaxImageDecoderConcurrency < -1 || *s.MaxImageDecoderConcurrency == 0 {
|
||||
return NewAppError("Config.IsValid", "model.config.is_valid.image_decoder_concurrency.app_error", map[string]interface{}{"Value": *s.MaxImageDecoderConcurrency}, "", http.StatusBadRequest)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user