code: public void handleMergeView(final MergeData data, final MergeId merge_id) {
          if(!matchMergeId(merge_id)) {
              log.trace("%s: merge_ids (mine: %s, received: %s) don't match; merge view %s is discarded",
                        gms.local_addr, this.merge_id, merge_id, data.view.getViewId());
              return;
          }
  
          // only send to our *current* members, if we have A and B being merged (we are B), then we would *not*
          // want to block on a VIEW_ACK from A because A doesn't see us in the pre-merge view yet and discards the view
          List<Address> expected_acks=gms.members.getMembers();
          try {
              gms.castViewChangeAndSendJoinRsps(data.view, data.digest, expected_acks, null, null);
              // if we have flush in stack send ack back to merge coordinator
              if(gms.flushProtocolInStack) { //[JGRP-700] - FLUSH: flushing should span merge
                  Message ack=new Message(data.getSender()).setFlag(Message.Flag.OOB, Message.Flag.INTERNAL)
                    .putHeader(gms.getId(), new GMS.GmsHeader(GMS.GmsHeader.INSTALL_MERGE_VIEW_OK));
                  gms.getDownProtocol().down(ack);
              }
          }
          finally {
              cancelMerge(merge_id);
          }
      }
docs: If merge_id is not equal to this.merge_id then discard. Else cast the view/digest to all members of this group.