[#661] Fix updating cache when request fails

Signed-off-by: Denis Kirillov <denis@nspcc.ru>
This commit is contained in:
Denis Kirillov 2022-08-22 16:32:09 +03:00 committed by Kirillov Denis
parent 1a580b6fa4
commit fdc926e70b
3 changed files with 17 additions and 6 deletions

View file

@ -122,6 +122,7 @@ const (
ErrInvalidBucketObjectLockConfiguration ErrInvalidBucketObjectLockConfiguration
ErrObjectLockConfigurationNotFound ErrObjectLockConfigurationNotFound
ErrObjectLockConfigurationNotAllowed ErrObjectLockConfigurationNotAllowed
ErrObjectLockConfigurationVersioningCannotBeChanged
ErrNoSuchObjectLockConfiguration ErrNoSuchObjectLockConfiguration
ErrObjectLocked ErrObjectLocked
ErrInvalidRetentionDate ErrInvalidRetentionDate
@ -831,6 +832,12 @@ var errorCodes = errorCodeMap{
Description: "Object Lock configuration cannot be enabled on existing buckets", Description: "Object Lock configuration cannot be enabled on existing buckets",
HTTPStatusCode: http.StatusConflict, HTTPStatusCode: http.StatusConflict,
}, },
ErrObjectLockConfigurationVersioningCannotBeChanged: {
ErrCode: ErrObjectLockConfigurationVersioningCannotBeChanged,
Code: "InvalidBucketState",
Description: "An Object Lock configuration is present on this bucket, so the versioning state cannot be changed.",
HTTPStatusCode: http.StatusConflict,
},
ErrNoSuchCORSConfiguration: { ErrNoSuchCORSConfiguration: {
ErrCode: ErrNoSuchCORSConfiguration, ErrCode: ErrNoSuchCORSConfiguration,
Code: "NoSuchCORSConfiguration", Code: "NoSuchCORSConfiguration",

View file

@ -56,11 +56,13 @@ func (h *handler) PutBucketObjectLockConfigHandler(w http.ResponseWriter, r *htt
return return
} }
settings.LockConfiguration = lockingConf // settings pointer is stored in the cache, so modify a copy of the settings
newSettings := *settings
newSettings.LockConfiguration = lockingConf
sp := &layer.PutSettingsParams{ sp := &layer.PutSettingsParams{
BktInfo: bktInfo, BktInfo: bktInfo,
Settings: settings, Settings: &newSettings,
} }
if err = h.obj.PutBucketSettings(r.Context(), sp); err != nil { if err = h.obj.PutBucketSettings(r.Context(), sp); err != nil {

View file

@ -2,7 +2,6 @@ package handler
import ( import (
"encoding/xml" "encoding/xml"
"fmt"
"net/http" "net/http"
"github.com/nspcc-dev/neofs-s3-gw/api" "github.com/nspcc-dev/neofs-s3-gw/api"
@ -37,15 +36,18 @@ func (h *handler) PutBucketVersioningHandler(w http.ResponseWriter, r *http.Requ
h.logAndSendError(w, "invalid versioning configuration", reqInfo, errors.GetAPIError(errors.ErrMalformedXML)) h.logAndSendError(w, "invalid versioning configuration", reqInfo, errors.GetAPIError(errors.ErrMalformedXML))
return return
} }
settings.Versioning = configuration.Status
// settings pointer is stored in the cache, so modify a copy of the settings
newSettings := *settings
newSettings.Versioning = configuration.Status
p := &layer.PutSettingsParams{ p := &layer.PutSettingsParams{
BktInfo: bktInfo, BktInfo: bktInfo,
Settings: settings, Settings: &newSettings,
} }
if p.Settings.VersioningSuspended() && bktInfo.ObjectLockEnabled { if p.Settings.VersioningSuspended() && bktInfo.ObjectLockEnabled {
h.logAndSendError(w, "couldn't suspend bucket versioning", reqInfo, fmt.Errorf("object lock is enabled")) h.logAndSendError(w, "couldn't suspend bucket versioning", reqInfo, errors.GetAPIError(errors.ErrObjectLockConfigurationVersioningCannotBeChanged))
return return
} }