mirror of
https://github.com/minio/minio.git
synced 2024-12-24 22:25:54 -05:00
Add GetObject gzip option (#14226)
Enabled with `mc admin config set alias/ api gzip_objects=on` Standard filtering applies (1K response minimum, not compressed content type, not range request, gzip accepted by client).
This commit is contained in:
parent
f088e8960b
commit
5ec57a9533
@ -287,7 +287,7 @@ func registerAPIRouter(router *mux.Router) {
|
|||||||
collectAPIStats("getobjectlegalhold", maxClients(gz(httpTraceAll(api.GetObjectLegalHoldHandler))))).Queries("legal-hold", "")
|
collectAPIStats("getobjectlegalhold", maxClients(gz(httpTraceAll(api.GetObjectLegalHoldHandler))))).Queries("legal-hold", "")
|
||||||
// GetObject - note gzip compression is *not* added due to Range requests.
|
// GetObject - note gzip compression is *not* added due to Range requests.
|
||||||
router.Methods(http.MethodGet).Path("/{object:.+}").HandlerFunc(
|
router.Methods(http.MethodGet).Path("/{object:.+}").HandlerFunc(
|
||||||
collectAPIStats("getobject", maxClients(httpTraceHdrs(api.GetObjectHandler))))
|
collectAPIStats("getobject", maxClients(gz(httpTraceHdrs(api.GetObjectHandler)))))
|
||||||
// CopyObject
|
// CopyObject
|
||||||
router.Methods(http.MethodPut).Path("/{object:.+}").HeadersRegexp(xhttp.AmzCopySource, ".*?(\\/|%2F).*?").HandlerFunc(
|
router.Methods(http.MethodPut).Path("/{object:.+}").HeadersRegexp(xhttp.AmzCopySource, ".*?(\\/|%2F).*?").HandlerFunc(
|
||||||
collectAPIStats("copyobject", maxClients(gz(httpTraceAll(api.CopyObjectHandler)))))
|
collectAPIStats("copyobject", maxClients(gz(httpTraceAll(api.CopyObjectHandler)))))
|
||||||
|
@ -50,6 +50,7 @@ type apiConfig struct {
|
|||||||
staleUploadsCleanupInterval time.Duration
|
staleUploadsCleanupInterval time.Duration
|
||||||
deleteCleanupInterval time.Duration
|
deleteCleanupInterval time.Duration
|
||||||
disableODirect bool
|
disableODirect bool
|
||||||
|
gzipObjects bool
|
||||||
}
|
}
|
||||||
|
|
||||||
const cgroupLimitFile = "/sys/fs/cgroup/memory/memory.limit_in_bytes"
|
const cgroupLimitFile = "/sys/fs/cgroup/memory/memory.limit_in_bytes"
|
||||||
@ -152,6 +153,7 @@ func (t *apiConfig) init(cfg api.Config, setDriveCounts []int) {
|
|||||||
t.staleUploadsCleanupInterval = cfg.StaleUploadsCleanupInterval
|
t.staleUploadsCleanupInterval = cfg.StaleUploadsCleanupInterval
|
||||||
t.deleteCleanupInterval = cfg.DeleteCleanupInterval
|
t.deleteCleanupInterval = cfg.DeleteCleanupInterval
|
||||||
t.disableODirect = cfg.DisableODirect
|
t.disableODirect = cfg.DisableODirect
|
||||||
|
t.gzipObjects = cfg.GzipObjects
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *apiConfig) isDisableODirect() bool {
|
func (t *apiConfig) isDisableODirect() bool {
|
||||||
@ -161,6 +163,13 @@ func (t *apiConfig) isDisableODirect() bool {
|
|||||||
return t.disableODirect
|
return t.disableODirect
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *apiConfig) shouldGzipObjects() bool {
|
||||||
|
t.mu.RLock()
|
||||||
|
defer t.mu.RUnlock()
|
||||||
|
|
||||||
|
return t.gzipObjects
|
||||||
|
}
|
||||||
|
|
||||||
func (t *apiConfig) getListQuorum() int {
|
func (t *apiConfig) getListQuorum() int {
|
||||||
t.mu.RLock()
|
t.mu.RLock()
|
||||||
defer t.mu.RUnlock()
|
defer t.mu.RUnlock()
|
||||||
|
@ -37,6 +37,7 @@ import (
|
|||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
|
"github.com/klauspost/compress/gzhttp"
|
||||||
miniogo "github.com/minio/minio-go/v7"
|
miniogo "github.com/minio/minio-go/v7"
|
||||||
"github.com/minio/minio-go/v7/pkg/credentials"
|
"github.com/minio/minio-go/v7/pkg/credentials"
|
||||||
"github.com/minio/minio-go/v7/pkg/encrypt"
|
"github.com/minio/minio-go/v7/pkg/encrypt"
|
||||||
@ -568,6 +569,9 @@ func (api objectAPIHandlers) GetObjectHandler(w http.ResponseWriter, r *http.Req
|
|||||||
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL)
|
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if !globalAPIConfig.shouldGzipObjects() {
|
||||||
|
w.Header().Set(gzhttp.HeaderNoCompression, "true")
|
||||||
|
}
|
||||||
|
|
||||||
if r.Header.Get(xMinIOExtract) == "true" && strings.Contains(object, archivePattern) {
|
if r.Header.Get(xMinIOExtract) == "true" && strings.Contains(object, archivePattern) {
|
||||||
api.getObjectInArchiveFileHandler(ctx, objectAPI, bucket, object, w, r)
|
api.getObjectInArchiveFileHandler(ctx, objectAPI, bucket, object, w, r)
|
||||||
|
@ -44,6 +44,7 @@ const (
|
|||||||
apiStaleUploadsExpiry = "stale_uploads_expiry"
|
apiStaleUploadsExpiry = "stale_uploads_expiry"
|
||||||
apiDeleteCleanupInterval = "delete_cleanup_interval"
|
apiDeleteCleanupInterval = "delete_cleanup_interval"
|
||||||
apiDisableODirect = "disable_odirect"
|
apiDisableODirect = "disable_odirect"
|
||||||
|
apiGzipObjects = "gzip_objects"
|
||||||
|
|
||||||
EnvAPIRequestsMax = "MINIO_API_REQUESTS_MAX"
|
EnvAPIRequestsMax = "MINIO_API_REQUESTS_MAX"
|
||||||
EnvAPIRequestsDeadline = "MINIO_API_REQUESTS_DEADLINE"
|
EnvAPIRequestsDeadline = "MINIO_API_REQUESTS_DEADLINE"
|
||||||
@ -61,6 +62,7 @@ const (
|
|||||||
EnvAPIDeleteCleanupInterval = "MINIO_API_DELETE_CLEANUP_INTERVAL"
|
EnvAPIDeleteCleanupInterval = "MINIO_API_DELETE_CLEANUP_INTERVAL"
|
||||||
EnvDeleteCleanupInterval = "MINIO_DELETE_CLEANUP_INTERVAL"
|
EnvDeleteCleanupInterval = "MINIO_DELETE_CLEANUP_INTERVAL"
|
||||||
EnvAPIDisableODirect = "MINIO_API_DISABLE_ODIRECT"
|
EnvAPIDisableODirect = "MINIO_API_DISABLE_ODIRECT"
|
||||||
|
EnvAPIGzipObjects = "MINIO_API_GZIP_OBJECTS"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Deprecated key and ENVs
|
// Deprecated key and ENVs
|
||||||
@ -124,6 +126,10 @@ var (
|
|||||||
Key: apiDisableODirect,
|
Key: apiDisableODirect,
|
||||||
Value: "off",
|
Value: "off",
|
||||||
},
|
},
|
||||||
|
config.KV{
|
||||||
|
Key: apiGzipObjects,
|
||||||
|
Value: "off",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -142,6 +148,7 @@ type Config struct {
|
|||||||
StaleUploadsExpiry time.Duration `json:"stale_uploads_expiry"`
|
StaleUploadsExpiry time.Duration `json:"stale_uploads_expiry"`
|
||||||
DeleteCleanupInterval time.Duration `json:"delete_cleanup_interval"`
|
DeleteCleanupInterval time.Duration `json:"delete_cleanup_interval"`
|
||||||
DisableODirect bool `json:"disable_odirect"`
|
DisableODirect bool `json:"disable_odirect"`
|
||||||
|
GzipObjects bool `json:"gzip_objects"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalJSON - Validate SS and RRS parity when unmarshalling JSON.
|
// UnmarshalJSON - Validate SS and RRS parity when unmarshalling JSON.
|
||||||
@ -263,6 +270,8 @@ func LookupConfig(kvs config.KVS) (cfg Config, err error) {
|
|||||||
|
|
||||||
disableODirect := env.Get(EnvAPIDisableODirect, kvs.Get(apiDisableODirect)) == config.EnableOn
|
disableODirect := env.Get(EnvAPIDisableODirect, kvs.Get(apiDisableODirect)) == config.EnableOn
|
||||||
|
|
||||||
|
gzipObjects := env.Get(EnvAPIGzipObjects, kvs.Get(apiGzipObjects)) == config.EnableOn
|
||||||
|
|
||||||
return Config{
|
return Config{
|
||||||
RequestsMax: requestsMax,
|
RequestsMax: requestsMax,
|
||||||
RequestsDeadline: requestsDeadline,
|
RequestsDeadline: requestsDeadline,
|
||||||
@ -277,5 +286,6 @@ func LookupConfig(kvs config.KVS) (cfg Config, err error) {
|
|||||||
StaleUploadsExpiry: staleUploadsExpiry,
|
StaleUploadsExpiry: staleUploadsExpiry,
|
||||||
DeleteCleanupInterval: deleteCleanupInterval,
|
DeleteCleanupInterval: deleteCleanupInterval,
|
||||||
DisableODirect: disableODirect,
|
DisableODirect: disableODirect,
|
||||||
|
GzipObjects: gzipObjects,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user