Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ public long saveIfVersion(
String userId, String sessionId, String key, State value, long expectedVersion) {
if (expectedVersion == UNVERSIONED) {
save(userId, sessionId, key, value);
return getVersioned(userId, sessionId, key, State.class).version();
return readVersionOnly(userId, sessionId, key);
}
String slotId = slotId(userId, sessionId);
validateSlotId(slotId);
Expand Down Expand Up @@ -276,6 +276,26 @@ public long saveIfVersion(
}
}

private long readVersionOnly(String userId, String sessionId, String key) {
String slotId = slotId(userId, sessionId);
validateSlotId(slotId);
validateStateKey(key);

BoundSql boundSql = dialect.sessionStateSelectVersioned(slotId, key, SINGLE_STATE_INDEX);
try (Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(boundSql.sql())) {
bindParams(stmt, boundSql.params());
try (ResultSet rs = stmt.executeQuery()) {
if (!rs.next()) {
return 0L;
}
return rs.getLong("version");
}
} catch (Exception e) {
throw new RuntimeException("Failed to read version for state: " + key, e);
}
}

@Override
public <T extends State> Optional<T> get(
String userId, String sessionId, String key, Class<T> type) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -425,7 +425,7 @@ public long saveIfVersion(
String userId, String sessionId, String key, State value, long expectedVersion) {
if (expectedVersion == UNVERSIONED) {
save(userId, sessionId, key, value);
return getVersioned(userId, sessionId, key, State.class).version();
return readVersionOnly(userId, sessionId, key);
}

String slotId = slotId(userId, sessionId);
Expand All @@ -449,6 +449,29 @@ public long saveIfVersion(
}
}

private long readVersionOnly(String userId, String sessionId, String key) {
String slotId = slotId(userId, sessionId);
validateSessionId(slotId);
validateStateKey(key);

String sql = "SELECT version FROM " + getFullTableName()
+ " WHERE session_id = ? AND state_key = ? AND item_index = 0";

try (Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, slotId);
stmt.setString(2, key);
try (ResultSet rs = stmt.executeQuery()) {
if (!rs.next()) {
return 0L;
}
return rs.getLong("version");
}
} catch (Exception e) {
throw new RuntimeException("Failed to read version for state: " + key, e);
}
}

private long insertIfAbsent(Connection conn, String slotId, String key, State value)
throws Exception {
String insertSql =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ public long saveIfVersion(
String userId, String sessionId, String key, State value, long expectedVersion) {
if (expectedVersion == UNVERSIONED) {
save(userId, sessionId, key, value);
return getVersioned(userId, sessionId, key, State.class).version();
return readVersionOnly(userId, sessionId, key);
}

String slotId = slotId(userId, sessionId);
Expand All @@ -354,6 +354,29 @@ public long saveIfVersion(
}
}

private long readVersionOnly(String userId, String sessionId, String key) {
String slotId = slotId(userId, sessionId);
validateSessionId(slotId);
validateStateKey(key);

String sql = "SELECT version FROM " + getFullTableName()
+ " WHERE session_id = ? AND state_key = ? AND item_index = 0";

try (Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, slotId);
stmt.setString(2, key);
try (ResultSet rs = stmt.executeQuery()) {
if (!rs.next()) {
return 0L;
}
return rs.getLong("version");
}
} catch (Exception e) {
throw new RuntimeException("Failed to read version for state: " + key, e);
}
}

private long insertIfAbsent(Connection conn, String slotId, String key, State value)
throws Exception {
String insertSql =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,8 +270,7 @@ public long saveIfVersion(
String userId, String sessionId, String key, State value, long expectedVersion) {
if (expectedVersion == UNVERSIONED) {
save(userId, sessionId, key, value);
VersionedState<State> after = getVersioned(userId, sessionId, key, State.class);
return after.version();
return readVersionOnly(userId, sessionId, key);
}
String slotId = slotId(userId, sessionId);
String redisKey = getStateKey(slotId, key);
Expand All @@ -290,6 +289,25 @@ public long saveIfVersion(
}
}

/**
* Read only the version number without deserializing the payload.
* This avoids Jackson's inability to deserialize the State marker interface.
*/
private long readVersionOnly(String userId, String sessionId, String key) {
String slotId = slotId(userId, sessionId);
String redisKey = getStateKey(slotId, key);
String versionKey = RedisStateVersionSupport.versionKey(redisKey);
try {
String json = client.get(redisKey);
if (json == null) {
return 0L;
}
return RedisStateVersionSupport.parseVersion(json, client.get(versionKey));
} catch (Exception e) {
throw new RuntimeException("Failed to read version for state: " + key, e);
}
}

@Override
public void save(String userId, String sessionId, String key, List<? extends State> values) {
String slotId = slotId(userId, sessionId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,11 +119,26 @@ public long saveIfVersion(
String userId, String sessionId, String key, State value, long expectedVersion) {
if (expectedVersion == UNVERSIONED) {
save(userId, sessionId, key, value);
return getVersioned(userId, sessionId, key, State.class).version();
return readVersionOnly(userId, sessionId, key);
}
return evalSave(userId, sessionId, key, value, Long.toString(expectedVersion));
}

private long readVersionOnly(String userId, String sessionId, String key) {
String slotId = slotId(userId, sessionId);
String redisKey = getStateKey(slotId, key);
String versionKey = RedisStateVersionSupport.versionKey(redisKey);
try (Jedis jedis = jedisPool.getResource()) {
String json = jedis.get(redisKey);
if (json == null) {
return 0L;
}
return RedisStateVersionSupport.parseVersion(json, jedis.get(versionKey));
} catch (Exception e) {
throw new RuntimeException("Failed to read version for state: " + key, e);
}
}

private long evalSave(
String userId, String sessionId, String key, State value, String expectedVersionArg) {
String slotId = slotId(userId, sessionId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,11 +125,28 @@ public long saveIfVersion(
String userId, String sessionId, String key, State value, long expectedVersion) {
if (expectedVersion == UNVERSIONED) {
save(userId, sessionId, key, value);
return getVersioned(userId, sessionId, key, State.class).version();
return readVersionOnly(userId, sessionId, key);
}
return evalSave(userId, sessionId, key, value, Long.toString(expectedVersion));
}

private long readVersionOnly(String userId, String sessionId, String key) {
String slotId = slotId(userId, sessionId);
String redisKey = getStateKey(slotId, key);
String versionKey = RedisStateVersionSupport.versionKey(redisKey);
try {
RBucket<String> bucket = redissonClient.getBucket(redisKey, StringCodec.INSTANCE);
String json = bucket.get();
if (json == null) {
return 0L;
}
RBucket<String> versionBucket = redissonClient.getBucket(versionKey, StringCodec.INSTANCE);
return RedisStateVersionSupport.parseVersion(json, versionBucket.get());
} catch (Exception e) {
throw new RuntimeException("Failed to read version for state: " + key, e);
}
}

private long evalSave(
String userId, String sessionId, String key, State value, String expectedVersionArg) {
String slotId = slotId(userId, sessionId);
Expand Down
Loading