Fix NONE partitioning strategy
This commit is contained in:
		
							parent
							
								
									0a14ce3f12
								
							
						
					
					
						commit
						b7604a8d0a
					
				@ -76,8 +76,9 @@ public class DefaultEdqsApiService implements EdqsApiService {
 | 
			
		||||
            requestMsg.setCustomerIdLSB(customerId.getId().getLeastSignificantBits());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Integer partition = edqsPartitionService.resolvePartition(tenantId);
 | 
			
		||||
        ListenableFuture<TbProtoQueueMsg<FromEdqsMsg>> resultFuture = requestTemplate.send(new TbProtoQueueMsg<>(UUID.randomUUID(), requestMsg.build()), partition);
 | 
			
		||||
        UUID key = UUID.randomUUID();
 | 
			
		||||
        Integer partition = edqsPartitionService.resolvePartition(tenantId, key);
 | 
			
		||||
        ListenableFuture<TbProtoQueueMsg<FromEdqsMsg>> resultFuture = requestTemplate.send(new TbProtoQueueMsg<>(key, requestMsg.build()), partition);
 | 
			
		||||
        return Futures.transform(resultFuture, msg -> {
 | 
			
		||||
            TransportProtos.EdqsResponseMsg responseMsg = msg.getValue().getResponseMsg();
 | 
			
		||||
            return JacksonUtil.fromString(responseMsg.getValue(), EdqsResponse.class);
 | 
			
		||||
 | 
			
		||||
@ -173,13 +173,18 @@ public class EdqsProcessor implements TbQueueHandler<TbProtoQueueMsg<ToEdqsMsg>,
 | 
			
		||||
            if (CollectionsUtil.isNotEmpty(oldPartitions)) {
 | 
			
		||||
                Set<Integer> removedPartitions = Sets.difference(oldPartitions, newPartitions).stream()
 | 
			
		||||
                        .map(tpi -> tpi.getPartition().orElse(-1)).collect(Collectors.toSet());
 | 
			
		||||
                if (config.getPartitioningStrategy() != EdqsPartitioningStrategy.TENANT && !removedPartitions.isEmpty()) {
 | 
			
		||||
                if (removedPartitions.isEmpty()) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (config.getPartitioningStrategy() == EdqsPartitioningStrategy.TENANT) {
 | 
			
		||||
                    repository.clearIf(tenantId -> {
 | 
			
		||||
                        Integer partition = partitionService.resolvePartition(tenantId, null);
 | 
			
		||||
                        return removedPartitions.contains(partition);
 | 
			
		||||
                    });
 | 
			
		||||
                } else {
 | 
			
		||||
                    log.warn("Partitions {} were removed but shouldn't be (due to NONE partitioning strategy)", removedPartitions);
 | 
			
		||||
                }
 | 
			
		||||
                repository.clearIf(tenantId -> {
 | 
			
		||||
                    Integer partition = partitionService.resolvePartition(tenantId);
 | 
			
		||||
                    return partition != null && removedPartitions.contains(partition);
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        } catch (Throwable t) {
 | 
			
		||||
            log.error("Failed to handle partition change event {}", event, t);
 | 
			
		||||
 | 
			
		||||
@ -72,7 +72,7 @@ public class EdqsProducer {
 | 
			
		||||
        };
 | 
			
		||||
        TopicPartitionInfo tpi = TopicPartitionInfo.builder()
 | 
			
		||||
                .topic(topic)
 | 
			
		||||
                .partition(partitionService.resolvePartition(tenantId))
 | 
			
		||||
                .partition(partitionService.resolvePartition(tenantId, key))
 | 
			
		||||
                .build();
 | 
			
		||||
        if (producer instanceof TbKafkaProducerTemplate<TbProtoQueueMsg<ToEdqsMsg>> kafkaProducer) {
 | 
			
		||||
            kafkaProducer.send(tpi, key, new TbProtoQueueMsg<>(null, msg), callback); // specifying custom key for compaction
 | 
			
		||||
 | 
			
		||||
@ -29,11 +29,14 @@ public class EdqsPartitionService {
 | 
			
		||||
    private final HashPartitionService hashPartitionService;
 | 
			
		||||
    private final EdqsConfig edqsConfig;
 | 
			
		||||
 | 
			
		||||
    public Integer resolvePartition(TenantId tenantId) {
 | 
			
		||||
    public Integer resolvePartition(TenantId tenantId, Object key) {
 | 
			
		||||
        if (edqsConfig.getPartitioningStrategy() == EdqsPartitioningStrategy.TENANT) {
 | 
			
		||||
            return hashPartitionService.resolvePartitionIndex(tenantId.getId(), edqsConfig.getPartitions());
 | 
			
		||||
        } else {
 | 
			
		||||
            return null;
 | 
			
		||||
            if (key == null) {
 | 
			
		||||
                throw new IllegalArgumentException("Partitioning key is missing but partitioning strategy is not TENANT");
 | 
			
		||||
            }
 | 
			
		||||
            return hashPartitionService.resolvePartitionIndex(key.toString(), edqsConfig.getPartitions());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -39,6 +39,7 @@ import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent;
 | 
			
		||||
import org.thingsboard.server.queue.discovery.event.ServiceListChangedEvent;
 | 
			
		||||
import org.thingsboard.server.queue.util.AfterStartUp;
 | 
			
		||||
 | 
			
		||||
import java.nio.charset.StandardCharsets;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
@ -559,7 +560,15 @@ public class HashPartitionService implements PartitionService {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int resolvePartitionIndex(UUID entityId, int partitions) {
 | 
			
		||||
        int hash = hash(entityId);
 | 
			
		||||
        return resolvePartitionIndex(hash(entityId), partitions);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int resolvePartitionIndex(String key, int partitions) {
 | 
			
		||||
        return resolvePartitionIndex(hash(key), partitions);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private int resolvePartitionIndex(int hash, int partitions) {
 | 
			
		||||
        return Math.abs(hash % partitions);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -725,6 +734,12 @@ public class HashPartitionService implements PartitionService {
 | 
			
		||||
                .hash().asInt();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private int hash(String key) {
 | 
			
		||||
        return hashFunction.newHasher()
 | 
			
		||||
                .putString(key, StandardCharsets.UTF_8)
 | 
			
		||||
                .hash().asInt();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static HashFunction forName(String name) {
 | 
			
		||||
        return switch (name) {
 | 
			
		||||
            case "murmur3_32" -> Hashing.murmur3_32();
 | 
			
		||||
 | 
			
		||||
@ -79,4 +79,6 @@ public interface PartitionService {
 | 
			
		||||
 | 
			
		||||
    int resolvePartitionIndex(UUID entityId, int partitions);
 | 
			
		||||
 | 
			
		||||
    int resolvePartitionIndex(String key, int partitions);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user