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.jupiter.api.Assertions.assertEquals; 021import static org.junit.jupiter.api.Assertions.assertNotNull; 022import static org.junit.jupiter.api.Assertions.assertNotSame; 023 024import java.util.concurrent.CompletableFuture; 025import org.apache.hadoop.conf.Configuration; 026import org.apache.hadoop.hbase.HBaseConfiguration; 027import org.apache.hadoop.hbase.testclassification.RegionServerTests; 028import org.apache.hadoop.hbase.testclassification.SmallTests; 029import org.junit.jupiter.api.Tag; 030import org.junit.jupiter.api.Test; 031 032@Tag(RegionServerTests.TAG) 033@Tag(SmallTests.TAG) 034public class TestSyncFutureCache { 035 036 @Test 037 public void testSyncFutureCacheLifeCycle() throws Exception { 038 final Configuration conf = HBaseConfiguration.create(); 039 SyncFutureCache cache = new SyncFutureCache(conf); 040 try { 041 SyncFuture future0 = cache.getIfPresentOrNew().reset(0, false); 042 assertNotNull(future0); 043 // Get another future from the same thread, should be different one. 044 SyncFuture future1 = cache.getIfPresentOrNew().reset(1, false); 045 assertNotNull(future1); 046 assertNotSame(future0, future1); 047 cache.offer(future1); 048 // Should override. 049 cache.offer(future0); 050 SyncFuture future3 = cache.getIfPresentOrNew(); 051 assertEquals(future3, future0); 052 final SyncFuture[] future4 = new SyncFuture[1]; 053 // From a different thread 054 CompletableFuture.runAsync(() -> future4[0] = cache.getIfPresentOrNew().reset(4, false)) 055 .get(); 056 assertNotNull(future4[0]); 057 assertNotSame(future3, future4[0]); 058 // Clean up 059 cache.offer(future3); 060 cache.offer(future4[0]); 061 } finally { 062 cache.clear(); 063 } 064 } 065}