mirror of
https://github.com/drakkan/sftpgo.git
synced 2025-12-07 14:50:55 +03:00
S3: fix quota update after an upload error
S3 uploads are atomic, if the upload fails we have no partial file so we have to update the user quota only if the upload succeed
This commit is contained in:
@@ -44,6 +44,7 @@ type Transfer struct {
|
||||
isFinished bool
|
||||
minWriteOffset int64
|
||||
expectedSize int64
|
||||
initialSize int64
|
||||
lock *sync.Mutex
|
||||
}
|
||||
|
||||
@@ -163,9 +164,7 @@ func (t *Transfer) Close() error {
|
||||
}
|
||||
metrics.TransferCompleted(t.bytesSent, t.bytesReceived, t.transferType, t.transferError)
|
||||
removeTransfer(t)
|
||||
if t.transferType == transferUpload && (numFiles != 0 || t.bytesReceived > 0) {
|
||||
dataprovider.UpdateUserQuota(dataProvider, t.user, numFiles, t.bytesReceived, false)
|
||||
}
|
||||
t.updateQuota(numFiles)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -181,6 +180,18 @@ func (t *Transfer) closeIO() error {
|
||||
return err
|
||||
}
|
||||
|
||||
func (t *Transfer) updateQuota(numFiles int) bool {
|
||||
// S3 uploads are atomic, if there is an error nothing is uploaded
|
||||
if t.file == nil && t.transferError != nil {
|
||||
return false
|
||||
}
|
||||
if t.transferType == transferUpload && (numFiles != 0 || t.bytesReceived > 0) {
|
||||
dataprovider.UpdateUserQuota(dataProvider, t.user, numFiles, t.bytesReceived-t.initialSize, false)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (t *Transfer) checkDownloadSize() {
|
||||
if t.transferType == transferDownload && t.transferError == nil && t.bytesSent < t.expectedSize {
|
||||
t.transferError = fmt.Errorf("incomplete download: %v/%v bytes transferred", t.bytesSent, t.expectedSize)
|
||||
|
||||
Reference in New Issue
Block a user