use of co.cask.cdap.common.collect.AllCollector in project cdap by caskdata.
the class HBaseConsumerStateStore method configureInstances.
@Override
public void configureInstances(long groupId, int instances) {
// Find the last barrier info to get the existing group config
List<QueueBarrier> queueBarriers = scanBarriers(groupId, new AllCollector<QueueBarrier>()).finish(new ArrayList<QueueBarrier>());
Preconditions.checkState(!queueBarriers.isEmpty(), "No queue configuration found for group %s", groupId);
QueueBarrier queueBarrier = queueBarriers.get(queueBarriers.size() - 1);
ConsumerGroupConfig oldGroupConfig = queueBarrier.getGroupConfig();
ConsumerGroupConfig groupConfig = new ConsumerGroupConfig(groupId, instances, oldGroupConfig.getDequeueStrategy(), oldGroupConfig.getHashKey());
byte[] startRow = QueueEntryRow.getQueueEntryRowKey(queueName, transaction.getWritePointer(), 0);
Put put = new Put(Bytes.add(queueName.toBytes(), startRow));
put.add(Bytes.toBytes(groupConfig.getGroupId()), GSON.toJson(groupConfig));
table.put(put);
// For instances that don't have start row, set the start row to barrier start row
// We fetches all instances here for cleanup of barrier info later.
Map<Integer, byte[]> startRows = fetchStartRows(groupId, Integer.MAX_VALUE);
for (int instanceId = 0; instanceId < instances; instanceId++) {
if (!startRows.containsKey(instanceId)) {
table.put(queueName.toBytes(), getConsumerStateColumn(groupId, instanceId), startRow);
}
}
// Remove barrier info that all instances has passed the start row it records
Deque<byte[]> deletes = Lists.newLinkedList();
for (QueueBarrier info : queueBarriers) {
boolean allPassed = true;
for (byte[] instanceStartRow : startRows.values()) {
if (Bytes.compareTo(instanceStartRow, info.getStartRow()) <= 0) {
allPassed = false;
break;
}
}
if (!allPassed) {
break;
}
deletes.add(Bytes.add(queueName.toBytes(), info.getStartRow()));
}
// Retain the last barrier info
if (deletes.size() > 1) {
deletes.removeLast();
byte[] column = Bytes.toBytes(groupId);
for (byte[] delete : deletes) {
table.delete(delete, column);
}
}
}
Aggregations