Browse Source

AI rule node: improve cache eviction

pull/13371/head
Dmytro Skarzhynets 1 year ago
parent
commit
36e16bb877
No known key found for this signature in database GPG Key ID: 2B51652F224037DF
  1. 28
      dao/src/main/java/org/thingsboard/server/dao/ai/AiModelSettingsCacheEvictEvent.java
  2. 21
      dao/src/main/java/org/thingsboard/server/dao/ai/AiModelSettingsServiceImpl.java

28
dao/src/main/java/org/thingsboard/server/dao/ai/AiModelSettingsCacheEvictEvent.java

@ -15,15 +15,31 @@
*/ */
package org.thingsboard.server.dao.ai; package org.thingsboard.server.dao.ai;
import org.thingsboard.server.common.data.id.AiModelSettingsId; import org.thingsboard.server.common.data.ai.AiModelSettings;
import org.thingsboard.server.common.data.id.TenantId;
import java.util.Set; import static java.util.Objects.requireNonNull;
import static org.thingsboard.server.dao.ai.AiModelSettingsCacheEvictEvent.Deleted;
import static org.thingsboard.server.dao.ai.AiModelSettingsCacheEvictEvent.Saved;
record AiModelSettingsCacheEvictEvent(Set<AiModelSettingsCacheKey> keys) { sealed interface AiModelSettingsCacheEvictEvent permits Saved, Deleted {
AiModelSettingsCacheKey cacheKey();
record Saved(AiModelSettingsCacheKey cacheKey, AiModelSettings savedSettings) implements AiModelSettingsCacheEvictEvent {
public Saved {
requireNonNull(cacheKey);
requireNonNull(savedSettings);
}
}
record Deleted(AiModelSettingsCacheKey cacheKey) implements AiModelSettingsCacheEvictEvent {
public Deleted {
requireNonNull(cacheKey);
}
static AiModelSettingsCacheEvictEvent of(TenantId tenantId, AiModelSettingsId settingsId) {
return new AiModelSettingsCacheEvictEvent(Set.of(AiModelSettingsCacheKey.of(tenantId, settingsId)));
} }
} }

21
dao/src/main/java/org/thingsboard/server/dao/ai/AiModelSettingsServiceImpl.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.dao.ai; package org.thingsboard.server.dao.ai;
import com.google.common.collect.Sets;
import com.google.common.util.concurrent.FluentFuture; import com.google.common.util.concurrent.FluentFuture;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -38,7 +37,6 @@ import org.thingsboard.server.dao.sql.JpaExecutorService;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
import static org.thingsboard.server.dao.service.Validator.validatePageLink; import static org.thingsboard.server.dao.service.Validator.validatePageLink;
@ -54,7 +52,14 @@ class AiModelSettingsServiceImpl extends CachedVersionedEntityService<AiModelSet
@Override @Override
@TransactionalEventListener @TransactionalEventListener
public void handleEvictEvent(AiModelSettingsCacheEvictEvent event) { public void handleEvictEvent(AiModelSettingsCacheEvictEvent event) {
cache.evict(event.keys()); var cacheKey = event.cacheKey();
if (event instanceof AiModelSettingsCacheEvictEvent.Saved savedEvent) {
cache.put(cacheKey, savedEvent.savedSettings());
} else if (event instanceof AiModelSettingsCacheEvictEvent.Deleted) {
cache.evict(cacheKey);
} else {
throw new UnsupportedOperationException("Unsupported event type: " + event.getClass().getSimpleName());
}
} }
@Override @Override
@ -81,7 +86,8 @@ class AiModelSettingsServiceImpl extends CachedVersionedEntityService<AiModelSet
.broadcastEvent(true) .broadcastEvent(true)
.build()); .build());
publishEvictEvent(AiModelSettingsCacheEvictEvent.of(savedSettings.getTenantId(), savedSettings.getId())); var cacheKey = AiModelSettingsCacheKey.of(savedSettings.getTenantId(), savedSettings.getId());
publishEvictEvent(new AiModelSettingsCacheEvictEvent.Saved(cacheKey, savedSettings));
return savedSettings; return savedSettings;
} }
@ -139,7 +145,7 @@ class AiModelSettingsServiceImpl extends CachedVersionedEntityService<AiModelSet
boolean deleted = aiModelSettingsDao.deleteByTenantIdAndId(tenantId, settingsId); boolean deleted = aiModelSettingsDao.deleteByTenantIdAndId(tenantId, settingsId);
if (deleted) { if (deleted) {
publishDeleteEvent(toDeleteOpt.get()); publishDeleteEvent(toDeleteOpt.get());
publishEvictEvent(AiModelSettingsCacheEvictEvent.of(tenantId, settingsId)); publishEvictEvent(new AiModelSettingsCacheEvictEvent.Deleted(AiModelSettingsCacheKey.of(tenantId, settingsId)));
} }
return deleted; return deleted;
} }
@ -154,13 +160,10 @@ class AiModelSettingsServiceImpl extends CachedVersionedEntityService<AiModelSet
aiModelSettingsDao.deleteByTenantId(tenantId); aiModelSettingsDao.deleteByTenantId(tenantId);
Set<AiModelSettingsCacheKey> cacheKeys = Sets.newHashSetWithExpectedSize(toDelete.size());
toDelete.forEach(settings -> { toDelete.forEach(settings -> {
publishDeleteEvent(settings); publishDeleteEvent(settings);
cacheKeys.add(AiModelSettingsCacheKey.of(settings.getTenantId(), settings.getId())); publishEvictEvent(new AiModelSettingsCacheEvictEvent.Deleted(AiModelSettingsCacheKey.of(settings.getTenantId(), settings.getId())));
}); });
publishEvictEvent(new AiModelSettingsCacheEvictEvent(cacheKeys));
} }
private void publishDeleteEvent(AiModelSettings settings) { private void publishDeleteEvent(AiModelSettings settings) {

Loading…
Cancel
Save