Merge branch 'RED-6876' into 'master'

RED-6876: Fixed not correct initialized index

Closes RED-6876

See merge request redactmanager/search-service!2
This commit is contained in:
Dominique Eifländer 2023-06-14 11:00:20 +02:00
commit ee698a9647
4 changed files with 23 additions and 65 deletions

View File

@ -12,7 +12,7 @@
<artifactId>search-service-image-v1</artifactId> <artifactId>search-service-image-v1</artifactId>
<groupId>com.iqser.red.service</groupId> <groupId>com.iqser.red.service</groupId>
<version>1.0-SNAPSHOT</version> <version>2.0-SNAPSHOT</version>
<packaging>pom</packaging> <packaging>pom</packaging>

View File

@ -1,20 +0,0 @@
package com.iqser.red.service.search.v1.server.model;
import com.iqser.red.service.persistence.service.v1.api.shared.model.multitenancy.SearchConnection;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@Builder
@AllArgsConstructor
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class Connection {
@EqualsAndHashCode.Include
private String hosts;
private SearchConnection searchConnection;
}

View File

@ -1,7 +1,6 @@
package com.iqser.red.service.search.v1.server.service.elasticsearch; package com.iqser.red.service.search.v1.server.service.elasticsearch;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@ -12,7 +11,6 @@ import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import com.google.common.cache.RemovalListener; import com.google.common.cache.RemovalListener;
import com.iqser.red.service.search.v1.server.client.TenantsClient; import com.iqser.red.service.search.v1.server.client.TenantsClient;
import com.iqser.red.service.search.v1.server.model.Connection;
import com.iqser.red.service.search.v1.server.multitenancy.EncryptionDecryptionService; import com.iqser.red.service.search.v1.server.multitenancy.EncryptionDecryptionService;
import com.iqser.red.service.search.v1.server.multitenancy.TenantContext; import com.iqser.red.service.search.v1.server.multitenancy.TenantContext;
@ -37,37 +35,29 @@ public class EsClientCache {
@Value("${multitenancy.client-cache.expireAfterAccess:10}") @Value("${multitenancy.client-cache.expireAfterAccess:10}")
private Integer expireAfterAccess; private Integer expireAfterAccess;
private LoadingCache<String, Connection> connections; private LoadingCache<String, EsClient> clients;
private LoadingCache<Connection, EsClient> clients;
@PostConstruct @PostConstruct
protected void createCache() { protected void createCache() {
connections = CacheBuilder.newBuilder().maximumSize(maximumSize).expireAfterAccess(expireAfterAccess, TimeUnit.MINUTES).build(new CacheLoader<>() {
public Connection load(String tenantId) {
var tenant = tenantsClient.getTenant(tenantId);
var hostsAsString = tenant.getSearchConnection().getHosts().stream().collect(Collectors.joining());
return Connection.builder().hosts(hostsAsString).searchConnection(tenant.getSearchConnection()).build();
}
});
clients = CacheBuilder.newBuilder() clients = CacheBuilder.newBuilder()
.maximumSize(maximumSize) .maximumSize(maximumSize)
.expireAfterAccess(expireAfterAccess, TimeUnit.MINUTES) .expireAfterAccess(expireAfterAccess, TimeUnit.MINUTES)
.removalListener((RemovalListener<Connection, EsClient>) removal -> { .removalListener((RemovalListener<String, EsClient>) removal -> {
removal.getValue().shutdown(); removal.getValue().shutdown();
log.info("Closed elasticsearch client for tenant {}", removal.getKey().getHosts()); log.info("Closed elasticsearch client for tenant {}", removal.getKey());
}) })
.build(new CacheLoader<>() { .build(new CacheLoader<>() {
public EsClient load(Connection key) { public EsClient load(String tenantId) {
if (key.getSearchConnection().getPassword() != null) { var tenant = tenantsClient.getTenant(tenantId);
key.getSearchConnection().setPassword(encryptionDecryptionService.decrypt(key.getSearchConnection().getPassword()));
if (tenant.getSearchConnection().getPassword() != null) {
tenant.getSearchConnection().setPassword(encryptionDecryptionService.decrypt(tenant.getSearchConnection().getPassword()));
} }
var client = new EsClient(key.getSearchConnection()); var client = new EsClient(tenant.getSearchConnection());
log.info("Initialized elasticsearch client for tenant {}", key); log.info("Initialized elasticsearch client for tenant {}", tenantId);
indexCreatorService.createIndex(client); indexCreatorService.createIndex(client);
return client; return client;
} }
@ -78,8 +68,7 @@ public class EsClientCache {
@SneakyThrows @SneakyThrows
public EsClient getClient() { public EsClient getClient() {
var connection = connections.get(TenantContext.getTenantId()); return clients.get(TenantContext.getTenantId());
return clients.get(connection);
} }
} }

View File

@ -1,7 +1,6 @@
package com.iqser.red.service.search.v1.server.service.opensearch; package com.iqser.red.service.search.v1.server.service.opensearch;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@ -12,7 +11,6 @@ import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import com.google.common.cache.RemovalListener; import com.google.common.cache.RemovalListener;
import com.iqser.red.service.search.v1.server.client.TenantsClient; import com.iqser.red.service.search.v1.server.client.TenantsClient;
import com.iqser.red.service.search.v1.server.model.Connection;
import com.iqser.red.service.search.v1.server.multitenancy.EncryptionDecryptionService; import com.iqser.red.service.search.v1.server.multitenancy.EncryptionDecryptionService;
import com.iqser.red.service.search.v1.server.multitenancy.TenantContext; import com.iqser.red.service.search.v1.server.multitenancy.TenantContext;
@ -37,37 +35,29 @@ public class OpensearchClientCache {
@Value("${multitenancy.client-cache.expireAfterAccess:10}") @Value("${multitenancy.client-cache.expireAfterAccess:10}")
private Integer expireAfterAccess; private Integer expireAfterAccess;
private LoadingCache<String, Connection> connections; private LoadingCache<String, OpensearchClient> clients;
private LoadingCache<Connection, OpensearchClient> clients;
@PostConstruct @PostConstruct
protected void createCache() { protected void createCache() {
connections = CacheBuilder.newBuilder().maximumSize(maximumSize).expireAfterAccess(expireAfterAccess, TimeUnit.MINUTES).build(new CacheLoader<>() {
public Connection load(String tenantId) {
var tenant = tenantsClient.getTenant(tenantId);
var hostsAsString = tenant.getSearchConnection().getHosts().stream().collect(Collectors.joining());
return Connection.builder().hosts(hostsAsString).searchConnection(tenant.getSearchConnection()).build();
}
});
clients = CacheBuilder.newBuilder() clients = CacheBuilder.newBuilder()
.maximumSize(maximumSize) .maximumSize(maximumSize)
.expireAfterAccess(expireAfterAccess, TimeUnit.MINUTES) .expireAfterAccess(expireAfterAccess, TimeUnit.MINUTES)
.removalListener((RemovalListener<Connection, OpensearchClient>) removal -> { .removalListener((RemovalListener<String, OpensearchClient>) removal -> {
removal.getValue().shutdown(); removal.getValue().shutdown();
log.info("Closed opensearch client for tenant {}", removal.getKey().getHosts()); log.info("Closed elasticsearch client for tenant {}", removal.getKey());
}) })
.build(new CacheLoader<>() { .build(new CacheLoader<>() {
public OpensearchClient load(Connection key) { public OpensearchClient load(String tenantId) {
if (key.getSearchConnection().getPassword() != null) { var tenant = tenantsClient.getTenant(tenantId);
key.getSearchConnection().setPassword(encryptionDecryptionService.decrypt(key.getSearchConnection().getPassword()));
if (tenant.getSearchConnection().getPassword() != null) {
tenant.getSearchConnection().setPassword(encryptionDecryptionService.decrypt(tenant.getSearchConnection().getPassword()));
} }
var client = new OpensearchClient(key.getSearchConnection()); var client = new OpensearchClient(tenant.getSearchConnection());
log.info("Initialized opensearch client for tenant {}", key); log.info("Initialized elasticsearch client for tenant {}", tenantId);
indexCreatorService.createIndex(client); indexCreatorService.createIndex(client);
return client; return client;
} }
@ -78,8 +68,7 @@ public class OpensearchClientCache {
@SneakyThrows @SneakyThrows
public OpensearchClient getClient() { public OpensearchClient getClient() {
var connection = connections.get(TenantContext.getTenantId()); return clients.get(TenantContext.getTenantId());
return clients.get(connection);
} }
} }