From b475f15f25164d002cc4770ca0e14cf60728452b Mon Sep 17 00:00:00 2001 From: Michael Stack Date: Wed, 13 Dec 2017 09:49:42 -0800 Subject: [PATCH] HBASE-19508 ReadOnlyConfiguration throws exception if any Configuration in current context calls addDefautlResource Signed-off-by: Peter Somogyi --- .../coprocessor/ReadOnlyConfiguration.java | 6 ++- .../TestReadOnlyConfiguration.java | 45 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestReadOnlyConfiguration.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/ReadOnlyConfiguration.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/ReadOnlyConfiguration.java index 7f2ddc82318..b073adae958 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/ReadOnlyConfiguration.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/ReadOnlyConfiguration.java @@ -88,7 +88,11 @@ class ReadOnlyConfiguration extends Configuration { @Override public void reloadConfiguration() { - throw new UnsupportedOperationException("Read-only Configuration"); + // This is a write operation. We need to allow it though because if any Configuration in + // current JVM context calls addDefaultResource, this forces a reload of all Configurations + // (all Configurations are 'registered' by the default constructor. Rather than turn + // somersaults, let this 'write' operation through. + this.conf.reloadConfiguration(); } @Override diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestReadOnlyConfiguration.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestReadOnlyConfiguration.java new file mode 100644 index 00000000000..fb6240d4e82 --- /dev/null +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestReadOnlyConfiguration.java @@ -0,0 +1,45 @@ +/* + * Copyright The Apache Software Foundation + * + * 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.hadoop.hbase.coprocessor; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.CategoryBasedTimeout; +import org.apache.hadoop.hbase.testclassification.RegionServerTests; +import org.apache.hadoop.hbase.testclassification.SmallTests; +import org.junit.Rule; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.rules.TestName; +import org.junit.rules.TestRule; + +@Category({RegionServerTests.class, SmallTests.class}) +public class TestReadOnlyConfiguration { + @Rule public TestName name = new TestName(); + @Rule public final TestRule timeout = CategoryBasedTimeout.builder(). + withTimeout(this.getClass()). + withLookingForStuckThread(true). + build(); + + @Test + public void testAddDefaultResource() { + Configuration configuration = new Configuration(); + Configuration readOnlyConf = new ReadOnlyConfiguration(configuration); + configuration.addDefaultResource("abc.xml"); + } +}