@Override
  public short undeleteBlob(BlobId blobId, short lifeVersion, CloudUpdateValidator cloudUpdateValidator)
      throws CloudStorageException {
    StoreErrorCodes serverError = hardError != null ? hardError : serverErrors.size() > 0 ? serverErrors.poll() : null;
    if (serverError != null) {
      throw new CloudStorageException("undeleteBlob simulated error",
          new StoreException("undeleteBlob simulated error", serverError));
    }

    if (map.containsKey(blobId)) {
      if (!MessageInfo.hasLifeVersion((lifeVersion))) {
        lifeVersion = map.get(blobId).getFirst().getLifeVersion();
        lifeVersion++;
      }
      map.get(blobId).getFirst().setLifeVersion(lifeVersion);
      map.get(blobId).getFirst().setDeletionTime(Utils.Infinite_Time);
      map.get(blobId).getFirst().setLastUpdateTime(System.currentTimeMillis());
      changeFeed.add(blobId);
      return map.get(blobId).getFirst().getLifeVersion();
    } else {
      throw new CloudStorageException(
          String.format("Cannot update lifeversion as blob %s is not found.", blobId.getID()), null,
          CloudBlobStore.STATUS_NOT_FOUND, false, null);
    }
  }
Instantiate {@link LatchBasedInMemoryCloudDestination}.
@param blobIdsToTrack a list of blobs that {@link LatchBasedInMemoryCloudDestination} tracks.
@param azureReplicationFeedType {@link AzureReplicationFeed.FeedType} object.
ambry-vcr/src/test/java/com/github/ambry/vcr/LatchBasedInMemoryCloudDestination.java