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

Commit

Permalink
Merge pull request #3280 from pypeclub/bugfix/site_sync_start_speedup
Browse files Browse the repository at this point in the history
SiteSync: speedup of starting process
  • Loading branch information
kalisp authored Jun 15, 2022
2 parents b341b6d + 63a83dc commit 310b338
Show file tree
Hide file tree
Showing 8 changed files with 96 additions and 68 deletions.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 5 additions & 6 deletions openpype/modules/sync_server/sync_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,14 +280,13 @@ async def sync_loop(self):
while self.is_running and not self.module.is_paused():
try:
import time
start_time = None
start_time = time.time()
self.module.set_sync_project_settings() # clean cache
for collection, preset in self.module.sync_project_settings.\
items():
if collection not in self.module.get_enabled_projects():
continue
collection = None
enabled_projects = self.module.get_enabled_projects()
for collection in enabled_projects:
preset = self.module.sync_project_settings[collection]

start_time = time.time()
local_site, remote_site = self._working_sites(collection)
if not all([local_site, remote_site]):
continue
Expand Down
32 changes: 20 additions & 12 deletions openpype/modules/sync_server/sync_server_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -926,9 +926,22 @@ def get_enabled_projects(self):

return enabled_projects

def is_project_enabled(self, project_name):
def is_project_enabled(self, project_name, single=False):
"""Checks if 'project_name' is enabled for syncing.
'get_sync_project_setting' is potentially expensive operation (pulls
settings for all projects if cached version is not available), using
project_settings for specific project should be faster.
Args:
project_name (str)
single (bool): use 'get_project_settings' method
"""
if self.enabled:
project_settings = self.get_sync_project_setting(project_name)
if single:
project_settings = get_project_settings(project_name)
project_settings = \
self._parse_sync_settings_from_settings(project_settings)
else:
project_settings = self.get_sync_project_setting(project_name)
if project_settings and project_settings.get("enabled"):
return True
return False
Expand Down Expand Up @@ -1026,21 +1039,13 @@ def tray_init(self):
"""
self.server_init()

from .tray.app import SyncServerWindow
self.widget = SyncServerWindow(self)

def server_init(self):
"""Actual initialization of Sync Server."""
# import only in tray or Python3, because of Python2 hosts
from .sync_server import SyncServerThread

if not self.enabled:
return

enabled_projects = self.get_enabled_projects()
if not enabled_projects:
self.enabled = False
return
from .sync_server import SyncServerThread

self.lock = threading.Lock()

Expand All @@ -1060,7 +1065,7 @@ def tray_start(self):
self.server_start()

def server_start(self):
if self.sync_project_settings and self.enabled:
if self.enabled:
self.sync_server_thread.start()
else:
log.info("No presets or active providers. " +
Expand Down Expand Up @@ -1851,6 +1856,9 @@ def get_loop_delay(self, project_name):
Returns:
(int): in seconds
"""
if not project_name:
return 60

ld = self.sync_project_settings[project_name]["config"]["loop_delay"]
return int(ld)

Expand Down
40 changes: 28 additions & 12 deletions openpype/modules/sync_server/tray/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,14 @@ def __init__(self, sync_server, parent=None):

left_column_layout.addWidget(self.pause_btn)

checkbox = QtWidgets.QCheckBox("Show only enabled", self)
checkbox.setStyleSheet("QCheckBox{spacing: 5px;"
"padding:5px 5px 5px 5px;}")
checkbox.setChecked(True)
self.show_only_enabled_chk = checkbox

left_column_layout.addWidget(self.show_only_enabled_chk)

repres = SyncRepresentationSummaryWidget(
sync_server,
project=self.projects.current_project,
Expand Down Expand Up @@ -86,15 +94,27 @@ def __init__(self, sync_server, parent=None):
repres.message_generated.connect(self._update_message)
self.projects.message_generated.connect(self._update_message)

self.show_only_enabled_chk.stateChanged.connect(
self._on_enabled_change
)

self.representationWidget = repres

def showEvent(self, event):
self.representationWidget.set_project(self.projects.current_project)
self.projects.refresh()
self._set_running(True)
super().showEvent(event)

def closeEvent(self, event):
self._set_running(False)
super().closeEvent(event)

def _on_project_change(self):
if self.projects.current_project is None:
return

self.representationWidget.table_view.model().set_project(
self.projects.current_project
)
self.representationWidget.set_project(self.projects.current_project)

project_name = self.projects.current_project
if not self.sync_server.get_sync_project_setting(project_name):
Expand All @@ -103,16 +123,12 @@ def _on_project_change(self):
self.projects.refresh()
return

def showEvent(self, event):
self.representationWidget.model.set_project(
self.projects.current_project)
def _on_enabled_change(self):
"""Called when enabled projects only checkbox is toggled."""
self.projects.show_only_enabled = \
self.show_only_enabled_chk.isChecked()
self.projects.refresh()
self._set_running(True)
super().showEvent(event)

def closeEvent(self, event):
self._set_running(False)
super().closeEvent(event)
self.representationWidget.set_project(None)

def _set_running(self, running):
self.representationWidget.model.is_running = running
Expand Down
39 changes: 21 additions & 18 deletions openpype/modules/sync_server/tray/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ def dbcon(self):
All queries should go through this (because of collection).
"""
return self.sync_server.connection.database[self.project]
if self.project:
return self.sync_server.connection.database[self.project]

@property
def project(self):
Expand Down Expand Up @@ -150,6 +151,9 @@ def data(self, index, role):
@property
def can_edit(self):
"""Returns true if some site is user local site, eg. could edit"""
if not self.project:
return False

return get_local_site_id() in (self.active_site, self.remote_site)

def get_column(self, index):
Expand Down Expand Up @@ -190,7 +194,7 @@ def refresh(self, representations=None, load_records=0):
actually queried (scrolled a couple of times to list more
than single page of records)
"""
if self.is_editing or not self.is_running:
if self.is_editing or not self.is_running or not self.project:
return
self.refresh_started.emit()
self.beginResetModel()
Expand Down Expand Up @@ -232,6 +236,9 @@ def fetchMore(self, index):
more records in DB than loaded.
"""
log.debug("fetchMore")
if not self.dbcon:
return

items_to_fetch = min(self._total_records - self._rec_loaded,
self.PAGE_SIZE)
self.query = self.get_query(self._rec_loaded)
Expand Down Expand Up @@ -286,9 +293,10 @@ def sort(self, index, order):
# replace('False', 'false').\
# replace('True', 'true').replace('None', 'null'))

representations = self.dbcon.aggregate(pipeline=self.query,
allowDiskUse=True)
self.refresh(representations)
if self.dbcon:
representations = self.dbcon.aggregate(pipeline=self.query,
allowDiskUse=True)
self.refresh(representations)

def set_word_filter(self, word_filter):
"""
Expand Down Expand Up @@ -378,9 +386,9 @@ def set_project(self, project):
project (str): name of project
"""
self._project = project
self.sync_server.set_sync_project_settings()
# project might have been deactivated in the meantime
if not self.sync_server.get_sync_project_setting(project):
self._data = {}
return

self.active_site = self.sync_server.get_active_site(self.project)
Expand Down Expand Up @@ -509,25 +517,23 @@ def __init__(self, sync_server, header, project=None, parent=None):

self._word_filter = None

self.sync_server = sync_server
# TODO think about admin mode
self.sort_criteria = self.DEFAULT_SORT

self.timer = QtCore.QTimer()
if not self._project or self._project == lib.DUMMY_PROJECT:
self.active_site = sync_server.DEFAULT_SITE
self.remote_site = sync_server.DEFAULT_SITE
return

self.sync_server = sync_server
# TODO think about admin mode
# this is for regular user, always only single local and single remote
self.active_site = self.sync_server.get_active_site(self.project)
self.remote_site = self.sync_server.get_remote_site(self.project)

self.sort_criteria = self.DEFAULT_SORT

self.query = self.get_query()
self.default_query = list(self.get_query())

representations = self.dbcon.aggregate(pipeline=self.query,
allowDiskUse=True)
self.refresh(representations)

self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.tick)
self.timer.start(self.REFRESH_SEC)

Expand Down Expand Up @@ -1003,9 +1009,6 @@ def __init__(self, sync_server, header, _id,
self.sort_criteria = self.DEFAULT_SORT

self.query = self.get_query()
representations = self.dbcon.aggregate(pipeline=self.query,
allowDiskUse=True)
self.refresh(representations)

self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.tick)
Expand Down
26 changes: 13 additions & 13 deletions openpype/modules/sync_server/tray/widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class SyncProjectListWidget(QtWidgets.QWidget):
message_generated = QtCore.Signal(str)

refresh_msec = 10000
show_only_enabled = True

def __init__(self, sync_server, parent):
super(SyncProjectListWidget, self).__init__(parent)
Expand Down Expand Up @@ -122,11 +123,15 @@ def refresh(self):
self._model_reset = False

selected_item = None
for project_name in self.sync_server.sync_project_settings.\
keys():
sync_settings = self.sync_server.sync_project_settings
for project_name in sync_settings.keys():
if self.sync_server.is_paused() or \
self.sync_server.is_project_paused(project_name):
icon = self._get_icon("paused")
elif not sync_settings[project_name]["enabled"]:
if self.show_only_enabled:
continue
icon = self._get_icon("disabled")
else:
icon = self._get_icon("synced")

Expand All @@ -139,12 +144,12 @@ def refresh(self):
if self.current_project == project_name:
selected_item = item

if model.item(0) is None:
return

if selected_item:
selected_index = model.indexFromItem(selected_item)

if len(self.sync_server.sync_project_settings.keys()) == 0:
model.appendRow(QtGui.QStandardItem(lib.DUMMY_PROJECT))

if not self.current_project:
self.current_project = model.item(0).data(QtCore.Qt.DisplayRole)

Expand Down Expand Up @@ -248,6 +253,9 @@ class _SyncRepresentationWidget(QtWidgets.QWidget):
active_changed = QtCore.Signal() # active index changed
message_generated = QtCore.Signal(str)

def set_project(self, project):
self.model.set_project(project)

def _selection_changed(self, _new_selected, _all_selected):
idxs = self.selection_model.selectedRows()
self._selected_ids = set()
Expand Down Expand Up @@ -581,7 +589,6 @@ def __init__(self, sync_server, project=None, parent=None):
super(SyncRepresentationSummaryWidget, self).__init__(parent)

self.sync_server = sync_server

self._selected_ids = set() # keep last selected _id

txt_filter = QtWidgets.QLineEdit()
Expand Down Expand Up @@ -625,29 +632,23 @@ def __init__(self, sync_server, project=None, parent=None):
column = table_view.model().get_header_index("priority")
priority_delegate = delegates.PriorityDelegate(self)
table_view.setItemDelegateForColumn(column, priority_delegate)

layout = QtWidgets.QVBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
layout.addLayout(top_bar_layout)
layout.addWidget(table_view)

self.table_view = table_view
self.model = model

horizontal_header = HorizontalHeader(self)

table_view.setHorizontalHeader(horizontal_header)
table_view.setSortingEnabled(True)

for column_name, width in self.default_widths:
idx = model.get_header_index(column_name)
table_view.setColumnWidth(idx, width)

table_view.doubleClicked.connect(self._double_clicked)
self.txt_filter.textChanged.connect(lambda: model.set_word_filter(
self.txt_filter.text()))
table_view.customContextMenuRequested.connect(self._on_context_menu)

model.refresh_started.connect(self._save_scrollbar)
model.refresh_finished.connect(self._set_scrollbar)
model.modelReset.connect(self._set_selection)
Expand Down Expand Up @@ -963,7 +964,6 @@ def __init__(self, parent=None):
super(HorizontalHeader, self).__init__(QtCore.Qt.Horizontal, parent)
self._parent = parent
self.checked_values = {}

self.setModel(self._parent.model)

self.setSectionsClickable(True)
Expand Down
2 changes: 1 addition & 1 deletion openpype/tools/loader/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ def reset_sync_server(self, project_name=None):
self._last_manager_cache = now_time

sync_server = self._modules_manager.modules_by_name["sync_server"]
if sync_server.is_project_enabled(project_name):
if sync_server.is_project_enabled(project_name, single=True):
active_site = sync_server.get_active_site(project_name)
active_provider = sync_server.get_provider_for_site(
project_name, active_site)
Expand Down
14 changes: 8 additions & 6 deletions openpype/tools/loader/widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -355,9 +355,10 @@ def on_project_change(self, project_name):
enabled = False
if project_name:
self.model.reset_sync_server(project_name)
if self.model.sync_server:
enabled_proj = self.model.sync_server.get_enabled_projects()
enabled = project_name in enabled_proj
sync_server = self.model.sync_server
if sync_server:
enabled = sync_server.is_project_enabled(project_name,
single=True)

lib.change_visibility(self.model, self.view, "repre_info", enabled)

Expand Down Expand Up @@ -1216,9 +1217,10 @@ def on_project_change(self, project_name):
enabled = False
if project_name:
self.model.reset_sync_server(project_name)
if self.model.sync_server:
enabled_proj = self.model.sync_server.get_enabled_projects()
enabled = project_name in enabled_proj
sync_server = self.model.sync_server
if sync_server:
enabled = sync_server.is_project_enabled(project_name,
single=True)

self.sync_server_enabled = enabled
lib.change_visibility(self.model, self.tree_view,
Expand Down

0 comments on commit 310b338

Please sign in to comment.