diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/RangerDorisAccessControllerFactory.java b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/RangerDorisAccessControllerFactory.java index 28093ad7886ee7..7e23769911520c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/RangerDorisAccessControllerFactory.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/RangerDorisAccessControllerFactory.java @@ -22,6 +22,11 @@ import java.util.Map; public class RangerDorisAccessControllerFactory implements AccessControllerFactory { + private static class SingletonHolder { + // Every controller starts a Ranger policy refresher, so all Env instances must share one controller. + private static final RangerDorisAccessController INSTANCE = new RangerDorisAccessController("doris"); + } + @Override public String factoryIdentifier() { return "ranger-doris"; @@ -29,6 +34,6 @@ public String factoryIdentifier() { @Override public RangerDorisAccessController createAccessController(Map prop) { - return new RangerDorisAccessController("doris"); + return SingletonHolder.INSTANCE; } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/RangerDorisAccessControllerFactoryTest.java b/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/RangerDorisAccessControllerFactoryTest.java new file mode 100644 index 00000000000000..7029f8e4389f8e --- /dev/null +++ b/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/RangerDorisAccessControllerFactoryTest.java @@ -0,0 +1,43 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.mysql.privilege; + +import org.apache.doris.catalog.authorizer.ranger.doris.RangerDorisAccessController; + +import org.junit.Assert; +import org.junit.Test; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.Collections; + +public class RangerDorisAccessControllerFactoryTest { + @Test + public void testCreateAccessControllerReturnsSingleton() { + try (MockedConstruction mockedConstruction = + Mockito.mockConstruction(RangerDorisAccessController.class)) { + RangerDorisAccessController first = new RangerDorisAccessControllerFactory() + .createAccessController(Collections.emptyMap()); + RangerDorisAccessController second = new RangerDorisAccessControllerFactory() + .createAccessController(Collections.emptyMap()); + + Assert.assertEquals(1, mockedConstruction.constructed().size()); + Assert.assertSame(first, second); + } + } +}