Skip to content

Commit d3a64a1

Browse files
committed
Allow repeat push/pull of buffers
1 parent 73bca99 commit d3a64a1

2 files changed

Lines changed: 43 additions & 10 deletions

File tree

morango/sync/utils.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,18 +128,26 @@ def validate_and_create_buffer_data( # noqa: C901
128128
buffer_list += [Buffer(**record)]
129129

130130
with transaction.atomic():
131-
transfer_session.records_transferred += len(data)
131+
deleted_buffers, _ = Buffer.objects.filter(
132+
transfer_session=transfer_session,
133+
model_uuid__in=[record["model_uuid"] for record in data]
134+
).delete()
135+
RecordMaxCounterBuffer.objects.filter(
136+
transfer_session=transfer_session,
137+
model_uuid__in=[record["model_uuid"] for record in data]
138+
).delete()
132139

133140
if connection is not None:
134141
transfer_session.bytes_sent = connection.bytes_sent
135142
if connection is not None:
136143
transfer_session.bytes_received = connection.bytes_received
137144

138-
transfer_session.save()
139-
140145
Buffer.objects.bulk_create(buffer_list)
141146
RecordMaxCounterBuffer.objects.bulk_create(rmcb_list)
142147

148+
transfer_session.records_transferred += len(buffer_list) - deleted_buffers
149+
transfer_session.save()
150+
143151

144152
class SyncSignal(object):
145153
"""

tests/testapp/tests/test_api.py

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -897,7 +897,7 @@ def build_buffer_item(self, **kwargs):
897897

898898
return buffermodel
899899

900-
def make_buffer_post_request(self, buffers, expected_status=201, gzip=False):
900+
def make_buffer_post_request(self, buffers, expected_status=201, gzip=False, pre_count=0):
901901
serialized_recs = BufferSerializer(buffers, many=True)
902902

903903
# extract that data that is to be posted
@@ -911,9 +911,13 @@ def make_buffer_post_request(self, buffers, expected_status=201, gzip=False):
911911
headers["content_type"] = "application/gzip"
912912
headers["format"] = None
913913

914-
# delete the records from the DB so we don't conflict when we POST
915-
Buffer.objects.all().delete()
916-
RecordMaxCounterBuffer.objects.all().delete()
914+
# delete the records to match pre_count if zero
915+
if pre_count == 0:
916+
Buffer.objects.all().delete()
917+
RecordMaxCounterBuffer.objects.all().delete()
918+
else:
919+
self.assertEqual(Buffer.objects.count(), pre_count)
920+
self.assertEqual(RecordMaxCounterBuffer.objects.count(), pre_count * 3)
917921

918922
response = self.client.post(reverse("buffers-list"), data, **headers)
919923
self.assertEqual(response.status_code, expected_status)
@@ -964,6 +968,22 @@ def test_push_fails_for_pull_transfersession(self):
964968
rec_3 = self.build_buffer_item(transfer_session=rec_1.transfer_session)
965969
self.make_buffer_post_request([rec_1, rec_2, rec_3], expected_status=403)
966970

971+
def test_push_repeat_chunk(self):
972+
rec_1 = self.build_buffer_item(push=True, filter=self.default_push_filter)
973+
transfer_session = rec_1.transfer_session
974+
rec_2 = self.build_buffer_item(transfer_session=transfer_session)
975+
# need to create a third buffer so it doesn't mark the transfer complete after pushing 2
976+
self.build_buffer_item(transfer_session=transfer_session)
977+
self.assertEqual(transfer_session.records_transferred, 0)
978+
979+
self.make_buffer_post_request([rec_1, rec_2], expected_status=201)
980+
transfer_session.refresh_from_db()
981+
self.assertEqual(transfer_session.records_transferred, 2)
982+
983+
self.make_buffer_post_request([rec_1, rec_2], expected_status=201, pre_count=2)
984+
transfer_session.refresh_from_db()
985+
self.assertEqual(transfer_session.records_transferred, 2)
986+
967987
def create_records_for_pulling(self, count=3, **kwargs):
968988

969989
assert count >= 1
@@ -1025,11 +1045,9 @@ def make_buffer_get_request(
10251045
transfer_session_id=t_id, model_uuid__in=model_uuids
10261046
).delete()
10271047

1028-
# run the validation logic to ensure no errors were returned
1029-
errors = validate_and_create_buffer_data(
1048+
validate_and_create_buffer_data(
10301049
data, TransferSession.objects.get(id=t_id)
10311050
)
1032-
self.assertFalse(errors)
10331051

10341052
# check that the correct number of buffer items were created
10351053
self.assertEqual(
@@ -1061,6 +1079,13 @@ def test_pull_valid_buffer_list(self):
10611079

10621080
self.make_buffer_get_request(transfer_session_id=transfer_session_id)
10631081

1082+
def test_pull_repeat(self):
1083+
1084+
transfer_session_id = self.create_records_for_pulling(count=3)
1085+
1086+
self.make_buffer_get_request(transfer_session_id=transfer_session_id, expected_count=3)
1087+
self.make_buffer_get_request(transfer_session_id=transfer_session_id, expected_count=3)
1088+
10641089
def test_pull_fails_when_transfer_session_id_not_specified(self):
10651090

10661091
self.create_records_for_pulling()

0 commit comments

Comments
 (0)