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.procedure2.store.wal; 019 020import static org.junit.jupiter.api.Assertions.assertEquals; 021import static org.junit.jupiter.api.Assertions.assertFalse; 022import static org.junit.jupiter.api.Assertions.assertTrue; 023 024import org.apache.hadoop.hbase.procedure2.Procedure; 025import org.apache.hadoop.hbase.procedure2.store.wal.ProcedureStoreTracker.DeleteState; 026import org.apache.hadoop.hbase.testclassification.MasterTests; 027import org.apache.hadoop.hbase.testclassification.SmallTests; 028import org.junit.jupiter.api.Tag; 029import org.junit.jupiter.api.Test; 030 031@Tag(MasterTests.TAG) 032@Tag(SmallTests.TAG) 033public class TestBitSetNode { 034 035 @Test 036 public void testGetActiveMaxMinProcId() { 037 BitSetNode node = new BitSetNode(5L, false); 038 assertEquals(5L, node.getActiveMinProcId()); 039 assertEquals(5L, node.getActiveMaxProcId()); 040 node.insertOrUpdate(10L); 041 assertEquals(5L, node.getActiveMinProcId()); 042 assertEquals(10L, node.getActiveMaxProcId()); 043 node.insertOrUpdate(1L); 044 assertEquals(1L, node.getActiveMinProcId()); 045 assertEquals(10L, node.getActiveMaxProcId()); 046 047 node.delete(10L); 048 assertEquals(1L, node.getActiveMinProcId()); 049 assertEquals(5L, node.getActiveMaxProcId()); 050 node.delete(1L); 051 assertEquals(5L, node.getActiveMinProcId()); 052 assertEquals(5L, node.getActiveMaxProcId()); 053 node.delete(5L); 054 assertEquals(Procedure.NO_PROC_ID, node.getActiveMinProcId()); 055 assertEquals(Procedure.NO_PROC_ID, node.getActiveMaxProcId()); 056 } 057 058 @Test 059 public void testGrow() { 060 BitSetNode node = new BitSetNode(1000, false); 061 // contains, do not need to grow but should not fail 062 assertTrue(node.canGrow(1024)); 063 assertTrue(node.canGrow(900)); 064 assertTrue(node.canGrow(1100)); 065 assertFalse(node.canGrow(100)); 066 assertFalse(node.canGrow(10000)); 067 068 // grow to right 069 node.grow(1100); 070 assertTrue(node.contains(1100)); 071 assertTrue(node.isModified(1000)); 072 // grow to left 073 node.grow(900); 074 assertTrue(node.contains(900)); 075 assertTrue(node.isModified(1000)); 076 for (long i = node.getStart(); i <= node.getEnd(); i++) { 077 if (i != 1000) { 078 assertEquals(DeleteState.YES, node.isDeleted(i)); 079 } else { 080 assertEquals(DeleteState.NO, node.isDeleted(i)); 081 } 082 } 083 } 084 085 @Test 086 public void testMerge() { 087 BitSetNode node = new BitSetNode(1000, false); 088 assertTrue(node.canMerge(new BitSetNode(1200, false))); 089 assertFalse(node.canMerge(new BitSetNode(10000, false))); 090 BitSetNode rightNode = new BitSetNode(1200, false); 091 node.merge(rightNode); 092 assertTrue(node.isModified(1000)); 093 assertTrue(node.isModified(1200)); 094 for (long i = node.getStart(); i <= node.getEnd(); i++) { 095 if (i != 1000 && i != 1200) { 096 assertEquals(DeleteState.YES, node.isDeleted(i)); 097 } else { 098 assertEquals(DeleteState.NO, node.isDeleted(i)); 099 } 100 } 101 } 102}