From 468155c9c8edebd3ef3d00cf484eb1ee03192d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Tue, 17 Oct 2017 18:59:05 +0200 Subject: [PATCH] Fix cache invalidation on slicing API Wasn't properly revalidating when an already registered slicer switched between unconfigured and configured. Also adjusted data format version tracking on files and slicing API to match. --- src/octoprint/server/api/files.py | 5 +++-- src/octoprint/server/api/slicing.py | 17 ++++++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/octoprint/server/api/files.py b/src/octoprint/server/api/files.py index d7f8f25f..5cd9dede 100644 --- a/src/octoprint/server/api/files.py +++ b/src/octoprint/server/api/files.py @@ -29,7 +29,7 @@ import threading _file_cache = dict() _file_cache_mutex = threading.RLock() -_FILES_DATA_VERSION = 1 +_DATA_FORMAT_VERSION = "v2" def _clear_file_cache(): with _file_cache_mutex: @@ -73,7 +73,6 @@ def _create_etag(path, filter, recursive, lm=None): return None hash = hashlib.sha1() - hash.update(str(_FILES_DATA_VERSION)) hash.update(str(lm)) hash.update(str(filter)) hash.update(str(recursive)) @@ -82,6 +81,8 @@ def _create_etag(path, filter, recursive, lm=None): # include sd data in etag hash.update(repr(sorted(printer.get_sd_files(), key=lambda x: x[0]))) + hash.update(_DATA_FORMAT_VERSION) # increment version if we change the API format + return hash.hexdigest() diff --git a/src/octoprint/server/api/slicing.py b/src/octoprint/server/api/slicing.py index 3427bb3b..5c96008d 100644 --- a/src/octoprint/server/api/slicing.py +++ b/src/octoprint/server/api/slicing.py @@ -17,6 +17,9 @@ from octoprint.settings import settings as s, valid_boolean_trues from octoprint.slicing import UnknownSlicer, SlicerNotConfigured, ProfileAlreadyExists, UnknownProfile, CouldNotDeleteProfile +_DATA_FORMAT_VERSION = "v2" + + def _lastmodified(configured): if configured: slicers = slicingManager.configured_slicers @@ -39,11 +42,19 @@ def _etag(configured, lm=None): hash.update(str(lm)) if configured: - hash.update(repr(sorted(slicingManager.configured_slicers))) + slicers = slicingManager.configured_slicers else: - hash.update(repr(sorted(slicingManager.registered_slicers))) + slicers = slicingManager.registered_slicers - hash.update("v2") # increment version if we change the API format + default_slicer = s().get(["slicing", "defaultSlicer"]) + + for slicer in sorted(slicers): + slicer_impl = slicingManager.get_slicer(slicer, require_configured=False) + hash.update(slicer) + hash.update(str(slicer_impl.is_slicer_configured())) + hash.update(str(slicer == default_slicer)) + + hash.update(_DATA_FORMAT_VERSION) # increment version if we change the API format return hash.hexdigest()