2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-28 11:36:44 +00:00

Improve custom maintenance mode backend (#9396)

* Improve custom maintenance mode backend

- Utilizing global settings functions
- Will use global cache if available
- Fewer DB hits per request

* Twaeak query limits
This commit is contained in:
Oliver 2025-03-27 15:56:00 +11:00 committed by GitHub
parent e1d6d15ae7
commit 49d088893f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 23 additions and 26 deletions

View File

@ -1,14 +1,12 @@
"""Custom backend implementations.""" """Custom backend implementation for maintenance-mode."""
import datetime import datetime
import time import time
from django.db.utils import IntegrityError, OperationalError, ProgrammingError
import structlog import structlog
from maintenance_mode.backends import AbstractStateBackend from maintenance_mode.backends import AbstractStateBackend
import common.models from common.settings import get_global_setting, set_global_setting
logger = structlog.get_logger('inventree') logger = structlog.get_logger('inventree')
@ -28,15 +26,11 @@ class InvenTreeMaintenanceModeBackend(AbstractStateBackend):
bool: True if maintenance mode is active, False otherwise. bool: True if maintenance mode is active, False otherwise.
""" """
try: try:
setting = common.models.InvenTreeSetting.objects.get(key=self.SETTING_KEY) value = get_global_setting(self.SETTING_KEY)
value = str(setting.value).strip() except Exception:
except common.models.InvenTreeSetting.DoesNotExist:
# Database is accessible, but setting is not available - assume False
return False
except (IntegrityError, OperationalError, ProgrammingError):
# Database is inaccessible - assume we are not in maintenance mode # Database is inaccessible - assume we are not in maintenance mode
logger.debug('Failed to read maintenance mode state - assuming True') logger.debug('Failed to read maintenance mode state - assuming False')
return True return False
# Extract timestamp from string # Extract timestamp from string
try: try:
@ -65,21 +59,24 @@ class InvenTreeMaintenanceModeBackend(AbstractStateBackend):
# Blank timestamp means maintenance mode is not active # Blank timestamp means maintenance mode is not active
timestamp = '' timestamp = ''
while retries > 0: r = retries
try:
common.models.InvenTreeSetting.set_setting(self.SETTING_KEY, timestamp)
while r > 0:
try:
set_global_setting(self.SETTING_KEY, timestamp)
# Read the value back to confirm # Read the value back to confirm
if self.get_value() == value: if self.get_value() == value:
break break
except (IntegrityError, OperationalError, ProgrammingError): except Exception:
# In the database is locked, then # In the database is locked, then
logger.debug( logger.debug(
'Failed to set maintenance mode state (%s retries left)', retries 'Failed to set maintenance mode state (%s retries left)', r
) )
time.sleep(0.1) time.sleep(0.1)
retries -= 1 r -= 1
if retries == 0: if r == 0:
logger.warning('Failed to set maintenance mode state') logger.warning(
'Failed to set maintenance mode state after %s retries', retries
)

View File

@ -203,8 +203,8 @@ class PurchaseOrderTest(OrderTest):
self.LIST_URL, data={'limit': limit}, expected_code=200 self.LIST_URL, data={'limit': limit}, expected_code=200
) )
# Total database queries must be below 15, independent of the number of results # Total database queries must be below 20, independent of the number of results
self.assertLess(len(ctx), 15) self.assertLess(len(ctx), 20)
for result in response.data['results']: for result in response.data['results']:
self.assertIn('total_price', result) self.assertIn('total_price', result)
@ -1351,8 +1351,8 @@ class SalesOrderTest(OrderTest):
self.LIST_URL, data={'limit': limit}, expected_code=200 self.LIST_URL, data={'limit': limit}, expected_code=200
) )
# Total database queries must be less than 15 # Total database queries must be less than 20
self.assertLess(len(ctx), 15) self.assertLess(len(ctx), 20)
n = len(response.data['results']) n = len(response.data['results'])

View File

@ -539,7 +539,7 @@ class PartCategoryAPITest(InvenTreeAPITestCase):
PartCategory.objects.rebuild() PartCategory.objects.rebuild()
with self.assertNumQueriesLessThan(12): with self.assertNumQueriesLessThan(15):
response = self.get(reverse('api-part-category-tree'), expected_code=200) response = self.get(reverse('api-part-category-tree'), expected_code=200)
self.assertEqual(len(response.data), PartCategory.objects.count()) self.assertEqual(len(response.data), PartCategory.objects.count())

View File

@ -452,7 +452,7 @@ class StockLocationTest(StockAPITestCase):
StockLocation.objects.rebuild() StockLocation.objects.rebuild()
with self.assertNumQueriesLessThan(12): with self.assertNumQueriesLessThan(15):
response = self.get(reverse('api-location-tree'), expected_code=200) response = self.get(reverse('api-location-tree'), expected_code=200)
self.assertEqual(len(response.data), StockLocation.objects.count()) self.assertEqual(len(response.data), StockLocation.objects.count())