mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 12:54:40 +01:00
Added possibility of tree injection to constructor
Speed optimalization - limits number of times folder structures is being build during synchronization loop.
This commit is contained in:
parent
477868c3ca
commit
9ec7ecfdbc
3 changed files with 19 additions and 7 deletions
|
|
@ -20,10 +20,10 @@ log = Logger().get_logger("SyncServer")
|
|||
class GDriveHandler(AbstractProvider):
|
||||
FOLDER_STR = 'application/vnd.google-apps.folder'
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, tree=None):
|
||||
self.service = self._get_gd_service()
|
||||
self.root = self.service.files().get(fileId='root').execute()
|
||||
self.tree = self._build_tree(self.list_folders())
|
||||
self.tree = tree or self._build_tree(self.list_folders())
|
||||
|
||||
def _get_gd_service(self):
|
||||
"""
|
||||
|
|
@ -98,6 +98,16 @@ class GDriveHandler(AbstractProvider):
|
|||
|
||||
return tree
|
||||
|
||||
def get_tree(self):
|
||||
"""
|
||||
Building of the folder tree could be potentially expensive,
|
||||
constructor provides argument that could inject previously created
|
||||
tree.
|
||||
Tree structure must be handled in thread safe fashion!
|
||||
:return: <dictionary> - url to id
|
||||
"""
|
||||
return self.tree
|
||||
|
||||
def get_root_name(self):
|
||||
"""
|
||||
Return name of root folder. Needs to be used as a beginning of
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ class ProviderFactory:
|
|||
def register_provider(self, provider, creator, batch_limit):
|
||||
self.providers[provider] = (creator, batch_limit)
|
||||
|
||||
def get_provider(self, provider):
|
||||
def get_provider(self, provider, tree=None):
|
||||
"""
|
||||
Returns new instance of provider client
|
||||
:param provider: <string> 'gdrive','S3'
|
||||
|
|
@ -27,7 +27,7 @@ class ProviderFactory:
|
|||
"""
|
||||
creator_info = self._get_creator_info(provider)
|
||||
|
||||
return creator_info[0]()
|
||||
return creator_info[0](tree)
|
||||
|
||||
def get_provider_batch_limit(self, provider):
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -120,7 +120,7 @@ class SyncServer():
|
|||
|
||||
return SyncStatus.DO_NOTHING
|
||||
|
||||
async def upload(self, file, representation, provider):
|
||||
async def upload(self, file, representation, provider, tree=None):
|
||||
"""
|
||||
Upload single 'file' of a 'representation' to 'provider'.
|
||||
Source url is taken from 'file' portion, where {root} placeholder
|
||||
|
|
@ -137,7 +137,7 @@ class SyncServer():
|
|||
"""
|
||||
# create ids sequentially, upload file in parallel later
|
||||
with self.lock:
|
||||
handler = lib.factory.get_provider(provider)
|
||||
handler = lib.factory.get_provider(provider, tree)
|
||||
local_root = representation.get("context", {}).get("root")
|
||||
if not local_root:
|
||||
raise ValueError("Unknown local root for file {}")
|
||||
|
|
@ -332,6 +332,7 @@ class SynchServerThread(threading.Thread):
|
|||
# upload process can find already uploaded file and reuse same id
|
||||
processed_file_path = set()
|
||||
for provider in lib.factory.providers.keys():
|
||||
tree = lib.factory.get_provider(provider).get_tree()
|
||||
limit = lib.factory.get_provider_batch_limit(provider)
|
||||
for sync in sync_representations:
|
||||
if limit <= 0:
|
||||
|
|
@ -352,7 +353,8 @@ class SynchServerThread(threading.Thread):
|
|||
task_files_to_upload.append(asyncio.create_task(
|
||||
self.module.upload(file,
|
||||
sync,
|
||||
provider)))
|
||||
provider,
|
||||
tree)))
|
||||
# store info for exception handling
|
||||
files_created_info.append((file,
|
||||
sync,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue