|  | @@ -36,8 +36,10 @@ import org.junit.Before;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import java.io.IOException;
 | 
	
		
			
				|  |  |  import java.util.HashMap;
 | 
	
		
			
				|  |  | +import java.util.HashSet;
 | 
	
		
			
				|  |  |  import java.util.List;
 | 
	
		
			
				|  |  |  import java.util.Map;
 | 
	
		
			
				|  |  | +import java.util.Set;
 | 
	
		
			
				|  |  |  import java.util.concurrent.Executor;
 | 
	
		
			
				|  |  |  import java.util.function.BiFunction;
 | 
	
		
			
				|  |  |  import java.util.stream.IntStream;
 | 
	
	
		
			
				|  | @@ -47,11 +49,13 @@ import static org.hamcrest.Matchers.equalTo;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  public class MetadataPersistentTasksTests extends ESTestCase {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    private Set<Long> assignedAllocationIds;
 | 
	
		
			
				|  |  |      private NamedWriteableRegistry namedWriteableRegistry;
 | 
	
		
			
				|  |  |      private NamedWriteableRegistry namedWriteableRegistryBwc;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Before
 | 
	
		
			
				|  |  |      public void initializeRegistries() {
 | 
	
		
			
				|  |  | +        assignedAllocationIds = new HashSet<>();
 | 
	
		
			
				|  |  |          new PersistentTasksExecutorRegistry(
 | 
	
		
			
				|  |  |              List.of(
 | 
	
		
			
				|  |  |                  new TestClusterPersistentTasksExecutor(TestClusterPersistentTasksParams.NAME, null),
 | 
	
	
		
			
				|  | @@ -191,12 +195,18 @@ public class MetadataPersistentTasksTests extends ESTestCase {
 | 
	
		
			
				|  |  |          );
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private static <T extends PersistentTasks> T mutatePersistentTasks(
 | 
	
		
			
				|  |  | +    private long randomUniqueAllocationIdBetween(long min, long max) {
 | 
	
		
			
				|  |  | +        final long allocationId = randomValueOtherThanMany(id -> assignedAllocationIds.contains(id), () -> randomLongBetween(min, max));
 | 
	
		
			
				|  |  | +        assignedAllocationIds.add(allocationId);
 | 
	
		
			
				|  |  | +        return allocationId;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private <T extends PersistentTasks> T mutatePersistentTasks(
 | 
	
		
			
				|  |  |          PersistentTasks persistentTasks,
 | 
	
		
			
				|  |  |          BiFunction<String, Long, PersistentTask<?>> oneTaskFunc,
 | 
	
		
			
				|  |  |          BiFunction<Long, Map<String, PersistentTask<?>>, T> tasksFunc
 | 
	
		
			
				|  |  |      ) {
 | 
	
		
			
				|  |  | -        final long updatedAllocationId = persistentTasks.getLastAllocationId() + randomLongBetween(100, 1000);
 | 
	
		
			
				|  |  | +        final long updatedLastAllocationId = persistentTasks.getLastAllocationId() + randomLongBetween(100, 1000);
 | 
	
		
			
				|  |  |          final Map<String, PersistentTask<?>> tasks = persistentTasks.taskMap();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          final var updatedTasks = new HashMap<>(tasks);
 | 
	
	
		
			
				|  | @@ -206,7 +216,10 @@ public class MetadataPersistentTasksTests extends ESTestCase {
 | 
	
		
			
				|  |  |                  final String taskId = randomTaskId();
 | 
	
		
			
				|  |  |                  updatedTasks.put(
 | 
	
		
			
				|  |  |                      taskId,
 | 
	
		
			
				|  |  | -                    oneTaskFunc.apply(taskId, randomLongBetween(persistentTasks.getLastAllocationId() + i + 1, updatedAllocationId))
 | 
	
		
			
				|  |  | +                    oneTaskFunc.apply(
 | 
	
		
			
				|  |  | +                        taskId,
 | 
	
		
			
				|  |  | +                        randomUniqueAllocationIdBetween(persistentTasks.getLastAllocationId() + i + 1, updatedLastAllocationId)
 | 
	
		
			
				|  |  | +                    )
 | 
	
		
			
				|  |  |                  );
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          } else {
 | 
	
	
		
			
				|  | @@ -215,14 +228,14 @@ public class MetadataPersistentTasksTests extends ESTestCase {
 | 
	
		
			
				|  |  |                  updatedTasks.remove(randomFrom(updatedTasks.keySet()));
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        return tasksFunc.apply(updatedAllocationId, updatedTasks);
 | 
	
		
			
				|  |  | +        return tasksFunc.apply(updatedLastAllocationId, updatedTasks);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private static String randomTaskId() {
 | 
	
		
			
				|  |  |          return randomAlphaOfLength(15);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private static Metadata randomMetadataWithPersistentTasks() {
 | 
	
		
			
				|  |  | +    private Metadata randomMetadataWithPersistentTasks() {
 | 
	
		
			
				|  |  |          final long lastAllocationIdCluster = randomLongBetween(0, Long.MAX_VALUE / 2);
 | 
	
		
			
				|  |  |          final var clusterPersistentTasksCustomMetadata = new ClusterPersistentTasksCustomMetadata(
 | 
	
		
			
				|  |  |              lastAllocationIdCluster,
 | 
	
	
		
			
				|  | @@ -268,26 +281,26 @@ public class MetadataPersistentTasksTests extends ESTestCase {
 | 
	
		
			
				|  |  |          );
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public static Map<String, PersistentTask<?>> randomClusterPersistentTasks(long allocationId) {
 | 
	
		
			
				|  |  | +    private Map<String, PersistentTask<?>> randomClusterPersistentTasks(long allocationId) {
 | 
	
		
			
				|  |  |          return randomMap(0, 5, () -> {
 | 
	
		
			
				|  |  |              final String taskId = randomTaskId();
 | 
	
		
			
				|  |  | -            return new Tuple<>(taskId, oneClusterPersistentTask(taskId, randomLongBetween(0, allocationId)));
 | 
	
		
			
				|  |  | +            return new Tuple<>(taskId, oneClusterPersistentTask(taskId, randomUniqueAllocationIdBetween(0, allocationId)));
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public static Map<String, PersistentTask<?>> randomProjectPersistentTasks(long allocationId) {
 | 
	
		
			
				|  |  | +    private Map<String, PersistentTask<?>> randomProjectPersistentTasks(long allocationId) {
 | 
	
		
			
				|  |  |          return randomMap(0, 5, () -> {
 | 
	
		
			
				|  |  |              final String taskId = randomTaskId();
 | 
	
		
			
				|  |  | -            return new Tuple<>(taskId, oneProjectPersistentTask(taskId, randomLongBetween(0, allocationId)));
 | 
	
		
			
				|  |  | +            return new Tuple<>(taskId, oneProjectPersistentTask(taskId, randomUniqueAllocationIdBetween(0, allocationId)));
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public static Tuple<Metadata, Metadata> randomMetadataAndUpdate() {
 | 
	
		
			
				|  |  | +    private Tuple<Metadata, Metadata> randomMetadataAndUpdate() {
 | 
	
		
			
				|  |  |          final Metadata before = randomMetadataWithPersistentTasks();
 | 
	
		
			
				|  |  |          final Metadata after = Metadata.builder(before)
 | 
	
		
			
				|  |  |              .putCustom(
 | 
	
		
			
				|  |  |                  ClusterPersistentTasksCustomMetadata.TYPE,
 | 
	
		
			
				|  |  | -                MetadataPersistentTasksTests.<ClusterPersistentTasksCustomMetadata>mutatePersistentTasks(
 | 
	
		
			
				|  |  | +                this.<ClusterPersistentTasksCustomMetadata>mutatePersistentTasks(
 | 
	
		
			
				|  |  |                      ClusterPersistentTasksCustomMetadata.get(before),
 | 
	
		
			
				|  |  |                      MetadataPersistentTasksTests::oneClusterPersistentTask,
 | 
	
		
			
				|  |  |                      ClusterPersistentTasksCustomMetadata::new
 |