From 9d298dc7788320a570469ed177f3638f7eb9c1d7 Mon Sep 17 00:00:00 2001 From: Koen van der Veen Date: Fri, 30 Oct 2026 13:23:10 +0100 Subject: [PATCH] fix: cache the ids of the SyftBox folders a new account creates get_syftbox_folder_id and get_personal_syftbox_folder_id cached a folder's id only when they found it on Drive, not when they created it. On a new account, login therefore searched for /SyftBox twice, and the first lookup of the personal folder after login searched Drive again. --- .../connections/drive/drive_cached_client.py | 31 +++++++++---------- tests/unit/test_drive_connections.py | 14 +++++++++ 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/syft/sync/connections/drive/drive_cached_client.py b/syft/sync/connections/drive/drive_cached_client.py index 4d6d31d0bcb..af1e291d31f 100644 --- a/syft/sync/connections/drive/drive_cached_client.py +++ b/syft/sync/connections/drive/drive_cached_client.py @@ -295,16 +295,11 @@ def reset_caches(self) -> None: def get_syftbox_folder_id(self) -> str: """/SyftBox""" - # cached - if self._syftbox_folder_id: - return self._syftbox_folder_id - else: - syftbox_folder_id = self.get_syftbox_folder_id_from_drive() - if syftbox_folder_id: - self._syftbox_folder_id = syftbox_folder_id - return self._syftbox_folder_id - else: - return self.create_syftbox_folder() + if self._syftbox_folder_id is None: + self._syftbox_folder_id = ( + self.get_syftbox_folder_id_from_drive() or self.create_syftbox_folder() + ) + return self._syftbox_folder_id def get_syftbox_folder_id_from_drive(self) -> str | None: query = f"name='{SYFTBOX_FOLDER}' and mimeType='application/vnd.google-apps.folder' and 'me' in owners and trashed=false" @@ -323,8 +318,14 @@ def create_syftbox_folder(self) -> str: def get_personal_syftbox_folder_id(self) -> str: """/SyftBox/{version}#{email}""" - if self._personal_syftbox_folder_id: - return self._personal_syftbox_folder_id + if self._personal_syftbox_folder_id is None: + self._personal_syftbox_folder_id = ( + self.get_personal_syftbox_folder_id_from_drive() + or self.create_personal_syftbox_folder() + ) + return self._personal_syftbox_folder_id + + def get_personal_syftbox_folder_id_from_drive(self) -> str | None: folders = self.client.find_folders( name_contains=[f"#{self.email}"], parent_id=self.get_syftbox_folder_id(), @@ -334,14 +335,10 @@ def get_personal_syftbox_folder_id(self) -> str: # '#{peer}#{type}#{email}'. Personal folder shape is exactly # '{version}#{email}', so require a single '#'. folders = [(fid, name) for fid, name in folders if name.count("#") == 1] - folder_id = self.find_or_adopt_versioned_folder( + return self.find_or_adopt_versioned_folder( folders, current_name=GdrivePersonalSyftboxFolder(email=self.email).as_string(), ) - if folder_id: - self._personal_syftbox_folder_id = folder_id - return folder_id - return self.create_personal_syftbox_folder() def create_personal_syftbox_folder(self) -> str: """Creates /SyftBox/{version}#{email}""" diff --git a/tests/unit/test_drive_connections.py b/tests/unit/test_drive_connections.py index 2ae768ca054..68e3da70632 100644 --- a/tests/unit/test_drive_connections.py +++ b/tests/unit/test_drive_connections.py @@ -17,6 +17,7 @@ import syft.sync.connections.connection_router as connection_router_module from syft.sync.connections.connection_router import ConnectionRouter from syft.sync.connections.drive import mock_drive_service +from syft.sync.connections.drive.drive_cached_client import DriveCachedClient from syft.sync.connections.drive.drive_collections import ( CollectionFolder, DriveCollections, @@ -28,6 +29,8 @@ from syft.sync.connections.drive.gdrive_client import GDriveClient from syft.sync.connections.drive.mock_drive_service import ( MockDeleteRequest, + MockDriveBackingStore, + MockDriveService, http_error, pair_with_mock_service, ) @@ -93,6 +96,17 @@ def test_drive_transport_does_every_job(): assert isinstance(transport.platform, GdriveFilesPlatform) +def test_login_on_new_account_searches_each_folder_once(monkeypatch): + calls = _count_drive_calls(monkeypatch) + service = MockDriveService(MockDriveBackingStore(), DO) + cached_client = DriveCachedClient.from_service(DO, service) + cached_client.get_syftbox_folder_id() + cached_client.get_personal_syftbox_folder_id() + + # One search for /SyftBox and one for the personal folder; login creates both. + assert calls == Counter(list=2) + + # -- P2PConnection ----------------------------------------------------------------