docs: private KeyValuePair<CacheTransaction, Object> waitForTransactionsToComplete(Collection<PendingTransaction> transactionsToCheck,
                                                              long expectedEndTime) throws InterruptedException {
        if (transactionsToCheck.isEmpty()) {
           return null;
        }
        for (PendingTransaction tx : transactionsToCheck) {
           for (Map.Entry<Object, CompletableFuture<Void>> entry : tx.keyReleased.entrySet()) {
              long remaining = timeService.remainingTime(expectedEndTime, TimeUnit.MILLISECONDS);
              //CF.get(time) return TimeoutException when remaining is <= 0.
              if (!CompletableFutures.await(entry.getValue(), remaining, TimeUnit.MILLISECONDS)) {
                 return new KeyValuePair<>(tx.cacheTransaction, entry.getKey());
              }
           }
        }
        return null;
     }