BlockingQueue<BBContainer> compressionBufferQueue =
m_bufferPool.getQueue(SnapshotSiteProcessor.m_snapshotBufferCompressedLen);
try {
while (true) {
BBContainer container = null;
BBContainer compressionBufferC = null;
ByteBuffer compressionBuffer = null;
boolean success = false;
try {
VoltMessage msg = m_mb.recvBlocking();
if (msg == null) {
// If interrupted, break
break;
}
assert(msg instanceof RejoinDataMessage);
RejoinDataMessage dataMsg = (RejoinDataMessage) msg;
byte[] data = dataMsg.getData();
// Only grab the buffer from the pool after receiving a message from the
// mailbox. If the buffer is grabbed before receiving the message,
// this thread could hold on to a buffer it may not need and other receivers
// will be blocked if the pool has no more buffers left.
container = bufferQueue.take();
ByteBuffer messageBuffer = container.b();
messageBuffer.clear();
compressionBufferC = compressionBufferQueue.take();
compressionBuffer = compressionBufferC.b();
compressionBuffer.clear();
compressionBuffer.limit(data.length);
compressionBuffer.put(data);
compressionBuffer.flip();
int uncompressedSize =
CompressionService.decompressBuffer(
compressionBuffer,
messageBuffer);
messageBuffer.limit(uncompressedSize);
m_queue.offer(Pair.of(dataMsg.m_sourceHSId, Pair.of(dataMsg.getTargetId(), container)));
success = true;
} finally {
if (!success && container != null) {
container.discard();
}
if (compressionBuffer != null) {
compressionBufferC.discard();
}
}
}
} catch (IOException e) {
/*