@VisibleForTesting void replaceStoreFiles(Collection<HStoreFile> compactedFiles, Collection<HStoreFile> result) throws IOException { this.lock.writeLock().lock(); try { this.storeEngine.getStoreFileManager().addCompactionResults(compactedFiles, result); synchronized (filesCompacting) { filesCompacting.removeAll(compactedFiles); } // These may be null when the RS is shutting down. The space quota Chores will fix the Region // sizes later so it's not super-critical if we miss these. RegionServerServices rsServices = region.getRegionServerServices(); if (rsServices != null && rsServices.getRegionServerSpaceQuotaManager() != null) { updateSpaceQuotaAfterFileReplacement( rsServices.getRegionServerSpaceQuotaManager().getRegionSizeStore(), getRegionInfo(), compactedFiles, result); } } finally { this.lock.writeLock().unlock(); } }
@Test public void testSpaceQuotaChangeAfterReplacement() throws IOException { final TableName tn = TableName.valueOf(name.getMethodName()); init(name.getMethodName()); RegionSizeStoreImpl sizeStore = new RegionSizeStoreImpl(); HStoreFile sf1 = mockStoreFileWithLength(1024L); HStoreFile sf2 = mockStoreFileWithLength(2048L); HStoreFile sf3 = mockStoreFileWithLength(4096L); HStoreFile sf4 = mockStoreFileWithLength(8192L); RegionInfo regionInfo = RegionInfoBuilder.newBuilder(tn).setStartKey(Bytes.toBytes("a")) .setEndKey(Bytes.toBytes("b")).build(); // Compacting two files down to one, reducing size sizeStore.put(regionInfo, 1024L + 4096L); store.updateSpaceQuotaAfterFileReplacement( sizeStore, regionInfo, Arrays.asList(sf1, sf3), Arrays.asList(sf2)); assertEquals(2048L, sizeStore.getRegionSize(regionInfo).getSize()); // The same file length in and out should have no change store.updateSpaceQuotaAfterFileReplacement( sizeStore, regionInfo, Arrays.asList(sf2), Arrays.asList(sf2)); assertEquals(2048L, sizeStore.getRegionSize(regionInfo).getSize()); // Increase the total size used store.updateSpaceQuotaAfterFileReplacement( sizeStore, regionInfo, Arrays.asList(sf2), Arrays.asList(sf3)); assertEquals(4096L, sizeStore.getRegionSize(regionInfo).getSize()); RegionInfo regionInfo2 = RegionInfoBuilder.newBuilder(tn).setStartKey(Bytes.toBytes("b")) .setEndKey(Bytes.toBytes("c")).build(); store.updateSpaceQuotaAfterFileReplacement(sizeStore, regionInfo2, null, Arrays.asList(sf4)); assertEquals(8192L, sizeStore.getRegionSize(regionInfo2).getSize()); }