| /* |
| * 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.cassandra.db.compaction; |
| |
| import java.util.List; |
| import java.util.concurrent.atomic.AtomicLong; |
| |
| import org.apache.cassandra.utils.CloseableIterator; |
| |
| public abstract class AbstractCompactionIterable extends CompactionInfo.Holder implements Iterable<AbstractCompactedRow> |
| { |
| protected final OperationType type; |
| protected final CompactionController controller; |
| protected final long totalBytes; |
| protected volatile long bytesRead; |
| protected final List<ICompactionScanner> scanners; |
| /* |
| * counters for merged rows. |
| * array index represents (number of merged rows - 1), so index 0 is counter for no merge (1 row), |
| * index 1 is counter for 2 rows merged, and so on. |
| */ |
| protected final AtomicLong[] mergeCounters; |
| |
| public AbstractCompactionIterable(CompactionController controller, OperationType type, List<ICompactionScanner> scanners) |
| { |
| this.controller = controller; |
| this.type = type; |
| this.scanners = scanners; |
| this.bytesRead = 0; |
| |
| long bytes = 0; |
| for (ICompactionScanner scanner : scanners) |
| bytes += scanner.getLengthInBytes(); |
| this.totalBytes = bytes; |
| mergeCounters = new AtomicLong[scanners.size()]; |
| for (int i = 0; i < mergeCounters.length; i++) |
| mergeCounters[i] = new AtomicLong(); |
| } |
| |
| public CompactionInfo getCompactionInfo() |
| { |
| return new CompactionInfo(controller.cfs.metadata, |
| type, |
| bytesRead, |
| totalBytes); |
| } |
| |
| protected void updateCounterFor(int rows) |
| { |
| assert rows > 0 && rows - 1 < mergeCounters.length; |
| mergeCounters[rows - 1].incrementAndGet(); |
| } |
| |
| public long[] getMergedRowCounts() |
| { |
| long[] counters = new long[mergeCounters.length]; |
| for (int i = 0; i < counters.length; i++) |
| counters[i] = mergeCounters[i].get(); |
| return counters; |
| } |
| |
| public abstract CloseableIterator<AbstractCompactedRow> iterator(); |
| } |