Source:
<code>public void startTest(PutGetHelper putGetHelper, int maxParallelPutCount, int parallelGetCount, int totalPutCount, int maxGetCountPerBlob, int burstCountGet, int maxFailuresPerPutBatchToStopPuts, int maxFailuresPerGetBatchToStopGets, boolean deleteAndValidate, long sleepTimeBetweenBatchPutsInMs, long sleepTimeBetweenBatchGetsInMs) throws InterruptedException { AtomicInteger currentPutCount = new AtomicInteger(0); AtomicInteger getCompletedCount = new AtomicInteger(0); AtomicBoolean putComplete = new AtomicBoolean(false); <START> ArrayList<BlobAccessInfo> sharedQueue = new ArrayList<>(); <END> BlockingQueue<String> deletedBlobIds = new LinkedBlockingQueue<>(); final ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current(); Thread putThread = new Thread( new PutThread(putGetHelper, sharedQueue, totalPutCount, currentPutCount, maxParallelPutCount, maxFailuresPerPutBatchToStopPuts, putComplete, sleepTimeBetweenBatchPutsInMs, threadLocalRandom)); Thread getThread = new Thread( new GetThread(putGetHelper, sharedQueue, maxGetCountPerBlob, currentPutCount, getCompletedCount, burstCountGet, parallelGetCount, putComplete, maxFailuresPerGetBatchToStopGets, sleepTimeBetweenBatchGetsInMs, deleteAndValidate, threadLocalRandom, deletedBlobIds)); Thread deleteThread = null; if (deleteAndValidate) { logger.trace("Initiating Delete thread "); DeleteThread deleteBlobThread = new DeleteThread(putGetHelper, totalPutCount, deletedBlobIds); deleteThread = new Thread(deleteBlobThread); deleteThread.start(); } putThread.start(); getThread.start(); putThread.join(); getThread.join(); if (deleteThread != null) { logger.trace("Starting Delete thread "); deleteThread.join(); } logger.trace("Invoking shutdown after completing the test suite "); putGetHelper.shutdown(); }</code><technical_language>1. rename blobIdsAfterPut 2. if I missed anything, this is a concurrent list</technical_language>

Target:
public void startTest(PutGetHelper putGetHelper, int maxParallelPutCount, int parallelGetCount, int totalPutCount, int maxGetCountPerBlob, int burstCountGet, int maxFailuresPerPutBatchToStopPuts, int maxFailuresPerGetBatchToStopGets, boolean deleteAndValidate, long sleepTimeBetweenBatchPutsInMs, long sleepTimeBetweenBatchGetsInMs) throws InterruptedException { AtomicInteger currentPutCount = new AtomicInteger(0); AtomicInteger getCompletedCount = new AtomicInteger(0); CopyOnWriteArrayList<BlobAccessInfo> generatedBlobAccessInfos = new CopyOnWriteArrayList<BlobAccessInfo>(); BlockingQueue<String> deletedBlobIds = new LinkedBlockingQueue<>(); final ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current(); Thread putThread = new Thread( new PutThread(putGetHelper, generatedBlobAccessInfos, totalPutCount, currentPutCount, maxParallelPutCount, maxFailuresPerPutBatchToStopPuts, sleepTimeBetweenBatchPutsInMs, threadLocalRandom)); Thread getThread = new Thread( new GetThread(putGetHelper, generatedBlobAccessInfos, maxGetCountPerBlob, currentPutCount, getCompletedCount, burstCountGet, parallelGetCount, maxFailuresPerGetBatchToStopGets, sleepTimeBetweenBatchGetsInMs, deleteAndValidate, threadLocalRandom, deletedBlobIds)); Thread deleteThread = null; if (deleteAndValidate) { logger.trace("Initiating Delete thread "); DeleteThread deleteBlobThread = new DeleteThread(putGetHelper, totalPutCount, deletedBlobIds); deleteThread = new Thread(deleteBlobThread); deleteThread.start(); } putThread.start(); getThread.start(); putThread.join(); getThread.join(); if (deleteThread != null) { logger.trace("Starting Delete thread "); deleteThread.join(); } logger.trace("Invoking shutdown after completing the test suite "); putGetHelper.shutdown(); }