mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-05-02 09:03:00 +00:00
Merge remote-tracking branch 'origin/master' into 3798-bucket-write-abort-tests
This commit is contained in:
commit
3cf09ef888
8
.github/workflows/ci.yml
vendored
8
.github/workflows/ci.yml
vendored
@ -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:
|
||||||
|
@ -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
0
newsfragments/3805.minor
Normal file
0
newsfragments/3806.minor
Normal file
0
newsfragments/3806.minor
Normal file
0
newsfragments/3810.minor
Normal file
0
newsfragments/3810.minor
Normal 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):
|
||||||
|
@ -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."""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user