From 31b8695420ecf11848aa1672990b9e1bd770c7a6 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Sat, 14 Mar 2026 16:37:06 +0100 Subject: [PATCH] Skip user upsert when nothing changed to avoid row accumulation ReplacingMergeTree only deduplicates during background merges, so every login was inserting a new row even when all fields were identical. Now compares the existing record and skips the write if nothing changed. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../server/app/storage/ClickHouseUserRepository.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/ClickHouseUserRepository.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/ClickHouseUserRepository.java index 459b0a07..b5090a1e 100644 --- a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/ClickHouseUserRepository.java +++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/storage/ClickHouseUserRepository.java @@ -47,11 +47,16 @@ public class ClickHouseUserRepository implements UserRepository { @Override public void upsert(UserInfo user) { - // Preserve created_at from existing record on re-login. - // ReplacingMergeTree deduplicates by ORDER BY (user_id), keeping the row - // with the highest updated_at. Optional existing = findById(user.userId()); if (existing.isPresent()) { + UserInfo ex = existing.get(); + // Skip write if nothing changed — avoids accumulating un-merged rows + if (ex.provider().equals(user.provider()) + && ex.email().equals(user.email()) + && ex.displayName().equals(user.displayName()) + && ex.roles().equals(user.roles())) { + return; + } jdbc.update( "INSERT INTO users (user_id, provider, email, display_name, roles, created_at, updated_at) " + "SELECT user_id, ?, ?, ?, ?, created_at, now64(3, 'UTC') "