We've gone back and forth about this. In the initial commit, it couldn't possibly work because you wouldn't be able to get the Etags to match. Then it was expressly disallowed with a custom error message, and now its allowed. The reason we're allowing it is that 1,000 segments isn't enough for some use cases and we decided its better than just upping the number of allowed segments. The code to make it work isn't all that complicated and it allows for virtually unlimited SLO object size. There is also a new configurable limit on the maximum connection time for both SLOs and DLOs defaulting to 1 day. This will hopefully alleviate worries about infinite requests. Think I'll leave the python-swift client support for nested SLOs to somebody else though :). DocImpact Change-Id: Id16187481b37e716d2bd09bdbab8cc87537e3ddd
117 lines
2.0 KiB
Python
117 lines
2.0 KiB
Python
# Copyright (c) 2010-2012 OpenStack, LLC.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
# implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
from eventlet import Timeout
|
|
|
|
|
|
class MessageTimeout(Timeout):
|
|
|
|
def __init__(self, seconds=None, msg=None):
|
|
Timeout.__init__(self, seconds=seconds)
|
|
self.msg = msg
|
|
|
|
def __str__(self):
|
|
return '%s: %s' % (Timeout.__str__(self), self.msg)
|
|
|
|
|
|
class SwiftException(Exception):
|
|
pass
|
|
|
|
|
|
class SwiftConfigurationError(SwiftException):
|
|
pass
|
|
|
|
|
|
class AuditException(SwiftException):
|
|
pass
|
|
|
|
|
|
class DiskFileError(SwiftException):
|
|
pass
|
|
|
|
|
|
class DiskFileCollision(SwiftException):
|
|
pass
|
|
|
|
|
|
class DiskFileNotExist(SwiftException):
|
|
pass
|
|
|
|
|
|
class DiskFileNoSpace(SwiftException):
|
|
pass
|
|
|
|
|
|
class PathNotDir(OSError):
|
|
pass
|
|
|
|
|
|
class AuthException(SwiftException):
|
|
pass
|
|
|
|
|
|
class ChunkReadTimeout(Timeout):
|
|
pass
|
|
|
|
|
|
class ChunkWriteTimeout(Timeout):
|
|
pass
|
|
|
|
|
|
class ConnectionTimeout(Timeout):
|
|
pass
|
|
|
|
|
|
class DriveNotMounted(SwiftException):
|
|
pass
|
|
|
|
|
|
class LockTimeout(MessageTimeout):
|
|
pass
|
|
|
|
|
|
class RingBuilderError(SwiftException):
|
|
pass
|
|
|
|
|
|
class RingValidationError(RingBuilderError):
|
|
pass
|
|
|
|
|
|
class EmptyRingError(RingBuilderError):
|
|
pass
|
|
|
|
|
|
class DuplicateDeviceError(RingBuilderError):
|
|
pass
|
|
|
|
|
|
class ListingIterError(SwiftException):
|
|
pass
|
|
|
|
|
|
class ListingIterNotFound(ListingIterError):
|
|
pass
|
|
|
|
|
|
class ListingIterNotAuthorized(ListingIterError):
|
|
|
|
def __init__(self, aresp):
|
|
self.aresp = aresp
|
|
|
|
|
|
class SegmentError(SwiftException):
|
|
pass
|