001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package org.apache.hadoop.hbase.regionserver.wal; 019 020import static org.junit.Assert.assertEquals; 021import static org.junit.Assert.assertNotNull; 022import static org.junit.Assert.assertNotSame; 023 024import java.util.concurrent.CompletableFuture; 025import org.apache.hadoop.conf.Configuration; 026import org.apache.hadoop.hbase.HBaseClassTestRule; 027import org.apache.hadoop.hbase.HBaseConfiguration; 028import org.apache.hadoop.hbase.testclassification.RegionServerTests; 029import org.apache.hadoop.hbase.testclassification.SmallTests; 030import org.junit.ClassRule; 031import org.junit.Test; 032import org.junit.experimental.categories.Category; 033 034@Category({ RegionServerTests.class, SmallTests.class }) 035public class TestSyncFutureCache { 036 037 @ClassRule 038 public static final HBaseClassTestRule CLASS_RULE = 039 HBaseClassTestRule.forClass(TestSyncFutureCache.class); 040 041 @Test 042 public void testSyncFutureCacheLifeCycle() throws Exception { 043 final Configuration conf = HBaseConfiguration.create(); 044 SyncFutureCache cache = new SyncFutureCache(conf); 045 try { 046 SyncFuture future0 = cache.getIfPresentOrNew().reset(0, false); 047 assertNotNull(future0); 048 // Get another future from the same thread, should be different one. 049 SyncFuture future1 = cache.getIfPresentOrNew().reset(1, false); 050 assertNotNull(future1); 051 assertNotSame(future0, future1); 052 cache.offer(future1); 053 // Should override. 054 cache.offer(future0); 055 SyncFuture future3 = cache.getIfPresentOrNew(); 056 assertEquals(future3, future0); 057 final SyncFuture[] future4 = new SyncFuture[1]; 058 // From a different thread 059 CompletableFuture.runAsync(() -> future4[0] = cache.getIfPresentOrNew().reset(4, false)) 060 .get(); 061 assertNotNull(future4[0]); 062 assertNotSame(future3, future4[0]); 063 // Clean up 064 cache.offer(future3); 065 cache.offer(future4[0]); 066 } finally { 067 cache.clear(); 068 } 069 } 070}