Skip to content

Commit 21f43bf

Browse files
Mickaël SchoentgenBoboTiG
authored andcommitted
NXDRIVE-2309: [Direct Transfer] Improve session counts computing on cancellations
This should prevent having a finished session having more uploaded items than it was supposed to send.
1 parent 05e6084 commit 21f43bf

5 files changed

Lines changed: 19 additions & 34 deletions

File tree

docs/changes/4.5.0.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,21 +145,20 @@ Release date: `2020-xx-xx`
145145
- Changed `DarwinIntegration.unregister_startup()` return type from `bool` to `None`
146146
- Removed `mime_type` keyword argument from `DirectTransferUploader.upload()`
147147
- Added `Engine.cancel_session()`
148-
- Added `Engine.decrease_session_planned_items()`
149148
- Added `Engine.resume_session()`
150149
- Added `Engine.send_metric()`
151150
- Removed `Engine.directTranferItemsCount`
152151
- Added `description` keyword argument to `EngineDAO.create_session()`
153152
- Added `engine_uid` keyword argument to `EngineDAO.create_session()`
154153
- Added `EngineDAO.change_session_status()`
155-
- Added `EngineDAO.decrease_session_planned_items()`
156154
- Added `EngineDAO.get_active_sessions_raw()`
157155
- Added `chunked` keyword argument to `EngineDAO.get_dt_uploads_raw()`
158156
- Added `EngineDAO.save_dt_upload()`
159157
- Added `table` keyword argument to `EngineDAO.get_count()`
160158
- Added `EngineDAO.get_completed_sessions_raw()`
161159
- Added `EngineDAO.pause_session()`
162160
- Added `EngineDAO.sessionUpdated`
161+
- Removed `EngineDao.decrease_session_total()`. Use `decrease_session_counts()` instead.
163162
- Changed `Manager.set_auto_start()` return type from `bool` to `None`
164163
- Added `Options.disallowed_types_for_dt`
165164
- Removed `mime_type` keyword argument from `Remote.stream_file()`

nxdrive/engine/dao/sqlite.py

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2528,9 +2528,9 @@ def change_session_status(self, uid: int, status: TransferStatus) -> None:
25282528
)
25292529
self.sessionUpdated.emit()
25302530

2531-
def decrease_session_total(self, uid: int) -> Optional[Session]:
2531+
def decrease_session_counts(self, uid: int) -> Optional[Session]:
25322532
"""
2533-
Decrease the Session *total_items* count.
2533+
Decrease the Session *total_items* and *planned_items* counts.
25342534
Update the status if all files are uploaded.
25352535
"""
25362536
with self.lock:
@@ -2539,37 +2539,34 @@ def decrease_session_total(self, uid: int) -> Optional[Session]:
25392539
return None
25402540

25412541
session.total_items = max(0, session.total_items - 1)
2542+
session.planned_items = max(0, session.planned_items - 1)
25422543
if session.uploaded_items == session.total_items:
25432544
session.status = (
25442545
TransferStatus.DONE
25452546
if session.total_items
25462547
else TransferStatus.CANCELLED
25472548
)
2548-
sql = "UPDATE Sessions SET total = ?, status = ?, completed_on = CURRENT_TIMESTAMP WHERE uid = ?"
2549+
sql = (
2550+
"UPDATE Sessions SET"
2551+
" planned_items = ?, total = ?, status = ?, completed_on = CURRENT_TIMESTAMP"
2552+
" WHERE uid = ?"
2553+
)
25492554
else:
2550-
sql = "UPDATE Sessions SET total = ?, status = ? WHERE uid = ?"
2555+
sql = "UPDATE Sessions SET planned_items = ?, total = ?, status = ? WHERE uid = ?"
25512556

25522557
cursor = self._get_write_connection().cursor()
25532558
cursor.execute(
2554-
sql, (session.total_items, session.status.value, session.uid)
2559+
sql,
2560+
(
2561+
session.planned_items,
2562+
session.total_items,
2563+
session.status.value,
2564+
session.uid,
2565+
),
25552566
)
25562567
self.sessionUpdated.emit()
25572568
return session
25582569

2559-
def decrease_session_planned_items(self, uid: int) -> None:
2560-
"""Decrease the Session *planned_items* count."""
2561-
with self.lock:
2562-
session = self.get_session(uid)
2563-
if not session:
2564-
return None
2565-
2566-
session.planned_items = max(0, session.planned_items - 1)
2567-
cursor = self._get_write_connection().cursor()
2568-
cursor.execute(
2569-
"UPDATE Sessions SET planned_items = ? WHERE uid = ?",
2570-
(session.planned_items, session.uid),
2571-
)
2572-
25732570
def get_downloads_with_status(self, status: TransferStatus) -> List[Download]:
25742571
return [d for d in self.get_downloads() if d.status == status]
25752572

nxdrive/engine/engine.py

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -690,16 +690,6 @@ def _manage_staled_transfers(self) -> None:
690690
dao.remove_transfer(nature, transfer.path)
691691
log.info(f"Removed staled {transfer}")
692692

693-
def decrease_session_planned_items(self, transfer_uid: int) -> None:
694-
"""Decrease the linked session planned_items count."""
695-
upload = self.dao.get_dt_upload(uid=transfer_uid)
696-
if not upload:
697-
return
698-
doc_pair = self.dao.get_state_from_local(upload.path)
699-
if not doc_pair:
700-
return
701-
self.dao.decrease_session_planned_items(doc_pair.session)
702-
703693
def cancel_upload(self, transfer_uid: int) -> None:
704694
"""Cancel an ongoing Direct Transfer upload and clean the database."""
705695
log.debug(f"Canceling transfer {transfer_uid}")
@@ -724,7 +714,7 @@ def cancel_upload(self, transfer_uid: int) -> None:
724714
self.dao.remove_transfer("upload", upload.path, is_direct_transfer=True)
725715

726716
self.dao.remove_state(doc_pair)
727-
session = self.dao.decrease_session_total(doc_pair.session)
717+
session = self.dao.decrease_session_counts(doc_pair.session)
728718
self.handle_session_status(session)
729719

730720
def cancel_session(self, uid: int) -> None:

nxdrive/engine/processor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,7 @@ def _direct_transfer_end(
563563
):
564564
session = self.dao.update_session(doc_pair.session)
565565
elif cancelled_transfer:
566-
session = self.dao.decrease_session_total(doc_pair.session)
566+
session = self.dao.decrease_session_counts(doc_pair.session)
567567
self.engine.handle_session_status(session)
568568

569569
# For analytics

nxdrive/gui/application.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -870,7 +870,6 @@ def confirm_cancel_transfer(
870870
engine = self.manager.engines.get(engine_uid)
871871
if not engine:
872872
return
873-
engine.decrease_session_planned_items(transfer_uid)
874873
engine.cancel_upload(transfer_uid)
875874

876875
@pyqtSlot(str, int, str, int, result=bool)

0 commit comments

Comments
 (0)