Merge remote-tracking branch 'origin/master' into 3798-bucket-write-abort-tests

This commit is contained in:
Itamar Turner-Trauring 2021-10-06 16:07:39 -04:00
commit 3cf09ef888
7 changed files with 99 additions and 12 deletions

View File

@ -28,7 +28,7 @@ jobs:
- 3.9 - 3.9
include: include:
# On macOS don't bother with 3.6-3.8, just to get faster builds. # On macOS don't bother with 3.6-3.8, just to get faster builds.
- os: macos-latest - os: macos-10.15
python-version: 2.7 python-version: 2.7
- os: macos-latest - os: macos-latest
python-version: 3.9 python-version: 3.9
@ -168,7 +168,7 @@ jobs:
- 3.9 - 3.9
include: include:
# On macOS don't bother with 3.6, just to get faster builds. # On macOS don't bother with 3.6, just to get faster builds.
- os: macos-latest - os: macos-10.15
python-version: 2.7 python-version: 2.7
- os: macos-latest - os: macos-latest
python-version: 3.9 python-version: 3.9
@ -183,7 +183,7 @@ jobs:
# We have to use an older version of Tor for running integration # We have to use an older version of Tor for running integration
# tests on macOS. # tests on macOS.
- name: Install Tor [macOS, ${{ matrix.python-version }} ] - name: Install Tor [macOS, ${{ matrix.python-version }} ]
if: ${{ matrix.os == 'macos-latest' }} if: ${{ contains(matrix.os, 'macos') }}
run: | run: |
brew extract --version 0.4.5.8 tor homebrew/cask brew extract --version 0.4.5.8 tor homebrew/cask
brew install tor@0.4.5.8 brew install tor@0.4.5.8
@ -247,7 +247,7 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
os: os:
- macos-latest - macos-10.15
- windows-latest - windows-latest
- ubuntu-latest - ubuntu-latest
python-version: python-version:

View File

@ -482,8 +482,8 @@ The response includes ``already-have`` and ``allocated`` for two reasons:
This might be because a server has become unavailable and a remaining server needs to store more shares for the upload. This might be because a server has become unavailable and a remaining server needs to store more shares for the upload.
It could also just be that the client's preferred servers have changed. It could also just be that the client's preferred servers have changed.
``PUT /v1/immutable/:storage_index/:share_number`` ``PATCH /v1/immutable/:storage_index/:share_number``
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Write data for the indicated share. Write data for the indicated share.
The share number must belong to the storage index. The share number must belong to the storage index.
@ -531,6 +531,24 @@ The response code:
and no change is made. and no change is made.
Discussion
``````````
``PUT`` verbs are only supposed to be used to replace the whole resource,
thus the use of ``PATCH``.
From RFC 7231::
An origin server that allows PUT on a given target resource MUST send
a 400 (Bad Request) response to a PUT request that contains a
Content-Range header field (Section 4.2 of [RFC7233]), since the
payload is likely to be partial content that has been mistakenly PUT
as a full representation. Partial content updates are possible by
targeting a separately identified resource with state that overlaps a
portion of the larger resource, or by using a different method that
has been specifically defined for partial updates (for example, the
PATCH method defined in [RFC5789]).
``POST /v1/immutable/:storage_index/:share_number/corrupt`` ``POST /v1/immutable/:storage_index/:share_number/corrupt``
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@ -684,19 +702,19 @@ Immutable Data
#. Upload the content for immutable share ``7``:: #. Upload the content for immutable share ``7``::
PUT /v1/immutable/AAAAAAAAAAAAAAAA/7 PATCH /v1/immutable/AAAAAAAAAAAAAAAA/7
Content-Range: bytes 0-15/48 Content-Range: bytes 0-15/48
<first 16 bytes of share data> <first 16 bytes of share data>
200 OK 200 OK
PUT /v1/immutable/AAAAAAAAAAAAAAAA/7 PATCH /v1/immutable/AAAAAAAAAAAAAAAA/7
Content-Range: bytes 16-31/48 Content-Range: bytes 16-31/48
<second 16 bytes of share data> <second 16 bytes of share data>
200 OK 200 OK
PUT /v1/immutable/AAAAAAAAAAAAAAAA/7 PATCH /v1/immutable/AAAAAAAAAAAAAAAA/7
Content-Range: bytes 32-47/48 Content-Range: bytes 32-47/48
<final 16 bytes of share data> <final 16 bytes of share data>

0
newsfragments/3805.minor Normal file
View File

0
newsfragments/3806.minor Normal file
View File

0
newsfragments/3810.minor Normal file
View File

View File

@ -314,10 +314,15 @@ class FakeCanary(object):
def getPeer(self): def getPeer(self):
return "<fake>" return "<fake>"
# For use by tests:
def disconnected(self): def disconnected(self):
for (f, args, kwargs) in list(self.disconnectors.values()): """Disconnect the canary, to be called by test code.
f(*args, **kwargs)
Can only happen once.
"""
if self.disconnectors is not None:
for (f, args, kwargs) in list(self.disconnectors.values()):
f(*args, **kwargs)
self.disconnectors = None
class ShouldFailMixin(object): class ShouldFailMixin(object):

View File

@ -731,6 +731,70 @@ class IStorageServerMutableAPIsTestsMixin(object):
) )
self.assertEqual(reads, {}) self.assertEqual(reads, {})
@inlineCallbacks
def test_slot_readv(self):
"""
Data written with ``IStorageServer.slot_testv_and_readv_and_writev()``
can be read using ``IStorageServer.slot_readv()``. Reads can't go past
the end of the data.
"""
secrets = self.new_secrets()
storage_index = new_storage_index()
(written, _) = yield self.staraw(
storage_index,
secrets,
tw_vectors={
0: ([], [(0, b"abcdefg")], 7),
1: ([], [(0, b"0123"), (4, b"456")], 7),
# This will never get read from, just here to show we only read
# from shares explicitly requested by slot_readv:
2: ([], [(0, b"XYZW")], 4),
},
r_vector=[],
)
self.assertEqual(written, True)
reads = yield self.storage_server.slot_readv(
storage_index,
shares=[0, 1],
# Whole thing, partial, going beyond the edge, completely outside
# range:
readv=[(0, 7), (2, 3), (6, 8), (100, 10)],
)
self.assertEqual(
reads,
{0: [b"abcdefg", b"cde", b"g", b""], 1: [b"0123456", b"234", b"6", b""]},
)
@inlineCallbacks
def test_slot_readv_no_shares(self):
"""
With no shares given, ``IStorageServer.slot_readv()`` reads from all shares.
"""
secrets = self.new_secrets()
storage_index = new_storage_index()
(written, _) = yield self.staraw(
storage_index,
secrets,
tw_vectors={
0: ([], [(0, b"abcdefg")], 7),
1: ([], [(0, b"0123456")], 7),
2: ([], [(0, b"9876543")], 7),
},
r_vector=[],
)
self.assertEqual(written, True)
reads = yield self.storage_server.slot_readv(
storage_index,
shares=[],
readv=[(0, 7)],
)
self.assertEqual(
reads,
{0: [b"abcdefg"], 1: [b"0123456"], 2: [b"9876543"]},
)
class _FoolscapMixin(SystemTestMixin): class _FoolscapMixin(SystemTestMixin):
"""Run tests on Foolscap version of ``IStorageServer.""" """Run tests on Foolscap version of ``IStorageServer."""