mirror of
https://github.com/borgbackup/borg.git
synced 2025-02-23 22:51:35 +00:00
Merge pull request #1995 from enkore/f/buffer-exc
helpers.Buffer: raise OSError subclass if too much memory shall be al…
This commit is contained in:
commit
a84466d70c
3 changed files with 17 additions and 10 deletions
|
@ -55,9 +55,15 @@ class Error(Exception):
|
|||
# show a traceback?
|
||||
traceback = False
|
||||
|
||||
def __init__(self, *args):
|
||||
super().__init__(*args)
|
||||
self.args = args
|
||||
|
||||
def get_message(self):
|
||||
return type(self).__doc__.format(*self.args)
|
||||
|
||||
__str__ = get_message
|
||||
|
||||
|
||||
class ErrorWithTraceback(Error):
|
||||
"""like Error, but show a traceback also"""
|
||||
|
@ -699,6 +705,10 @@ class Buffer:
|
|||
"""
|
||||
provide a thread-local buffer
|
||||
"""
|
||||
|
||||
class MemoryLimitExceeded(Error, OSError):
|
||||
"""Requested buffer size {} is above the limit of {}."""
|
||||
|
||||
def __init__(self, allocator, size=4096, limit=None):
|
||||
"""
|
||||
Initialize the buffer: use allocator(size) call to allocate a buffer.
|
||||
|
@ -718,11 +728,11 @@ def resize(self, size, init=False):
|
|||
"""
|
||||
resize the buffer - to avoid frequent reallocation, we usually always grow (if needed).
|
||||
giving init=True it is possible to first-time initialize or shrink the buffer.
|
||||
if a buffer size beyond the limit is requested, raise ValueError.
|
||||
if a buffer size beyond the limit is requested, raise Buffer.MemoryLimitExceeded (OSError).
|
||||
"""
|
||||
size = int(size)
|
||||
if self.limit is not None and size > self.limit:
|
||||
raise ValueError('Requested buffer size %d is above the limit of %d.' % (size, self.limit))
|
||||
raise Buffer.MemoryLimitExceeded(size, self.limit)
|
||||
if init or len(self) < size:
|
||||
self._thread_local.buffer = self.allocator(size)
|
||||
|
||||
|
|
|
@ -793,7 +793,7 @@ def test_limit(self):
|
|||
buffer = Buffer(bytearray, size=100, limit=200)
|
||||
buffer.resize(200)
|
||||
assert len(buffer) == 200
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(Buffer.MemoryLimitExceeded):
|
||||
buffer.resize(201)
|
||||
assert len(buffer) == 200
|
||||
|
||||
|
@ -807,7 +807,7 @@ def test_get(self):
|
|||
b3 = buffer.get(200)
|
||||
assert len(b3) == 200
|
||||
assert b3 is not b2 # new, resized buffer
|
||||
with pytest.raises(ValueError):
|
||||
with pytest.raises(Buffer.MemoryLimitExceeded):
|
||||
buffer.get(201) # beyond limit
|
||||
assert len(buffer) == 200
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
from ctypes.util import find_library
|
||||
from distutils.version import LooseVersion
|
||||
|
||||
from .helpers import Buffer, Error
|
||||
from .helpers import Buffer
|
||||
|
||||
|
||||
try:
|
||||
|
@ -113,11 +113,8 @@ def split_lstring(buf):
|
|||
return result
|
||||
|
||||
|
||||
class BufferTooSmallError(OSError):
|
||||
"""insufficient buffer memory for completing a xattr operation."""
|
||||
|
||||
def __str__(self):
|
||||
return self.__doc__
|
||||
class BufferTooSmallError(Exception):
|
||||
"""the buffer given to an xattr function was too small for the result."""
|
||||
|
||||
|
||||
def _check(rv, path=None, detect_buffer_too_small=False):
|
||||
|
|
Loading…
Reference in a new issue