The Shaman server is a file storage system that identifies files by SHA256sum and file length. BAT can send packs there by only uploading changed/new files. The BAT pack is reproduced at the Shaman server's checkout directory by creating symlinks to the files in its file storage. Retrying sending files: When we can defer uploading a file (that is, when we have other files to upload as well, and we could send the current file at a later moment) we send an `X-Shaman-Can-Defer-Upload: true` header in the file upload request. In that case, when someone else is already uploading that file, a `208 Already Reported` response is sent and the connection is closed. Python's Requests library unfortunately won't give us that response if we're still streaming the request, and raise a ConnectionError exception instead. This exception can mean two things: - If the `X-Shaman-Can-Defer-Upload: true` header was sent: someone else is currently uploading that file, so defer it. - If that header was not sent: that file is already completely uploaded and does not need to be uploaded again. Instead of retrying each failed file, after a few failures we now just resend the definition file to get a new list of files to upload, then send those. This should considerably reduce the number of HTTP calls when multiple clients are uploading the same set of files.
30 lines
824 B
Python
30 lines
824 B
Python
import unittest
|
|
from unittest import mock
|
|
|
|
from blender_asset_tracer.pack.shaman import time_tracker
|
|
|
|
|
|
class TimeTrackerTest(unittest.TestCase):
|
|
@mock.patch('time.monotonic')
|
|
def test_empty_class(self, mock_monotonic):
|
|
class TestClass:
|
|
pass
|
|
|
|
mock_monotonic.side_effect = [1.25, 4.75]
|
|
with time_tracker.track_time(TestClass, 'some_attr'):
|
|
pass
|
|
|
|
# noinspection PyUnresolvedReferences
|
|
self.assertEqual(3.5, TestClass.some_attr)
|
|
|
|
@mock.patch('time.monotonic')
|
|
def test_with_value(self, mock_monotonic):
|
|
class TestClass:
|
|
some_attr = 4.125
|
|
|
|
mock_monotonic.side_effect = [1.25, 4.75]
|
|
with time_tracker.track_time(TestClass, 'some_attr'):
|
|
pass
|
|
|
|
self.assertEqual(3.5 + 4.125, TestClass.some_attr)
|