Skip to content

Commit 6d38239

Browse files
committed
feat(persist): replaced persist O(n2) REST calls with O(1) PyMongo calls
1 parent 2bf0783 commit 6d38239

2 files changed

Lines changed: 24 additions & 66 deletions

File tree

users/persistence.py

Lines changed: 7 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
11
import json
22
from datetime import datetime
33

4-
import requests
54
from bson import ObjectId
6-
from requests.exceptions import HTTPError
75

86
from .models import get_arenaobjects_collection
9-
from .utils import get_rest_host
10-
11-
PERSIST_TIMEOUT = 30 # 30 seconds
12-
137

148
# Mongo DB PyMongo queries for Persist:
159
# https://pymongo.readthedocs.io/en/stable/index.html
@@ -88,31 +82,13 @@ def read_persist_scene_objects(namespace, scene):
8882
return json.loads(json_str)
8983

9084

91-
# Mongo DB REST queries for Persist:
92-
93-
94-
def delete_scene_objects(token, scene):
95-
# delete scene objects from persist
96-
verify, host = get_rest_host()
97-
url = f"https://{host}/persist/{scene}"
98-
result = _urlopen(url, token, "DELETE", verify)
85+
def delete_persist_scene_objects(namespace, scene):
86+
query = {"namespace": namespace, "sceneId": scene}
87+
result = get_arenaobjects_collection().delete_many(query)
9988
return result
10089

10190

102-
def _urlopen(url, token, method, verify):
103-
if not token:
104-
print("Error: mqtt_token for persist not available")
105-
return None
106-
headers = {"Cookie": f"mqtt_token={token}"}
107-
cookies = {"mqtt_token": token}
108-
try:
109-
if method == "GET":
110-
response = requests.get(url, headers=headers, cookies=cookies, verify=verify, timeout=PERSIST_TIMEOUT)
111-
elif method == "DELETE":
112-
response = requests.delete(url, headers=headers, cookies=cookies, verify=verify, timeout=PERSIST_TIMEOUT)
113-
return response.text
114-
except (requests.exceptions.ConnectionError, HTTPError) as err:
115-
print(f"{err}: {url}")
116-
except ValueError as err:
117-
print(f"{response.text} {err}: {url}")
118-
return None
91+
def delete_persist_namespace_objects(namespace):
92+
query = {"namespace": namespace}
93+
result = get_arenaobjects_collection().delete_many(query)
94+
return result

users/views.py

Lines changed: 17 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@
5454
generate_arena_token,
5555
)
5656
from .persistence import (
57-
delete_scene_objects,
57+
delete_persist_namespace_objects,
58+
delete_persist_scene_objects,
5859
read_persist_ns_all,
5960
read_persist_scene_objects,
6061
read_persist_scenes_all,
@@ -273,17 +274,12 @@ def scene_perm_detail(request, pk):
273274
messages.success(request, f"Updated scene permissions: {pk}")
274275
return redirect("users:user_profile")
275276
elif "delete" in request.POST:
276-
token = generate_arena_token(
277-
user=request.user,
278-
username=request.user.username,
279-
ids={"userclient": f"{request.user.username}-objects-delete"},
280-
version=version,
281-
)
282277
# delete account scene data
283278
scene.delete()
284279
messages.success(request, f"Removed scene permissions: {pk}")
285280
# delete persist scene data
286-
if delete_scene_objects(token, pk):
281+
namespace, sceneId = pk.split("/")
282+
if delete_persist_scene_objects(namespace, sceneId):
287283
messages.success(request, f"Removed scene persisted objects: {pk}")
288284
else:
289285
messages.error(request, f"Unable to delete {pk} objects from persistence database.")
@@ -767,38 +763,24 @@ def user_profile(request):
767763
# account delete request
768764
confirm_text = f'delete {request.user.username} account and scenes'
769765
if confirm_text in request.POST:
770-
token = generate_arena_token(
771-
user=request.user,
772-
username=request.user.username,
773-
ids={"userclient": f"{request.user.username}-objects-delete"},
774-
version=version,
775-
)
776766
# delete devices permissions
777767
u_devices = Device.objects.filter(name__startswith=f"{request.user.username}/")
778-
for device in u_devices:
779-
# delete account device data
780-
device.delete()
781-
messages.success(request, f"Removed device permissions: {device.name}")
782-
# delete scenes permissions/objects
768+
del_count, _ = u_devices.delete()
769+
if del_count > 0:
770+
messages.success(request, f"Removed {del_count} device permissions.")
771+
# delete scenes permissions
783772
u_scenes = Scene.objects.filter(name__startswith=f"{request.user.username}/")
784-
for scene in u_scenes:
785-
# delete account scene data
786-
scene.delete()
787-
messages.success(request, f"Removed scene permissions: {scene.name}")
788-
# delete persist scene data
789-
namespace, sceneId = scene.name.split("/")
790-
if len(read_persist_scene_objects(namespace, sceneId)) > 0:
791-
if not delete_scene_objects(token, scene.name):
792-
messages.error(request, f"Unable to delete {scene.name} objects from persistence database.")
793-
return redirect("users:user_profile")
794-
else:
795-
messages.success(request, f"Removed scene persistence objects: {scene.name}")
773+
del_count, _ = u_scenes.delete()
774+
if del_count > 0:
775+
messages.success(request, f"Removed {del_count} scene permissions.")
776+
# delete persist objects for this namespace
777+
if delete_persist_namespace_objects(request.user.username):
778+
messages.success(request, f"Removed namespace persistence objects: {request.user.username}")
796779
# delete namespaces permissions
797780
u_namespaces = Namespace.objects.filter(name=request.user.username)
798-
for namespace in u_namespaces:
799-
# delete account namespace data
800-
namespace.delete()
801-
messages.success(request, f"Removed namespace permissions: {namespace.name}")
781+
del_count, _ = u_namespaces.delete()
782+
if del_count > 0:
783+
messages.success(request, f"Removed {del_count} namespace permissions.")
802784
# delete filestore files/account
803785
if get_filestore_health():
804786
if not delete_filestore_user(request.user):

0 commit comments

Comments
 (0)