{"record":{"id":"af6ed2641da89471","repo":"prestodb/presto","slug":"query-prerequisites-s-is-already-registered-af6ed2","errorCode":null,"errorMessage":"Query Prerequisites '%s' is already registered","messagePattern":"Query Prerequisites '(.+?)' is already registered","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/ttl/clusterttlprovidermanagers/ConfidenceBasedClusterTtlProviderManager.java","lineNumber":68,"sourceCode":"\n    @Inject\n    public ConfidenceBasedClusterTtlProviderManager(NodeTtlFetcherManager nodeTtlFetcherManager)\n    {\n        this.nodeTtlFetcherManager = requireNonNull(nodeTtlFetcherManager, \"nodeTtlFetcherManager is null\");\n    }\n\n    @Override\n    public ConfidenceBasedTtlInfo getClusterTtl()\n    {\n        return clusterTtlProvider.get().getClusterTtl(ImmutableList.copyOf(nodeTtlFetcherManager.getAllTtls().values()));\n    }\n\n    @Override\n    public void addClusterTtlProviderFactory(ClusterTtlProviderFactory clusterTtlProviderFactory)\n    {\n        requireNonNull(clusterTtlProviderFactory, \"clusterTtlProviderFactory is null\");\n        if (clusterTtlProviderFactories.putIfAbsent(clusterTtlProviderFactory.getName(), clusterTtlProviderFactory) != null) {\n            throw new IllegalArgumentException(format(\"Query Prerequisites '%s' is already registered\", clusterTtlProviderFactory.getName()));\n        }\n    }\n\n    @Override\n    public void loadClusterTtlProvider()\n            throws Exception\n    {\n        if (Files.exists(CLUSTER_TTL_PROVIDER_CONFIG)) {\n            Map<String, String> properties = new HashMap<>(loadProperties(CLUSTER_TTL_PROVIDER_CONFIG.toFile()));\n            String factoryName = properties.remove(CLUSTER_TTL_PROVIDER_PROPERTY_NAME);\n\n            checkArgument(!isNullOrEmpty(factoryName),\n                    \"Cluster Ttl Provider configuration %s does not contain %s\", CLUSTER_TTL_PROVIDER_CONFIG.toAbsolutePath(), CLUSTER_TTL_PROVIDER_PROPERTY_NAME);\n            load(factoryName, properties);\n        }\n        else {\n            load(\"infinite\", ImmutableMap.of());\n        }","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/ttl/clusterttlprovidermanagers/ConfidenceBasedClusterTtlProviderManager.java#L50-L86","documentation":"ConfidenceBasedClusterTtlProviderManager.addClusterTtlProviderFactory throws IllegalArgumentException when a ClusterTtlProviderFactory whose getName() is already present in the clusterTtlProviderFactories map is registered again (putIfAbsent returns non-null). Factory names must be unique within the manager.","triggerScenarios":"Calling addClusterTtlProviderFactory twice with factories sharing the same name — typically re-running plugin setup, loading two plugin versions that both register the same TTL provider factory name, or a plugin registering a name that collides with a built-in factory.","commonSituations":"See trigger scenarios.","solutions":["Remove duplicate plugin jars so the factory is only loaded once.","Rename one factory's getName() to a unique value.","Guard registration: check clusterTtlProviderFactories contains the name before adding.","Create a fresh manager instance per test/setup instead of reusing it."],"exampleFix":"// before\nmanager.addClusterTtlProviderFactory(new MyTtlProviderFactory(\"confidence\"));\nmanager.addClusterTtlProviderFactory(new OtherFactory(\"confidence\")); // duplicate\n\n// after\nString name = \"my-unique-ttl-provider\";\nif (manager.getClusterTtlProviderFactories().stream().noneMatch(f -> f.getName().equals(name))) {\n    manager.addClusterTtlProviderFactory(new MyTtlProviderFactory(name));\n}","handlingStrategy":"try-catch","validationCode":"// Check for existing factory with same name before registering\nboolean exists = manager.getClusterTtlProviderFactories().stream()\n    .anyMatch(f -> f.getName().equals(newFactory.getName()));\nif (exists) {\n    // skip registration or fail with a clear duplicate error\n}","typeGuard":"boolean isFactoryNameFree(ClusterTtlProviderManager m, String name) {\n    return m.getClusterTtlProviderFactories().stream().noneMatch(f -> f.getName().equals(name));\n}","tryCatchPattern":"try {\n    manager.addClusterTtlProviderFactory(factory);\n} catch (IllegalArgumentException e) {\n    LOG.warn(\"TTL provider factory '%s' already registered; ignoring duplicate\", factory.getName());\n}","preventionTips":["Keep only one copy of each plugin jar on the plugin path.","Use unique, namespaced factory names across plugins.","Make plugin setup idempotent (skip already-registered factories).","In tests, create a fresh manager per setup rather than reusing instances."],"tags":["duplicate-registration","ttl","plugin","presto"],"backgroundTag":"duplicate-factory-registration","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}