/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.hadoop.hive.common; import java.util.Arrays; import java.util.BitSet; /** * An implementation of {@link org.apache.hadoop.hive.common.ValidTxnList} for use by the compactor. * * Compaction should only include txns up to smallest open txn (exclussive). * There may be aborted txns in the snapshot represented by this ValidCompactorTxnList. * Thus {@link #isTxnRangeValid(long, long)} returns NONE for any range that inluces any unresolved * transactions. Any txn above {@code highWatermark} is unresolved. * These produce the logic we need to assure that the compactor only sees records less than the lowest * open transaction when choosing which files to compact, but that it still ignores aborted * records when compacting. * * See org.apache.hadoop.hive.metastore.txn.TxnUtils#createValidCompactTxnList() for proper * way to construct this. */ public class ValidCompactorTxnList extends ValidReadTxnList { public ValidCompactorTxnList() { super(); } /** * @param abortedTxnList list of all aborted transactions * @param abortedBits bitset marking whether the corresponding transaction is aborted * @param highWatermark highest committed transaction to be considered for compaction, * equivalently (lowest_open_txn - 1). */ public ValidCompactorTxnList(long[] abortedTxnList, BitSet abortedBits, long highWatermark) { super(abortedTxnList, abortedBits, highWatermark); // abortedBits should be all true as everything in exceptions are aborted txns if(this.exceptions.length <= 0) { return; } //now that exceptions (aka abortedTxnList) is sorted int idx = Arrays.binarySearch(this.exceptions, highWatermark); int lastElementPos; if(idx < 0) { int insertionPoint = -idx - 1 ;//see Arrays.binarySearch() JavaDoc lastElementPos = insertionPoint - 1; } else { lastElementPos = idx; } /** * ensure that we throw out any exceptions above highWatermark to make * {@link #isTxnValid(long)} faster */ this.exceptions = Arrays.copyOf(this.exceptions, lastElementPos + 1); } public ValidCompactorTxnList(String value) { super(value); } /** * Returns org.apache.hadoop.hive.common.ValidTxnList.RangeResponse.ALL if all txns in * the range are resolved and RangeResponse.NONE otherwise */ @Override public RangeResponse isTxnRangeValid(long minTxnId, long maxTxnId) { return highWatermark >= maxTxnId ? RangeResponse.ALL : RangeResponse.NONE; } @Override public boolean isTxnAborted(long txnid) { return Arrays.binarySearch(exceptions, txnid) >= 0; } }