{"record":{"id":"deda7eac54f1dc96","repo":"apache/flink","slug":"an-aggregator-is-already-registered-under-the-give","errorCode":null,"errorMessage":"An aggregator is already registered under the given name.","messagePattern":"An aggregator is already registered under the given name\\.","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"flink-core/src/main/java/org/apache/flink/api/common/aggregators/AggregatorRegistry.java","lineNumber":46,"sourceCode":"\n/** A registry for iteration {@link Aggregator}s. */\n@Internal\npublic class AggregatorRegistry {\n\n    private final Map<String, Aggregator<?>> registry = new HashMap<String, Aggregator<?>>();\n\n    private ConvergenceCriterion<? extends Value> convergenceCriterion;\n\n    private String convergenceCriterionAggregatorName;\n\n    // --------------------------------------------------------------------------------------------\n\n    public void registerAggregator(String name, Aggregator<?> aggregator) {\n        if (name == null || aggregator == null) {\n            throw new IllegalArgumentException(\"Name and aggregator must not be null\");\n        }\n        if (this.registry.containsKey(name)) {\n            throw new RuntimeException(\"An aggregator is already registered under the given name.\");\n        }\n        this.registry.put(name, aggregator);\n    }\n\n    public Collection<AggregatorWithName<?>> getAllRegisteredAggregators() {\n        ArrayList<AggregatorWithName<?>> list =\n                new ArrayList<AggregatorWithName<?>>(this.registry.size());\n\n        for (Map.Entry<String, Aggregator<?>> entry : this.registry.entrySet()) {\n            @SuppressWarnings(\"unchecked\")\n            Aggregator<Value> valAgg = (Aggregator<Value>) entry.getValue();\n            list.add(new AggregatorWithName<>(entry.getKey(), valAgg));\n        }\n        return list;\n    }\n\n    public <T extends Value> void registerAggregationConvergenceCriterion(\n            String name, Aggregator<T> aggregator, ConvergenceCriterion<T> convergenceCheck) {","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/apache/flink/blob/2f3c205e9266cb30240eb7f4fdab15cad629a70f/flink-core/src/main/java/org/apache/flink/api/common/aggregators/AggregatorRegistry.java#L28-L64","documentation":"Thrown by AggregatorRegistry.registerAggregator when an aggregator is already registered under the given name. The registry maps each name to exactly one aggregator instance to keep per-superstep aggregation unambiguous; a second registration under the same name would overwrite the first. The API rejects duplicates with a RuntimeException.","triggerScenarios":"Calling registerAggregator(name, agg) twice with the same name but different aggregator instances; two operators/UDFs in an iterative job both registering an aggregator under 'sum'.","commonSituations":"Shared iteration setup code called multiple times; library code and user code both registering a well-known aggregator name; refactor that merged two iteration builders.","solutions":["Check the registry (or wrap registration in a helper) before re-registering; use distinct names per aggregator.","Centralize aggregator registration so each name is registered exactly once.","If re-registration is intentional for the same instance, guard: only register when not already present."],"exampleFix":"// before\nregistry.registerAggregator(\"sum\", agg1);\nregistry.registerAggregator(\"sum\", agg2);\n// after\n// collect names once\nSet<String> registered = new HashSet<>();\nvoid registerOnce(String name, Aggregator<?> agg) {\n    if (registered.add(name)) registry.registerAggregator(name, agg);\n}","handlingStrategy":"validation","validationCode":"// track registered names\nif (!registeredNames.contains(name)) {\n    registry.registerAggregator(name, aggregator);\n    registeredNames.add(name);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Register each aggregator name exactly once.","Namespace aggregator names per iteration/UDF.","Centralize registration to avoid double-register across modules."],"tags":["aggregator","iteration","duplicate","registration"],"backgroundTag":null,"analyzedSha":"2f3c205e9266cb30240eb7f4fdab15cad629a70f","analyzedAt":"2026-08-14T08:48:24.518Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}