diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 64cdec714f..3beae86fe6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -951,7 +951,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi long maxSeqIdFromFile = WALSplitter.getMaxRegionSequenceId(fs.getFileSystem(), fs.getRegionDir()); long nextSeqId = Math.max(maxSeqId, maxSeqIdFromFile) + 1; - if (writestate.writesEnabled) { + if (RegionReplicaUtil.isDefaultReplica(getRegionInfo())) { WALSplitter.writeRegionSequenceIdFile(fs.getFileSystem(), fs.getRegionDir(), nextSeqId); } @@ -7047,7 +7047,8 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi checkClassLoading(); this.openSeqNum = initialize(reporter); this.mvcc.advanceTo(openSeqNum); - if (wal != null && getRegionServerServices() != null && !writestate.readOnly) { + if (wal != null && getRegionServerServices() != null + && RegionReplicaUtil.isDefaultReplica(getRegionInfo())) { // Only write the region open event marker to WAL if we are not read-only. writeRegionOpenMarker(wal, openSeqNum); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin1.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin1.java index 8ac2ddafcb..061dda12a9 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin1.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin1.java @@ -499,6 +499,43 @@ public class TestAdmin1 { } } + /** + * Verify schema change for read only table + * @throws IOException + * @throws InterruptedException + */ + @Test + public void testReadOnlyTableModify() throws IOException, InterruptedException { + final TableName tableName = TableName.valueOf(name.getMethodName()); + TEST_UTIL.createTable(tableName, HConstants.CATALOG_FAMILY).close(); + + // Make table read only + HTableDescriptor htd = new HTableDescriptor(this.admin.getTableDescriptor(tableName)); + htd.setReadOnly(true); + boolean expectedException = false; + try { + admin.modifyTable(tableName, htd); + } catch (TableNotDisabledException re) { + expectedException = true; + } + assertFalse(expectedException); + + // try to modify the read only table now + htd = new HTableDescriptor(this.admin.getTableDescriptor(tableName)); + htd.setCompactionEnabled(false); + try { + admin.modifyTable(tableName, htd); + } catch (TableNotDisabledException re) { + expectedException = true; + } + assertFalse(expectedException); + // Delete the table + this.admin.disableTable(tableName); + this.admin.deleteTable(tableName); + assertFalse(this.admin.tableExists(tableName)); + + } + /** * Verify schema modification takes. * @throws IOException