Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

Loader UI: Speed issues of loader with sync server #3199

Merged
merged 2 commits into from
May 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions openpype/modules/sync_server/sync_server_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -921,12 +921,18 @@ def get_enabled_projects(self):
if self.enabled:
for project in self.connection.projects(projection={"name": 1}):
project_name = project["name"]
project_settings = self.get_sync_project_setting(project_name)
if project_settings and project_settings.get("enabled"):
if self.is_project_enabled(project_name):
enabled_projects.append(project_name)

return enabled_projects

def is_project_enabled(self, project_name):
if self.enabled:
project_settings = self.get_sync_project_setting(project_name)
if project_settings and project_settings.get("enabled"):
return True
return False

def handle_alternate_site(self, collection, representation, processed_site,
file_id, synced_file_id):
"""
Expand Down
66 changes: 50 additions & 16 deletions openpype/tools/loader/model.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import copy
import re
import math
import time
from uuid import uuid4

from Qt import QtCore, QtGui
Expand Down Expand Up @@ -38,6 +39,14 @@ def is_filtering_recursible():

class BaseRepresentationModel(object):
"""Methods for SyncServer useful in multiple models"""
# Cheap & hackish way how to avoid refreshing of whole sync server module
# on each selection change
_last_project = None
_modules_manager = None
_last_project_cache = 0
_last_manager_cache = 0
_max_project_cache_time = 30
_max_manager_cache_time = 60

def reset_sync_server(self, project_name=None):
"""Sets/Resets sync server vars after every change (refresh.)"""
Expand All @@ -47,28 +56,53 @@ def reset_sync_server(self, project_name=None):
remote_site = remote_provider = None

if not project_name:
project_name = self.dbcon.Session["AVALON_PROJECT"]
project_name = self.dbcon.Session.get("AVALON_PROJECT")
else:
self.dbcon.Session["AVALON_PROJECT"] = project_name

if project_name:
manager = ModulesManager()
sync_server = manager.modules_by_name["sync_server"]
if not project_name:
self.repre_icons = repre_icons
self.sync_server = sync_server
self.active_site = active_site
self.active_provider = active_provider
self.remote_site = remote_site
self.remote_provider = remote_provider
return

now_time = time.time()
project_cache_diff = now_time - self._last_project_cache
if project_cache_diff > self._max_project_cache_time:
self._last_project = None

if project_name == self._last_project:
return

if project_name in sync_server.get_enabled_projects():
active_site = sync_server.get_active_site(project_name)
active_provider = sync_server.get_provider_for_site(
project_name, active_site)
if active_site == 'studio': # for studio use explicit icon
active_provider = 'studio'
self._last_project = project_name
self._last_project_cache = now_time

remote_site = sync_server.get_remote_site(project_name)
remote_provider = sync_server.get_provider_for_site(
project_name, remote_site)
if remote_site == 'studio': # for studio use explicit icon
remote_provider = 'studio'
manager_cache_diff = now_time - self._last_manager_cache
if manager_cache_diff > self._max_manager_cache_time:
self._modules_manager = None

if self._modules_manager is None:
self._modules_manager = ModulesManager()
self._last_manager_cache = now_time

sync_server = self._modules_manager.modules_by_name["sync_server"]
if sync_server.is_project_enabled(project_name):
active_site = sync_server.get_active_site(project_name)
active_provider = sync_server.get_provider_for_site(
project_name, active_site)
if active_site == 'studio': # for studio use explicit icon
active_provider = 'studio'

remote_site = sync_server.get_remote_site(project_name)
remote_provider = sync_server.get_provider_for_site(
project_name, remote_site)
if remote_site == 'studio': # for studio use explicit icon
remote_provider = 'studio'

repre_icons = lib.get_repre_icons()
repre_icons = lib.get_repre_icons()
Copy link
Collaborator

@BigRoy BigRoy May 17, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would you want to cache this too? Or isn't this called as frequently?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know. I just made quick fix so it's usable in production...


self.repre_icons = repre_icons
self.sync_server = sync_server
Expand Down