Skip to content

Commit ee901fc

Browse files
committed
refac
1 parent 7ffcd39 commit ee901fc

2 files changed

Lines changed: 58 additions & 49 deletions

File tree

backend/open_webui/socket/utils.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,22 @@ def items(self):
8282
return [(k, json.loads(v)) for k, v in self.redis.hgetall(self.name).items()]
8383

8484
def set(self, mapping: dict):
85-
pipe = self.redis.pipeline()
86-
87-
pipe.delete(self.name)
88-
if mapping:
89-
pipe.hset(self.name, mapping={k: json.dumps(v) for k, v in mapping.items()})
85+
if not mapping:
86+
self.redis.delete(self.name)
87+
return
9088

91-
pipe.execute()
89+
# Fetch existing keys before writing so we know which ones to remove.
90+
# HKEYS is cheap — it transfers only short key strings, not large JSON values.
91+
existing_keys = set(self.redis.hkeys(self.name))
92+
new_keys = set(mapping.keys())
93+
keys_to_remove = existing_keys - new_keys
94+
95+
# HSET first (add/update all new values), then HDEL (remove stale keys).
96+
# We never DELETE the whole hash — this eliminates the race window
97+
# where concurrent readers would see an empty models dict.
98+
self.redis.hset(self.name, mapping={k: json.dumps(v) for k, v in mapping.items()})
99+
if keys_to_remove:
100+
self.redis.hdel(self.name, *keys_to_remove)
92101

93102
def get(self, key, default=None):
94103
try:

src/lib/components/layout/Sidebar/UserMenu.svelte

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -237,49 +237,49 @@
237237

238238
{#if role === 'admin'}
239239
<a
240-
href="/playground"
241-
draggable="false"
242-
class="flex rounded-xl py-1.5 px-3 w-full hover:bg-gray-50 dark:hover:bg-gray-800 transition cursor-pointer select-none"
243-
on:click={async (e) => {
244-
if (e.metaKey || e.ctrlKey || e.shiftKey || e.button === 1) {
245-
return;
246-
}
247-
e.preventDefault();
248-
show = false;
249-
goto('/playground');
250-
if ($mobile) {
251-
await tick();
252-
showSidebar.set(false);
253-
}
254-
}}
255-
>
256-
<div class=" self-center mr-3">
257-
<Code className="size-5" strokeWidth="1.5" />
258-
</div>
259-
<div class=" self-center truncate">{$i18n.t('Playground')}</div>
260-
</a>
261-
<a
262-
href="/admin"
263-
draggable="false"
264-
class="flex rounded-xl py-1.5 px-3 w-full hover:bg-gray-50 dark:hover:bg-gray-800 transition cursor-pointer select-none"
265-
on:click={async (e) => {
266-
if (e.metaKey || e.ctrlKey || e.shiftKey || e.button === 1) {
267-
return;
268-
}
269-
e.preventDefault();
270-
show = false;
271-
goto('/admin');
272-
if ($mobile) {
273-
await tick();
274-
showSidebar.set(false);
275-
}
276-
}}
277-
>
278-
<div class=" self-center mr-3">
279-
<UserGroup className="w-5 h-5" strokeWidth="1.5" />
280-
</div>
281-
<div class=" self-center truncate">{$i18n.t('Admin Panel')}</div>
282-
</a>
240+
href="/playground"
241+
draggable="false"
242+
class="flex rounded-xl py-1.5 px-3 w-full hover:bg-gray-50 dark:hover:bg-gray-800 transition cursor-pointer select-none"
243+
on:click={async (e) => {
244+
if (e.metaKey || e.ctrlKey || e.shiftKey || e.button === 1) {
245+
return;
246+
}
247+
e.preventDefault();
248+
show = false;
249+
goto('/playground');
250+
if ($mobile) {
251+
await tick();
252+
showSidebar.set(false);
253+
}
254+
}}
255+
>
256+
<div class=" self-center mr-3">
257+
<Code className="size-5" strokeWidth="1.5" />
258+
</div>
259+
<div class=" self-center truncate">{$i18n.t('Playground')}</div>
260+
</a>
261+
<a
262+
href="/admin"
263+
draggable="false"
264+
class="flex rounded-xl py-1.5 px-3 w-full hover:bg-gray-50 dark:hover:bg-gray-800 transition cursor-pointer select-none"
265+
on:click={async (e) => {
266+
if (e.metaKey || e.ctrlKey || e.shiftKey || e.button === 1) {
267+
return;
268+
}
269+
e.preventDefault();
270+
show = false;
271+
goto('/admin');
272+
if ($mobile) {
273+
await tick();
274+
showSidebar.set(false);
275+
}
276+
}}
277+
>
278+
<div class=" self-center mr-3">
279+
<UserGroup className="w-5 h-5" strokeWidth="1.5" />
280+
</div>
281+
<div class=" self-center truncate">{$i18n.t('Admin Panel')}</div>
282+
</a>
283283
{/if}
284284

285285
{#if help}

0 commit comments

Comments
 (0)