During a state transfer the entries are sent batched to chunks. However, if all entries are sent in the non-last chunk, the list in entriesBySegment.get(segmentId) is empty. The code for sending last chunks is following: OutboundTransferTask.sendEntries(...) ... if (isLast) { for (int segmentId : segments) { List<InternalCacheEntry> entries = entriesBySegment.get(segmentId); if (entries == null) { chunks.add(new StateChunk(segmentId, InfinispanCollections.<InternalCacheEntry>emptyList(), true)); } } } ... See that the check is entries == null but not entries.isEmpty(). This causes to leave some segments unfinished, never finishing the state transfer.
Mircea Markus <mmarkus> made a comment on jira ISPN-2546 [~rvansa] very good bug description!