From a5fa48fd0c696e30fbeecdb9575ce11160d84803 Mon Sep 17 00:00:00 2001 From: Kunal Patel Date: Thu, 22 Oct 2026 17:22:00 -0400 Subject: [PATCH] fix(room): evict Redis room projections on session end On logout or session timeout, drop the Redis room projections for every room the session (and its agent user) loaded. They reload from the database on next open. --- src/prerna/web/conf/UserSessionLoader.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/prerna/web/conf/UserSessionLoader.java b/src/prerna/web/conf/UserSessionLoader.java index cf08fd53..706fb0cb 100644 --- a/src/prerna/web/conf/UserSessionLoader.java +++ b/src/prerna/web/conf/UserSessionLoader.java @@ -47,6 +47,7 @@ import prerna.auth.User; import prerna.cluster.util.ClusterUtil; import prerna.engine.impl.model.Room; +import prerna.engine.impl.model.RoomMessageStore; import prerna.engine.impl.model.RoomUtils; import prerna.engine.impl.r.IRUserConnection; import prerna.om.ClientProcessWrapper; @@ -212,6 +213,12 @@ public Void call() throws Exception { cleanupUserRooms(subAgent, "agent user"); } + // drop cached room projections from Redis; they reload from the DB on next open + evictRedisRooms(thisUser); + if (subAgent != thisUser) { + evictRedisRooms(subAgent); + } + cleanupPlaywrightSessions(thisUser); // register the successful logout @@ -277,6 +284,17 @@ private void cleanupUserProcessAndChroot(User user, String userType) { * @param user the user whose room map should be processed * @param userType descriptive label used in logs (for example, session user) */ + private void evictRedisRooms(User user) { + if (user == null || user.getRoomHash() == null) { + return; + } + try { + RoomMessageStore.evictRedisProjections(user.getRoomHash().keySet()); + } catch (Exception e) { + classLogger.warn("Failed to evict Redis room projections during session cleanup", e); + } + } + private void cleanupUserRooms(User user, String userType) { if (!ClusterUtil.IS_CLUSTER || user == null || user.getRoomHash() == null) { return;