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}