Source:
<code>void performRecovery() throws StoreException { try { readCleanupTokenAndPopulateRecoveryRange(); if (hardDeleteRecoveryRange.getSize() == 0) { return; } List<BlobReadOptions> readOptionsList = hardDeleteRecoveryRange.getBlobReadOptionsList(); StoreMessageReadSet readSet = new StoreMessageReadSet(readOptionsList); Iterator<HardDeleteInfo> hardDeleteIterator = hardDelete.getHardDeleteMessages(readSet, factory, hardDeleteRecoveryRange.getMessageStoreRecoveryInfoList()); Iterator<BlobReadOptions> readOptionsIterator = readOptionsList.iterator(); while (hardDeleteIterator.hasNext()) { if (!enabled.get()) { throw new StoreException("Aborting hard deletes as store is shutting down", StoreErrorCodes.Store_Shutting_Down); } HardDeleteInfo hardDeleteInfo = hardDeleteIterator.next(); BlobReadOptions readOptions = readOptionsIterator.next(); if (hardDeleteInfo == null) { metrics.hardDeleteFailedCount.inc(1); } else { LogSegment logSegment = log.getSegment(readOptions.getLogSegmentName()); logSegment.writeFrom(hardDeleteInfo.getHardDeleteChannel(), readOptions.getOffset() + hardDeleteInfo.getStartOffsetInMessage(), hardDeleteInfo.getHardDeletedMessageSize()); metrics.hardDeleteDoneCount.inc(1); } } } catch (IOException e) { metrics.hardDeleteExceptionsCount.inc(); <START> if (e.getClass() == IOException.class && e.getMessage().equals(StoreException.IO_ERROR_STR)) { <END> throw new StoreException("IO exception while performing hard delete ", e, StoreErrorCodes.IOError); } else { throw new StoreException("Exception occurred while performing hard delete ", e, StoreErrorCodes.Unknown_Error); } } startToken = endToken = recoveryEndToken; }</code><technical_language>condition is true (same in other parts of this class)</technical_language>

Target:
void performRecovery() throws StoreException { try { readCleanupTokenAndPopulateRecoveryRange(); if (hardDeleteRecoveryRange.getSize() == 0) { return; } List<BlobReadOptions> readOptionsList = hardDeleteRecoveryRange.getBlobReadOptionsList(); StoreMessageReadSet readSet = new StoreMessageReadSet(readOptionsList); Iterator<HardDeleteInfo> hardDeleteIterator = hardDelete.getHardDeleteMessages(readSet, factory, hardDeleteRecoveryRange.getMessageStoreRecoveryInfoList()); Iterator<BlobReadOptions> readOptionsIterator = readOptionsList.iterator(); while (hardDeleteIterator.hasNext()) { if (!enabled.get()) { throw new StoreException("Aborting hard deletes as store is shutting down", StoreErrorCodes.Store_Shutting_Down); } HardDeleteInfo hardDeleteInfo = hardDeleteIterator.next(); BlobReadOptions readOptions = readOptionsIterator.next(); if (hardDeleteInfo == null) { metrics.hardDeleteFailedCount.inc(1); } else { LogSegment logSegment = log.getSegment(readOptions.getLogSegmentName()); logSegment.writeFrom(hardDeleteInfo.getHardDeleteChannel(), readOptions.getOffset() + hardDeleteInfo.getStartOffsetInMessage(), hardDeleteInfo.getHardDeletedMessageSize()); metrics.hardDeleteDoneCount.inc(1); } } } catch (IOException e) { metrics.hardDeleteExceptionsCount.inc(); StoreErrorCodes errorCode = e.getMessage().equals(StoreException.IO_ERROR_STR) ? StoreErrorCodes.IOError : StoreErrorCodes.Unknown_Error; throw new StoreException(errorCode.toString() + " occurred while performing hard delete ", e, errorCode); } startToken = endToken = recoveryEndToken; }