{"record":{"id":"84edcf160b0c573b","repo":"prestodb/presto","slug":"access-control-s-is-already-registered","errorCode":null,"errorMessage":"Access control '%s' is already registered","messagePattern":"Access control '(.+?)' is already registered","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/security/AccessControlManager.java","lineNumber":108,"sourceCode":"    private final CounterStat authorizationFail = new CounterStat();\n    private StatsRecordingSystemAccessControl.Stats detailedStats = new StatsRecordingSystemAccessControl.Stats();\n\n    @Inject\n    public AccessControlManager(TransactionManager transactionManager)\n    {\n        this.transactionManager = requireNonNull(transactionManager, \"transactionManager is null\");\n        addSystemAccessControlFactory(new AllowAllSystemAccessControl.Factory());\n        addSystemAccessControlFactory(new ReadOnlySystemAccessControl.Factory());\n        addSystemAccessControlFactory(new FileBasedSystemAccessControl.Factory());\n        addSystemAccessControlFactory(new DenyQueryIntegrityCheckSystemAccessControl.Factory());\n    }\n\n    public void addSystemAccessControlFactory(SystemAccessControlFactory accessControlFactory)\n    {\n        requireNonNull(accessControlFactory, \"accessControlFactory is null\");\n\n        if (systemAccessControlFactories.putIfAbsent(accessControlFactory.getName(), accessControlFactory) != null) {\n            throw new IllegalArgumentException(format(\"Access control '%s' is already registered\", accessControlFactory.getName()));\n        }\n    }\n\n    public void addCatalogAccessControl(ConnectorId connectorId, ConnectorAccessControl accessControl)\n    {\n        requireNonNull(connectorId, \"connectorId is null\");\n        requireNonNull(accessControl, \"accessControl is null\");\n        checkState(connectorAccessControl.putIfAbsent(connectorId, new CatalogAccessControlEntry(connectorId, accessControl)) == null,\n                \"Access control for connector '%s' is already registered\", connectorId);\n    }\n\n    public void removeCatalogAccessControl(ConnectorId connectorId)\n    {\n        connectorAccessControl.remove(connectorId);\n    }\n\n    public void loadSystemAccessControl()\n            throws Exception","sourceCodeStart":90,"sourceCodeEnd":126,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/security/AccessControlManager.java#L90-L126","documentation":"AccessControlManager.addSystemAccessControlFactory registers SystemAccessControlFactory instances by name in a map using putIfAbsent. If a factory with the same getName() is already registered, it throws IllegalArgumentException — the manager never allows two system access control plugins under one name.","triggerScenarios":"Calling addSystemAccessControlFactory with a factory whose name collides with an already-registered factory; most commonly a plugin jar loaded twice, the same plugin installed in multiple plugin directories, or a test calling the method twice for the same factory.","commonSituations":"Duplicate plugin deployment (same plugin in plugins/ twice or an old and new jar both providing the same access control name); re-registration after a failed bootstrap retried in-process; test setup that adds the factory on every test without resetting the manager.","solutions":["Remove duplicate plugin jars so only one provider of that system access control name is installed","Check the factory's getName() for accidental duplicates","In tests, create a fresh AccessControlManager or use distinct factory names per registration","Wrap registration to skip factories already present if idempotent startup is intended"],"exampleFix":"// before\naccessControlManager.addSystemAccessControlFactory(factory);\n// after\nif (accessControlManager.getSystemAccessControlFactories().stream()\n        .noneMatch(f -> f.getName().equals(factory.getName()))) {\n    accessControlManager.addSystemAccessControlFactory(factory);\n}","handlingStrategy":"validation","validationCode":"boolean alreadyRegistered = manager.getSystemAccessControlFactories().stream()\n    .anyMatch(f -> f.getName().equals(factory.getName()));\nif (alreadyRegistered) { skip-or-log; }","typeGuard":"boolean isRegisterable(SystemAccessControlFactory f, Set<String> registeredNames) {\n    return f.getName() != null && !registeredNames.contains(f.getName());\n}","tryCatchPattern":"try {\n    manager.addSystemAccessControlFactory(factory);\n} catch (IllegalArgumentException e) {\n    log.warn(\"System access control factory already registered: {}\", factory.getName());\n}","preventionTips":["Keep only one copy of each access control plugin jar in the plugin directory","Give custom factories unique, namespaced getName() values","In tests, build a fresh AccessControlManager per test or register factories once in setup"],"tags":["presto","access-control","plugin-registration","illegal-argument"],"backgroundTag":"duplicate-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"}