Skip to content

Commit 635f8d9

Browse files
authored
Merge pull request #346 from bjester/tidy-the-strawberry-fields
Scoped field updates and context initialization issue
2 parents 41636c4 + f2f513c commit 635f8d9

6 files changed

Lines changed: 44 additions & 13 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ List of the most important changes for each release.
44

55
## 0.8.15
66
- Improves buffer serialization performance by performing bulk counter lookup
7+
- Corrects an initialization issue with `SessionContext` that leads to an incorrect value for `is_push`
8+
- Save calls to Morango models during a sync are now scoped to only the changed fields
79

810
## 0.8.14
911
- Adds utility for addressing immediate FK constraints caused by Django upgrade, automatically performed for morango models in a Django migration.

morango/models/core.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ def update_state(self, stage=None, stage_status=None):
319319
:type stage: morango.constants.transfer_stages.*|None
320320
:type stage_status: morango.constants.transfer_statuses.*|None
321321
"""
322+
update_fields = []
322323
if stage is not None:
323324
if self.transfer_stage and transfer_stages.stage(
324325
self.transfer_stage
@@ -329,13 +330,18 @@ def update_state(self, stage=None, stage_status=None):
329330
)
330331
)
331332
self.transfer_stage = stage
333+
update_fields.append("transfer_stage")
334+
332335
if stage_status is not None:
333336
self.transfer_stage_status = stage_status
334-
if stage is not None or stage_status is not None:
337+
update_fields.append("transfer_stage_status")
338+
339+
if update_fields:
335340
self.last_activity_timestamp = timezone.now()
336-
self.save()
341+
update_fields.append("last_activity_timestamp")
342+
self.save(update_fields=update_fields)
337343
self.sync_session.last_activity_timestamp = timezone.now()
338-
self.sync_session.save()
344+
self.sync_session.save(update_fields=["last_activity_timestamp"])
339345

340346
def delete_buffers(self):
341347
"""

morango/sync/context.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def __init__(
5252

5353
if self.transfer_session:
5454
self.sync_session = transfer_session.sync_session or self.sync_session
55-
self.is_push = transfer_session.push or self.is_push
55+
self.is_push = transfer_session.push
5656
if transfer_session.filter:
5757
self.filter = transfer_session.get_filter()
5858

morango/sync/operations.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,9 +1107,11 @@ def handle(self, context):
11071107
context.transfer_session.client_fsic = context.request.data.get(
11081108
"client_fsic", "{}"
11091109
)
1110+
update_fields = ["server_fsic", "client_fsic"]
11101111
else:
11111112
context.transfer_session.client_fsic = fsic
1112-
context.transfer_session.save()
1113+
update_fields = ["client_fsic"]
1114+
context.transfer_session.save(update_fields=update_fields)
11131115
return transfer_statuses.COMPLETED
11141116

11151117

@@ -1138,7 +1140,7 @@ def handle(self, context):
11381140

11391141
logger.debug("[morango] Queued {} records".format(records_total))
11401142
context.transfer_session.records_total = records_total
1141-
context.transfer_session.save()
1143+
context.transfer_session.save(update_fields=["records_total"])
11421144
return transfer_statuses.COMPLETED
11431145

11441146

@@ -1342,7 +1344,7 @@ def handle(self, context):
13421344
context.transfer_session.delete_buffers()
13431345

13441346
context.transfer_session.active = False
1345-
context.transfer_session.save()
1347+
context.transfer_session.save(update_fields=["active"])
13461348
return transfer_statuses.COMPLETED
13471349

13481350

@@ -1493,15 +1495,17 @@ def handle(self, context):
14931495

14941496
data = self.create_transfer_session(context)
14951497
context.transfer_session.server_fsic = data.get("server_fsic") or "{}"
1498+
update_fields = ["server_fsic"]
14961499

14971500
# A legacy instance performs queuing during the creation of the transfer session, so since we use a new
14981501
# workflow we need to update the network server when pushing to say how many records we've queued. For pull,
14991502
# we handle that here in the initialization/creation of the transfer session,
15001503
# since that's when it's first available.
15011504
if context.transfer_session.pull:
15021505
context.transfer_session.records_total = data.get("records_total", 0)
1506+
update_fields.append("records_total")
15031507

1504-
context.transfer_session.save()
1508+
context.transfer_session.save(update_fields=update_fields)
15051509
return transfer_statuses.COMPLETED
15061510

15071511

@@ -1569,7 +1573,7 @@ def handle(self, context):
15691573

15701574
if remote_status == transfer_statuses.COMPLETED:
15711575
context.transfer_session.server_fsic = data.get("server_fsic")
1572-
context.transfer_session.save()
1576+
context.transfer_session.save(update_fields=["server_fsic"])
15731577

15741578
return remote_status
15751579

@@ -1618,7 +1622,7 @@ def handle(self, context):
16181622

16191623
if context.is_pull and remote_status == transfer_statuses.COMPLETED:
16201624
context.transfer_session.records_total = data.get("records_total", 0)
1621-
context.transfer_session.save()
1625+
context.transfer_session.save(update_fields=["records_total"])
16221626

16231627
return remote_status
16241628

@@ -1654,7 +1658,7 @@ def handle(self, context):
16541658
)
16551659
context.transfer_session.bytes_sent = context.connection.bytes_sent
16561660
context.transfer_session.bytes_received = context.connection.bytes_received
1657-
context.transfer_session.save()
1661+
context.transfer_session.save(update_fields=["records_transferred", "bytes_sent", "bytes_received"])
16581662

16591663
# if we've transferred all records, return a completed status
16601664
op_status = transfer_statuses.PENDING

morango/sync/utils.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,16 +137,17 @@ def validate_and_create_buffer_data( # noqa: C901
137137
model_uuid__in=[record["model_uuid"] for record in data]
138138
).delete()
139139

140+
update_fields = ["records_transferred"]
140141
if connection is not None:
141142
transfer_session.bytes_sent = connection.bytes_sent
142-
if connection is not None:
143143
transfer_session.bytes_received = connection.bytes_received
144+
update_fields.extend(["bytes_sent", "bytes_received"])
144145

145146
Buffer.objects.bulk_create(buffer_list)
146147
RecordMaxCounterBuffer.objects.bulk_create(rmcb_list)
147148

148149
transfer_session.records_transferred += len(buffer_list) - deleted_buffers
149-
transfer_session.save()
150+
transfer_session.save(update_fields=update_fields)
150151

151152

152153
class SyncSignal(object):

tests/testapp/tests/sync/test_context.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,24 @@ def test_init__with_transfer_session(self):
6767
self.assertFalse(context.is_push)
6868
self.assertTrue(context.is_pull)
6969

70+
def test_init__with_transfer_session__direction_handling(self):
71+
sync_session = mock.Mock(spec=SyncSession)
72+
sync_filter = Filter("before_filter")
73+
transfer_session = mock.Mock(
74+
spec=TransferSession,
75+
sync_session=sync_session,
76+
push=False,
77+
filter="after_filter",
78+
transfer_stage=transfer_stages.TRANSFERRING,
79+
transfer_stage_status=transfer_statuses.STARTED,
80+
)
81+
transfer_session.get_filter.return_value = Filter(transfer_session.filter)
82+
83+
# the transfer session's `push=False` should take precedence over the constructor arg
84+
context = TestSessionContext(transfer_session=transfer_session, sync_filter=sync_filter, is_push=True)
85+
self.assertFalse(context.is_push)
86+
self.assertTrue(context.is_pull)
87+
7088
def test_init__with_transfer_session__no_filter(self):
7189
sync_session = mock.Mock(spec=SyncSession)
7290
sync_filter = Filter("before_filter")

0 commit comments

Comments
 (0)