void processMissingKeysFromPreviousMetadataResponse(RemoteReplicaInfo remoteReplicaInfo) {
    try {
      ExchangeMetadataResponse exchangeMetadataResponse = remoteReplicaInfo.getExchangeMetadataResponse();
      if (!exchangeMetadataResponse.isEmpty()) {
        Set<MessageInfo> receivedStoreMessagesWithUpdatesPending =
            exchangeMetadataResponse.getReceivedStoreMessagesWithUpdatesPending();
        Set<MessageInfo> receivedMessagesWithUpdatesCompleted = new HashSet<>();

        // 1. Go through messages for this replica whose keys were previously missing in local store and are now received
        // (via other replica threads) and compare the message infos with message infos of keys in local store to apply
        // updates to them (if needed) to reconcile delete, ttl_update and undelete states.
        for (MessageInfo messageInfo : receivedStoreMessagesWithUpdatesPending) {
          BlobId localStoreKey =
              (BlobId) exchangeMetadataResponse.remoteKeyToLocalKeyMap.get(messageInfo.getStoreKey());
          if (localStoreKey != null) {
            applyUpdatesToBlobInLocalStore(messageInfo, remoteReplicaInfo, localStoreKey);
          }
          receivedMessagesWithUpdatesCompleted.add(messageInfo);
        }

        // 2. Remove the messages whose updates have been completed
        exchangeMetadataResponse.removeReceivedStoreMessagesWithUpdatesPending(receivedMessagesWithUpdatesCompleted);

        // 3. If metadata response for this replica is now empty, i.e. all the missing keys are received and blob
        // updates for them have been completed, move the remote token forward and update local lag from remote for this replica.
        if (exchangeMetadataResponse.isEmpty()) {
          advanceToken(remoteReplicaInfo, exchangeMetadataResponse);
        }
      }
    } catch (StoreException e) {
      if (e.getErrorCode() == StoreErrorCodes.StoreNotStarted) {
        logger.info("Local store not started for remote replica: {}", remoteReplicaInfo.getReplicaId());
      } else {
        logger.error("Exception occurred while updating blob from Remote replica {} for partition: {}",
            remoteReplicaInfo.getReplicaId(), remoteReplicaInfo.getReplicaId().getPartitionId().toString(), e);
        replicationMetrics.updateLocalStoreError(remoteReplicaInfo.getReplicaId());
      }
      // reset stored metadata response so that metadata request is sent again for this replica
      remoteReplicaInfo.setExchangeMetadataResponse(new ExchangeMetadataResponse(ServerErrorCode.NoError));
    }
  }
Compare message infos of remote standby replica (whose blobs are now received from leader replicas) with message info
of blobs in local store and reconcile blob properties like ttl_update, delete, undelete. If blobs for all the missing messages
of the standby replica are received and updated, move the remote token of the standby forward.
@param remoteReplicaInfo remote replica information
ambry-replication/src/main/java/com/github/ambry/replication/ReplicaThread.java