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