Skip to content

Commit e7154e1

Browse files
committed
HBASE-29623 Blocks for CFs with BlockCache disabled may still get cached on write or compaction (#7339)
Signed-off-by: Peter Somogyi <psomogyi@apache.org> Change-Id: If4e4efd89acec4fb6941de76fafa89240d6207d5
1 parent 84c056b commit e7154e1

2 files changed

Lines changed: 49 additions & 33 deletions

File tree

hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CacheConfig.java

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public class CacheConfig implements PropagatingConfigurationObserver {
125125
private volatile boolean cacheDataOnRead;
126126

127127
/** Whether blocks should be flagged as in-memory when being cached */
128-
private final boolean inMemory;
128+
private boolean inMemory;
129129

130130
/** Whether data blocks should be cached when new files are written */
131131
private volatile boolean cacheDataOnWrite;
@@ -140,28 +140,29 @@ public class CacheConfig implements PropagatingConfigurationObserver {
140140
private volatile boolean evictOnClose;
141141

142142
/** Whether data blocks should be stored in compressed and/or encrypted form in the cache */
143-
private final boolean cacheDataCompressed;
143+
private boolean cacheDataCompressed;
144144

145145
/** Whether data blocks should be prefetched into the cache */
146-
private final boolean prefetchOnOpen;
146+
private boolean prefetchOnOpen;
147147

148148
/**
149149
* Whether data blocks should be cached when compacted file is written
150150
*/
151-
private final boolean cacheCompactedDataOnWrite;
151+
private boolean cacheCompactedDataOnWrite;
152152

153153
/**
154154
* Determine threshold beyond which we do not cache blocks on compaction
155155
*/
156156
private long cacheCompactedDataOnWriteThreshold;
157157

158-
private final boolean dropBehindCompaction;
158+
private boolean dropBehindCompaction;
159159

160160
// Local reference to the block cache
161161
private final BlockCache blockCache;
162162

163163
private final ByteBuffAllocator byteBuffAllocator;
164164

165+
165166
/**
166167
* Create a cache configuration using the specified configuration object and defaults for family
167168
* level settings. Only use if no column family context.
@@ -182,30 +183,32 @@ public CacheConfig(Configuration conf, BlockCache blockCache) {
182183
*/
183184
public CacheConfig(Configuration conf, ColumnFamilyDescriptor family, BlockCache blockCache,
184185
ByteBuffAllocator byteBuffAllocator) {
185-
this.cacheDataOnRead = conf.getBoolean(CACHE_DATA_ON_READ_KEY, DEFAULT_CACHE_DATA_ON_READ)
186-
&& (family == null ? true : family.isBlockCacheEnabled());
187-
this.inMemory = family == null ? DEFAULT_IN_MEMORY : family.isInMemory();
188-
this.cacheDataCompressed =
189-
conf.getBoolean(CACHE_DATA_BLOCKS_COMPRESSED_KEY, DEFAULT_CACHE_DATA_COMPRESSED);
190-
this.dropBehindCompaction =
191-
conf.getBoolean(DROP_BEHIND_CACHE_COMPACTION_KEY, DROP_BEHIND_CACHE_COMPACTION_DEFAULT);
192-
// For the following flags we enable them regardless of per-schema settings
193-
// if they are enabled in the global configuration.
194-
this.cacheDataOnWrite = conf.getBoolean(CACHE_BLOCKS_ON_WRITE_KEY, DEFAULT_CACHE_DATA_ON_WRITE)
195-
|| (family == null ? false : family.isCacheDataOnWrite());
196-
this.cacheIndexesOnWrite =
197-
conf.getBoolean(CACHE_INDEX_BLOCKS_ON_WRITE_KEY, DEFAULT_CACHE_INDEXES_ON_WRITE)
198-
|| (family == null ? false : family.isCacheIndexesOnWrite());
199-
this.cacheBloomsOnWrite =
200-
conf.getBoolean(CACHE_BLOOM_BLOCKS_ON_WRITE_KEY, DEFAULT_CACHE_BLOOMS_ON_WRITE)
201-
|| (family == null ? false : family.isCacheBloomsOnWrite());
202-
this.evictOnClose = conf.getBoolean(EVICT_BLOCKS_ON_CLOSE_KEY, DEFAULT_EVICT_ON_CLOSE)
203-
|| (family == null ? false : family.isEvictBlocksOnClose());
204-
this.prefetchOnOpen = conf.getBoolean(PREFETCH_BLOCKS_ON_OPEN_KEY, DEFAULT_PREFETCH_ON_OPEN)
205-
|| (family == null ? false : family.isPrefetchBlocksOnOpen());
206-
this.cacheCompactedDataOnWrite =
207-
conf.getBoolean(CACHE_COMPACTED_BLOCKS_ON_WRITE_KEY, DEFAULT_CACHE_COMPACTED_BLOCKS_ON_WRITE);
208-
this.cacheCompactedDataOnWriteThreshold = getCacheCompactedBlocksOnWriteThreshold(conf);
186+
if (family == null || family.isBlockCacheEnabled()) {
187+
this.cacheDataOnRead = conf.getBoolean(CACHE_DATA_ON_READ_KEY, DEFAULT_CACHE_DATA_ON_READ);
188+
this.inMemory = family == null ? DEFAULT_IN_MEMORY : family.isInMemory();
189+
this.cacheDataCompressed =
190+
conf.getBoolean(CACHE_DATA_BLOCKS_COMPRESSED_KEY, DEFAULT_CACHE_DATA_COMPRESSED);
191+
this.dropBehindCompaction =
192+
conf.getBoolean(DROP_BEHIND_CACHE_COMPACTION_KEY, DROP_BEHIND_CACHE_COMPACTION_DEFAULT);
193+
// For the following flags we enable them regardless of per-schema settings
194+
// if they are enabled in the global configuration.
195+
this.cacheDataOnWrite =
196+
conf.getBoolean(CACHE_BLOCKS_ON_WRITE_KEY, DEFAULT_CACHE_DATA_ON_WRITE)
197+
|| (family == null ? false : family.isCacheDataOnWrite());
198+
this.cacheIndexesOnWrite =
199+
conf.getBoolean(CACHE_INDEX_BLOCKS_ON_WRITE_KEY, DEFAULT_CACHE_INDEXES_ON_WRITE)
200+
|| (family == null ? false : family.isCacheIndexesOnWrite());
201+
this.cacheBloomsOnWrite =
202+
conf.getBoolean(CACHE_BLOOM_BLOCKS_ON_WRITE_KEY, DEFAULT_CACHE_BLOOMS_ON_WRITE)
203+
|| (family == null ? false : family.isCacheBloomsOnWrite());
204+
this.evictOnClose = conf.getBoolean(EVICT_BLOCKS_ON_CLOSE_KEY, DEFAULT_EVICT_ON_CLOSE)
205+
|| (family == null ? false : family.isEvictBlocksOnClose());
206+
this.prefetchOnOpen = conf.getBoolean(PREFETCH_BLOCKS_ON_OPEN_KEY, DEFAULT_PREFETCH_ON_OPEN)
207+
|| (family == null ? false : family.isPrefetchBlocksOnOpen());
208+
this.cacheCompactedDataOnWrite = conf.getBoolean(CACHE_COMPACTED_BLOCKS_ON_WRITE_KEY,
209+
DEFAULT_CACHE_COMPACTED_BLOCKS_ON_WRITE);
210+
this.cacheCompactedDataOnWriteThreshold = getCacheCompactedBlocksOnWriteThreshold(conf);
211+
}
209212
this.blockCache = blockCache;
210213
this.byteBuffAllocator = byteBuffAllocator;
211214
}

hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestCacheConfig.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,23 +188,27 @@ void basicBlockCacheOps(final BlockCache bc, final CacheConfig cc, final boolean
188188

189189
@Test
190190
public void testDisableCacheDataBlock() throws IOException {
191+
// First tests the default configs behaviour and block cache enabled
191192
Configuration conf = HBaseConfiguration.create();
192193
CacheConfig cacheConfig = new CacheConfig(conf);
193194
assertTrue(cacheConfig.shouldCacheBlockOnRead(BlockCategory.DATA));
194195
assertFalse(cacheConfig.shouldCacheCompressed(BlockCategory.DATA));
195196
assertFalse(cacheConfig.shouldCacheDataCompressed());
196197
assertFalse(cacheConfig.shouldCacheDataOnWrite());
198+
assertFalse(cacheConfig.shouldCacheCompactedBlocksOnWrite());
197199
assertTrue(cacheConfig.shouldCacheDataOnRead());
198200
assertTrue(cacheConfig.shouldCacheBlockOnRead(BlockCategory.INDEX));
199201
assertTrue(cacheConfig.shouldCacheBlockOnRead(BlockCategory.META));
200202
assertTrue(cacheConfig.shouldCacheBlockOnRead(BlockCategory.BLOOM));
201203
assertFalse(cacheConfig.shouldCacheBloomsOnWrite());
202204
assertFalse(cacheConfig.shouldCacheIndexesOnWrite());
203205

206+
// Tests block cache enabled and related cache on write flags enabled
204207
conf.setBoolean(CacheConfig.CACHE_BLOCKS_ON_WRITE_KEY, true);
205208
conf.setBoolean(CacheConfig.CACHE_DATA_BLOCKS_COMPRESSED_KEY, true);
206209
conf.setBoolean(CacheConfig.CACHE_BLOOM_BLOCKS_ON_WRITE_KEY, true);
207210
conf.setBoolean(CacheConfig.CACHE_INDEX_BLOCKS_ON_WRITE_KEY, true);
211+
conf.setBoolean(CacheConfig.CACHE_COMPACTED_BLOCKS_ON_WRITE_KEY, true);
208212

209213
cacheConfig = new CacheConfig(conf);
210214
assertTrue(cacheConfig.shouldCacheBlockOnRead(BlockCategory.DATA));
@@ -217,24 +221,33 @@ public void testDisableCacheDataBlock() throws IOException {
217221
assertTrue(cacheConfig.shouldCacheBlockOnRead(BlockCategory.BLOOM));
218222
assertTrue(cacheConfig.shouldCacheBloomsOnWrite());
219223
assertTrue(cacheConfig.shouldCacheIndexesOnWrite());
224+
assertTrue(cacheConfig.shouldCacheCompactedBlocksOnWrite());
220225

226+
// Tests block cache enabled but related cache on read/write properties disabled
221227
conf.setBoolean(CacheConfig.CACHE_DATA_ON_READ_KEY, false);
222228
conf.setBoolean(CacheConfig.CACHE_BLOCKS_ON_WRITE_KEY, false);
229+
conf.setBoolean(CacheConfig.CACHE_COMPACTED_BLOCKS_ON_WRITE_KEY, false);
223230

224231
cacheConfig = new CacheConfig(conf);
225232
assertFalse(cacheConfig.shouldCacheBlockOnRead(BlockCategory.DATA));
226233
assertFalse(cacheConfig.shouldCacheCompressed(BlockCategory.DATA));
227234
assertFalse(cacheConfig.shouldCacheDataCompressed());
228235
assertFalse(cacheConfig.shouldCacheDataOnWrite());
229236
assertFalse(cacheConfig.shouldCacheDataOnRead());
237+
assertFalse(cacheConfig.shouldCacheCompactedBlocksOnWrite());
230238
assertTrue(cacheConfig.shouldCacheBlockOnRead(BlockCategory.INDEX));
231239
assertFalse(cacheConfig.shouldCacheBlockOnRead(BlockCategory.META));
232240
assertTrue(cacheConfig.shouldCacheBlockOnRead(BlockCategory.BLOOM));
233241
assertTrue(cacheConfig.shouldCacheBloomsOnWrite());
234242
assertTrue(cacheConfig.shouldCacheIndexesOnWrite());
235243

236-
conf.setBoolean(CacheConfig.CACHE_DATA_ON_READ_KEY, true);
237-
conf.setBoolean(CacheConfig.CACHE_BLOCKS_ON_WRITE_KEY, false);
244+
// Finally tests block cache disabled in the column family but all cache on read/write
245+
// properties enabled in the config.
246+
conf.setBoolean(CacheConfig.CACHE_BLOCKS_ON_WRITE_KEY, true);
247+
conf.setBoolean(CacheConfig.CACHE_DATA_BLOCKS_COMPRESSED_KEY, true);
248+
conf.setBoolean(CacheConfig.CACHE_BLOOM_BLOCKS_ON_WRITE_KEY, true);
249+
conf.setBoolean(CacheConfig.CACHE_INDEX_BLOCKS_ON_WRITE_KEY, true);
250+
conf.setBoolean(CacheConfig.CACHE_COMPACTED_BLOCKS_ON_WRITE_KEY, true);
238251

239252
HColumnDescriptor family = new HColumnDescriptor("testDisableCacheDataBlock");
240253
family.setBlockCacheEnabled(false);
@@ -248,8 +261,8 @@ public void testDisableCacheDataBlock() throws IOException {
248261
assertTrue(cacheConfig.shouldCacheBlockOnRead(BlockCategory.INDEX));
249262
assertFalse(cacheConfig.shouldCacheBlockOnRead(BlockCategory.META));
250263
assertTrue(cacheConfig.shouldCacheBlockOnRead(BlockCategory.BLOOM));
251-
assertTrue(cacheConfig.shouldCacheBloomsOnWrite());
252-
assertTrue(cacheConfig.shouldCacheIndexesOnWrite());
264+
assertFalse(cacheConfig.shouldCacheBloomsOnWrite());
265+
assertFalse(cacheConfig.shouldCacheIndexesOnWrite());
253266
}
254267

255268
@Test

0 commit comments

Comments
 (0)