mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-02-21 10:01:54 +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
|
||||
include:
|
||||
# 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
|
||||
- os: macos-latest
|
||||
python-version: 3.9
|
||||
@ -168,7 +168,7 @@ jobs:
|
||||
- 3.9
|
||||
include:
|
||||
# On macOS don't bother with 3.6, just to get faster builds.
|
||||
- os: macos-latest
|
||||
- os: macos-10.15
|
||||
python-version: 2.7
|
||||
- os: macos-latest
|
||||
python-version: 3.9
|
||||
@ -183,7 +183,7 @@ jobs:
|
||||
# We have to use an older version of Tor for running integration
|
||||
# tests on macOS.
|
||||
- name: Install Tor [macOS, ${{ matrix.python-version }} ]
|
||||
if: ${{ matrix.os == 'macos-latest' }}
|
||||
if: ${{ contains(matrix.os, 'macos') }}
|
||||
run: |
|
||||
brew extract --version 0.4.5.8 tor homebrew/cask
|
||||
brew install tor@0.4.5.8
|
||||
@ -247,7 +247,7 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os:
|
||||
- macos-latest
|
||||
- macos-10.15
|
||||
- windows-latest
|
||||
- ubuntu-latest
|
||||
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.
|
||||
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.
|
||||
The share number must belong to the storage index.
|
||||
@ -531,6 +531,24 @@ The response code:
|
||||
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``
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
@ -684,19 +702,19 @@ Immutable Data
|
||||
|
||||
#. Upload the content for immutable share ``7``::
|
||||
|
||||
PUT /v1/immutable/AAAAAAAAAAAAAAAA/7
|
||||
PATCH /v1/immutable/AAAAAAAAAAAAAAAA/7
|
||||
Content-Range: bytes 0-15/48
|
||||
<first 16 bytes of share data>
|
||||
|
||||
200 OK
|
||||
|
||||
PUT /v1/immutable/AAAAAAAAAAAAAAAA/7
|
||||
PATCH /v1/immutable/AAAAAAAAAAAAAAAA/7
|
||||
Content-Range: bytes 16-31/48
|
||||
<second 16 bytes of share data>
|
||||
|
||||
200 OK
|
||||
|
||||
PUT /v1/immutable/AAAAAAAAAAAAAAAA/7
|
||||
PATCH /v1/immutable/AAAAAAAAAAAAAAAA/7
|
||||
Content-Range: bytes 32-47/48
|
||||
<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):
|
||||
return "<fake>"
|
||||
|
||||
# For use by tests:
|
||||
def disconnected(self):
|
||||
for (f, args, kwargs) in list(self.disconnectors.values()):
|
||||
f(*args, **kwargs)
|
||||
"""Disconnect the canary, to be called by test code.
|
||||
|
||||
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):
|
||||
|
@ -731,6 +731,70 @@ class IStorageServerMutableAPIsTestsMixin(object):
|
||||
)
|
||||
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):
|
||||
"""Run tests on Foolscap version of ``IStorageServer."""
|
||||
|
Loading…
x
Reference in New Issue
Block a user