You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ds...@apache.org on 2017/11/13 21:21:04 UTC

[geode] branch feature/GEODE-3940 updated: refactored operation code for Prepare and Finish into a common BackupOperation abstract class. Implemented new classes for the FinishBackup operation.

This is an automated email from the ASF dual-hosted git repository.

dschneider pushed a commit to branch feature/GEODE-3940
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/feature/GEODE-3940 by this push:
     new cbebe49  refactored operation code for Prepare and Finish into a common BackupOperation abstract class. Implemented new classes for the FinishBackup operation.
cbebe49 is described below

commit cbebe491420cba0940e70c64caf1e347661c9ad8
Author: Darrel Schneider <ds...@pivotal.io>
AuthorDate: Mon Nov 13 13:19:45 2017 -0800

    refactored operation code for Prepare and Finish into a common BackupOperation abstract class.
    Implemented new classes for the FinishBackup operation.
---
 .../org/apache/geode/internal/DSFIDFactory.java    |  11 +-
 .../geode/internal/DataSerializableFixedID.java    |   2 +-
 .../cache/backup/BackupDataStoreHelper.java        |   4 +-
 ...reBackupOperation.java => BackupOperation.java} |  44 +++---
 ...plyProcessor.java => BackupReplyProcessor.java} |  22 ++-
 ...pareBackupResponse.java => BackupResponse.java} |  11 +-
 ...ltCollector.java => BackupResultCollector.java} |   2 +-
 ...ackupResultCollector.java => FinishBackup.java} |  31 +++-
 ...BackupFactory.java => FinishBackupFactory.java} |  26 ++--
 .../cache/backup/FinishBackupOperation.java        |  75 ++++++++++
 .../cache/backup/FinishBackupReplyProcessor.java   |  70 ---------
 .../internal/cache/backup/FinishBackupRequest.java |  77 ++--------
 .../cache/backup/FinishBackupResponse.java         |  74 ----------
 .../cache/backup/PrepareBackupFactory.java         |  10 +-
 .../cache/backup/PrepareBackupOperation.java       |  55 ++------
 .../cache/backup/PrepareBackupRequest.java         |   2 +-
 .../backup/BackupPrepareAndFinishMsgDUnitTest.java |   6 +-
 ...ssorTest.java => BackupReplyProcessorTest.java} |  34 ++---
 ...ctoryTest.java => FinishBackupFactoryTest.java} |  36 ++---
 ...ionTest.java => FinishBackupOperationTest.java} | 116 +++++++--------
 .../cache/backup/FinishBackupRequestTest.java      | 156 ++++-----------------
 .../cache/backup/PrepareBackupFactoryTest.java     |  14 +-
 .../cache/backup/PrepareBackupOperationTest.java   |   4 +-
 .../cache/backup/PrepareBackupRequestTest.java     |  13 +-
 24 files changed, 343 insertions(+), 552 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java b/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java
index 3abcf0f..c02be89 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/DSFIDFactory.java
@@ -275,12 +275,11 @@ import org.apache.geode.internal.cache.UpdateAttributesProcessor;
 import org.apache.geode.internal.cache.UpdateEntryVersionOperation.UpdateEntryVersionMessage;
 import org.apache.geode.internal.cache.UpdateOperation;
 import org.apache.geode.internal.cache.VMCachedDeserializable;
+import org.apache.geode.internal.cache.backup.BackupResponse;
 import org.apache.geode.internal.cache.backup.FinishBackupRequest;
-import org.apache.geode.internal.cache.backup.FinishBackupResponse;
 import org.apache.geode.internal.cache.backup.FlushToDiskRequest;
 import org.apache.geode.internal.cache.backup.FlushToDiskResponse;
 import org.apache.geode.internal.cache.backup.PrepareBackupRequest;
-import org.apache.geode.internal.cache.backup.PrepareBackupResponse;
 import org.apache.geode.internal.cache.compression.SnappyCompressedCachedDeserializable;
 import org.apache.geode.internal.cache.control.ResourceAdvisor.ResourceManagerProfile;
 import org.apache.geode.internal.cache.control.ResourceAdvisor.ResourceProfileMessage;
@@ -874,9 +873,13 @@ public class DSFIDFactory implements DataSerializableFixedID {
     registerDSFID(CLIENT_MEMBERSHIP_MESSAGE, ClientMembershipMessage.class);
     registerDSFID(END_BUCKET_CREATION_MESSAGE, EndBucketCreationMessage.class);
     registerDSFID(PREPARE_BACKUP_REQUEST, PrepareBackupRequest.class);
-    registerDSFID(PREPARE_BACKUP_RESPONSE, PrepareBackupResponse.class);
+    registerDSFID(BACKUP_RESPONSE, BackupResponse.class); // in older versions this was
+                                                          // FinishBackupResponse which is
+                                                          // compatible
     registerDSFID(FINISH_BACKUP_REQUEST, FinishBackupRequest.class);
-    registerDSFID(FINISH_BACKUP_RESPONSE, FinishBackupResponse.class);
+    registerDSFID(FINISH_BACKUP_RESPONSE, BackupResponse.class); // for backwards compatibility map
+                                                                 // FINISH_BACKUP_RESPONSE to
+                                                                 // BackupResponse
     registerDSFID(COMPACT_REQUEST, CompactRequest.class);
     registerDSFID(COMPACT_RESPONSE, CompactResponse.class);
     registerDSFID(FLOW_CONTROL_PERMIT_MESSAGE, FlowControlPermitMessage.class);
diff --git a/geode-core/src/main/java/org/apache/geode/internal/DataSerializableFixedID.java b/geode-core/src/main/java/org/apache/geode/internal/DataSerializableFixedID.java
index e7a319e..d81f067 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/DataSerializableFixedID.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/DataSerializableFixedID.java
@@ -727,7 +727,7 @@ public interface DataSerializableFixedID extends SerializationVersions {
   public static final short FINISH_BACKUP_REQUEST = 2114;
   public static final short FINISH_BACKUP_RESPONSE = 2115;
   public static final short PREPARE_BACKUP_REQUEST = 2116;
-  public static final short PREPARE_BACKUP_RESPONSE = 2117;
+  public static final short BACKUP_RESPONSE = 2117;
   public static final short COMPACT_REQUEST = 2118;
   public static final short COMPACT_RESPONSE = 2119;
   public static final short FLOW_CONTROL_PERMIT_MESSAGE = 2120;
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupDataStoreHelper.java b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupDataStoreHelper.java
index bf6cd1f..455111d 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupDataStoreHelper.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupDataStoreHelper.java
@@ -30,6 +30,7 @@ public class BackupDataStoreHelper {
   private static final String LOCK_NAME = LOCK_SERVICE_NAME + "_token";
   private static final Object LOCK_SYNC = new Object();
   private static final PrepareBackupFactory prepareBackupFactory = new PrepareBackupFactory();
+  private static final FinishBackupFactory finishBackupFactory = new FinishBackupFactory();
 
   @SuppressWarnings("rawtypes")
   public static BackupDataStoreResult backupAllMembers(DM dm, Set recipients, File targetDir,
@@ -44,7 +45,8 @@ public class BackupDataStoreHelper {
           prepareBackupFactory).send();
       abort = false;
     } finally {
-      successfulMembers = FinishBackupRequest.send(dm, recipients, targetDir, baselineDir, abort);
+      successfulMembers = new FinishBackupOperation(dm, dm.getId(), dm.getCache(), recipients,
+          targetDir, baselineDir, abort, finishBackupFactory).send();
     }
     return new BackupDataStoreResult(existingDataStores, successfulMembers);
   }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupOperation.java b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupOperation.java
similarity index 65%
copy from geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupOperation.java
copy to geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupOperation.java
index 9ebedb8..dc5f77b 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupOperation.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupOperation.java
@@ -14,7 +14,6 @@
  */
 package org.apache.geode.internal.cache.backup;
 
-import java.io.IOException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -26,39 +25,33 @@ import org.apache.geode.CancelException;
 import org.apache.geode.cache.persistence.PersistentID;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.DM;
+import org.apache.geode.distributed.internal.DistributionMessage;
 import org.apache.geode.distributed.internal.ReplyException;
+import org.apache.geode.distributed.internal.ReplyProcessor21;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
-import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.logging.LogService;
 
-class PrepareBackupOperation implements PrepareBackupResultCollector {
+abstract class BackupOperation implements BackupResultCollector {
   private static final Logger logger = LogService.getLogger();
 
   private final DM dm;
-  private final InternalDistributedMember member;
-  private final InternalCache cache;
-  private final Set<InternalDistributedMember> recipients;
-  private final PrepareBackupFactory prepareBackupFactory;
-
   private final Map<DistributedMember, Set<PersistentID>> results =
       Collections.synchronizedMap(new HashMap<DistributedMember, Set<PersistentID>>());
 
-  PrepareBackupOperation(DM dm, InternalDistributedMember member, InternalCache cache,
-      Set<InternalDistributedMember> recipients, PrepareBackupFactory prepareBackupFactory) {
+  protected BackupOperation(DM dm) {
     this.dm = dm;
-    this.member = member;
-    this.cache = cache;
-    this.recipients = recipients;
-    this.prepareBackupFactory = prepareBackupFactory;
   }
 
+  abstract ReplyProcessor21 createReplyProcessor();
+
+  abstract DistributionMessage createDistributionMessage(ReplyProcessor21 replyProcessor);
+
+  abstract void processLocally();
+
   Map<DistributedMember, Set<PersistentID>> send() {
-    PrepareBackupReplyProcessor replyProcessor =
-        prepareBackupFactory.createReplyProcessor(this, dm, recipients);
-    PrepareBackupRequest request =
-        prepareBackupFactory.createRequest(member, recipients, replyProcessor.getProcessorId());
+    ReplyProcessor21 replyProcessor = createReplyProcessor();
 
-    dm.putOutgoing(request);
+    dm.putOutgoing(createDistributionMessage(replyProcessor));
 
     processLocally();
 
@@ -72,7 +65,7 @@ class PrepareBackupOperation implements PrepareBackupResultCollector {
       logger.warn(e.getMessage(), e);
     }
 
-    return results;
+    return getResults();
   }
 
   @Override
@@ -82,16 +75,11 @@ class PrepareBackupOperation implements PrepareBackupResultCollector {
     }
   }
 
-  private void processLocally() {
-    try {
-      addToResults(member, prepareBackupFactory.createPrepareBackup(member, cache).run());
-    } catch (IOException e) {
-      logger.fatal("Failed to PrepareBackup in " + member, e);
-    }
-  }
-
   Map<DistributedMember, Set<PersistentID>> getResults() {
     return this.results;
   }
 
+  protected DM getDistributionManager() {
+    return this.dm;
+  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupReplyProcessor.java b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupReplyProcessor.java
similarity index 73%
rename from geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupReplyProcessor.java
rename to geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupReplyProcessor.java
index 6f2a767..c42bfcc 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupReplyProcessor.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupReplyProcessor.java
@@ -21,11 +21,11 @@ import org.apache.geode.distributed.internal.DistributionMessage;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.internal.admin.remote.AdminMultipleReplyProcessor;
 
-class PrepareBackupReplyProcessor extends AdminMultipleReplyProcessor {
+class BackupReplyProcessor extends AdminMultipleReplyProcessor {
 
-  private final PrepareBackupResultCollector resultCollector;
+  private final BackupResultCollector resultCollector;
 
-  PrepareBackupReplyProcessor(PrepareBackupResultCollector resultCollector, DM dm,
+  BackupReplyProcessor(BackupResultCollector resultCollector, DM dm,
       Set<InternalDistributedMember> recipients) {
     super(dm, recipients);
     this.resultCollector = resultCollector;
@@ -37,9 +37,21 @@ class PrepareBackupReplyProcessor extends AdminMultipleReplyProcessor {
   }
 
   @Override
+  protected int getAckWaitThreshold() {
+    // Disable the 15 second warning if the backup is taking a long time
+    return 0;
+  }
+
+  @Override
+  public long getAckSevereAlertThresholdMS() {
+    // Don't log severe alerts for backups either
+    return Long.MAX_VALUE;
+  }
+
+  @Override
   protected void process(DistributionMessage message, boolean warn) {
-    if (message instanceof PrepareBackupResponse) {
-      PrepareBackupResponse response = (PrepareBackupResponse) message;
+    if (message instanceof BackupResponse) {
+      BackupResponse response = (BackupResponse) message;
       resultCollector.addToResults(response.getSender(), response.getPersistentIds());
     }
     super.process(message, warn);
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupResponse.java b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupResponse.java
similarity index 86%
rename from geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupResponse.java
rename to geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupResponse.java
index b547f11..9f9243e 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupResponse.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupResponse.java
@@ -26,18 +26,17 @@ import org.apache.geode.distributed.internal.membership.InternalDistributedMembe
 import org.apache.geode.internal.admin.remote.AdminResponse;
 
 /**
- * The response to the {@link PrepareBackupRequest}
+ * The response to a {@link PrepareBackupRequest} or {@link FinishBackupRequest}.
  */
-public class PrepareBackupResponse extends AdminResponse {
+public class BackupResponse extends AdminResponse {
 
   private HashSet<PersistentID> persistentIds;
 
-  public PrepareBackupResponse() {
+  public BackupResponse() {
     super();
   }
 
-  public PrepareBackupResponse(InternalDistributedMember sender,
-      HashSet<PersistentID> persistentIds) {
+  public BackupResponse(InternalDistributedMember sender, HashSet<PersistentID> persistentIds) {
     setRecipient(sender);
     this.persistentIds = persistentIds;
   }
@@ -60,7 +59,7 @@ public class PrepareBackupResponse extends AdminResponse {
 
   @Override
   public int getDSFID() {
-    return PREPARE_BACKUP_RESPONSE;
+    return BACKUP_RESPONSE;
   }
 
   @Override
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupResultCollector.java b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupResultCollector.java
similarity index 96%
copy from geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupResultCollector.java
copy to geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupResultCollector.java
index df74780..d4ab322 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupResultCollector.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupResultCollector.java
@@ -19,6 +19,6 @@ import java.util.Set;
 import org.apache.geode.cache.persistence.PersistentID;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 
-interface PrepareBackupResultCollector {
+interface BackupResultCollector {
   void addToResults(InternalDistributedMember member, Set<PersistentID> persistentIds);
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupResultCollector.java b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackup.java
similarity index 52%
rename from geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupResultCollector.java
rename to geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackup.java
index df74780..f9d5813 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupResultCollector.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackup.java
@@ -14,11 +14,34 @@
  */
 package org.apache.geode.internal.cache.backup;
 
-import java.util.Set;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashSet;
 
 import org.apache.geode.cache.persistence.PersistentID;
-import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
+import org.apache.geode.internal.cache.InternalCache;
 
-interface PrepareBackupResultCollector {
-  void addToResults(InternalDistributedMember member, Set<PersistentID> persistentIds);
+class FinishBackup {
+
+  private final InternalCache cache;
+  private final File targetDir;
+  private final File baselineDir;
+  private final boolean abort;
+
+  FinishBackup(InternalCache cache, File targetDir, File baselineDir, boolean abort) {
+    this.cache = cache;
+    this.targetDir = targetDir;
+    this.baselineDir = baselineDir;
+    this.abort = abort;
+  }
+
+  HashSet<PersistentID> run() throws IOException {
+    HashSet<PersistentID> persistentIds;
+    if (cache == null || cache.getBackupManager() == null) {
+      persistentIds = new HashSet<>();
+    } else {
+      persistentIds = cache.getBackupManager().doBackup(targetDir, baselineDir, abort);
+    }
+    return persistentIds;
+  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupFactory.java b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupFactory.java
similarity index 60%
copy from geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupFactory.java
copy to geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupFactory.java
index 7b9c32e..b4b40d9 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupFactory.java
@@ -14,6 +14,7 @@
  */
 package org.apache.geode.internal.cache.backup;
 
+import java.io.File;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -22,24 +23,27 @@ import org.apache.geode.distributed.internal.DM;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.internal.cache.InternalCache;
 
-class PrepareBackupFactory {
+class FinishBackupFactory {
 
-  PrepareBackupReplyProcessor createReplyProcessor(PrepareBackupResultCollector resultCollector,
-      DM dm, Set<InternalDistributedMember> recipients) {
-    return new PrepareBackupReplyProcessor(resultCollector, dm, recipients);
+  BackupReplyProcessor createReplyProcessor(BackupResultCollector resultCollector, DM dm,
+      Set<InternalDistributedMember> recipients) {
+    return new BackupReplyProcessor(resultCollector, dm, recipients);
   }
 
-  PrepareBackupRequest createRequest(InternalDistributedMember sender,
-      Set<InternalDistributedMember> recipients, int processorId) {
-    return new PrepareBackupRequest(sender, recipients, processorId, this);
+  FinishBackupRequest createRequest(InternalDistributedMember sender,
+      Set<InternalDistributedMember> recipients, int processorId, File targetDir, File baselineDir,
+      boolean abort) {
+    return new FinishBackupRequest(sender, recipients, processorId, targetDir, baselineDir, abort,
+        this);
   }
 
-  PrepareBackup createPrepareBackup(InternalDistributedMember member, InternalCache cache) {
-    return new PrepareBackup(member, cache);
+  FinishBackup createFinishBackup(InternalCache cache, File targetDir, File baselineDir,
+      boolean abort) {
+    return new FinishBackup(cache, targetDir, baselineDir, abort);
   }
 
-  PrepareBackupResponse createPrepareBackupResponse(InternalDistributedMember sender,
+  BackupResponse createBackupResponse(InternalDistributedMember sender,
       HashSet<PersistentID> persistentIds) {
-    return new PrepareBackupResponse(sender, persistentIds);
+    return new BackupResponse(sender, persistentIds);
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupOperation.java b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupOperation.java
new file mode 100644
index 0000000..468dba8
--- /dev/null
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupOperation.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.geode.internal.cache.backup;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Set;
+
+import org.apache.logging.log4j.Logger;
+
+import org.apache.geode.distributed.internal.DM;
+import org.apache.geode.distributed.internal.DistributionMessage;
+import org.apache.geode.distributed.internal.ReplyProcessor21;
+import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
+import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.internal.logging.LogService;
+
+class FinishBackupOperation extends BackupOperation {
+  private static final Logger logger = LogService.getLogger();
+
+  private final InternalDistributedMember member;
+  private final InternalCache cache;
+  private final Set<InternalDistributedMember> recipients;
+  private final File targetDir;
+  private final File baselineDir;
+  private final boolean abort;
+  private final FinishBackupFactory finishBackupFactory;
+
+  FinishBackupOperation(DM dm, InternalDistributedMember member, InternalCache cache,
+      Set<InternalDistributedMember> recipients, File targetDir, File baselineDir, boolean abort,
+      FinishBackupFactory FinishBackupFactory) {
+    super(dm);
+    this.member = member;
+    this.cache = cache;
+    this.recipients = recipients;
+    this.targetDir = targetDir;
+    this.baselineDir = baselineDir;
+    this.abort = abort;
+    this.finishBackupFactory = FinishBackupFactory;
+  }
+
+  @Override
+  ReplyProcessor21 createReplyProcessor() {
+    return finishBackupFactory.createReplyProcessor(this, getDistributionManager(), recipients);
+  }
+
+  @Override
+  DistributionMessage createDistributionMessage(ReplyProcessor21 replyProcessor) {
+    return finishBackupFactory.createRequest(member, recipients, replyProcessor.getProcessorId(),
+        targetDir, baselineDir, abort);
+  }
+
+  @Override
+  void processLocally() {
+    try {
+      addToResults(member,
+          finishBackupFactory.createFinishBackup(cache, targetDir, baselineDir, abort).run());
+    } catch (IOException e) {
+      logger.fatal("Failed to FinishBackup in " + member, e);
+    }
+  }
+
+}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupReplyProcessor.java b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupReplyProcessor.java
deleted file mode 100644
index 72d621e..0000000
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupReplyProcessor.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-package org.apache.geode.internal.cache.backup;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.geode.cache.persistence.PersistentID;
-import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.distributed.internal.DM;
-import org.apache.geode.distributed.internal.DistributionMessage;
-import org.apache.geode.internal.admin.remote.AdminMultipleReplyProcessor;
-
-class FinishBackupReplyProcessor extends AdminMultipleReplyProcessor {
-
-  private final Map<DistributedMember, Set<PersistentID>> results =
-      Collections.synchronizedMap(new HashMap<DistributedMember, Set<PersistentID>>());
-
-  FinishBackupReplyProcessor(DM dm, Collection initMembers) {
-    super(dm, initMembers);
-  }
-
-  @Override
-  protected boolean stopBecauseOfExceptions() {
-    return false;
-  }
-
-  @Override
-  protected int getAckWaitThreshold() {
-    // Disable the 15 second warning if the backup is taking a long time
-    return 0;
-  }
-
-  @Override
-  public long getAckSevereAlertThresholdMS() {
-    // Don't log severe alerts for backups either
-    return Long.MAX_VALUE;
-  }
-
-  @Override
-  protected void process(DistributionMessage message, boolean warn) {
-    if (message instanceof FinishBackupResponse) {
-      HashSet<PersistentID> persistentIds = ((FinishBackupResponse) message).getPersistentIds();
-      if (persistentIds != null && !persistentIds.isEmpty()) {
-        results.put(message.getSender(), persistentIds);
-      }
-    }
-    super.process(message, warn);
-  }
-
-  Map<DistributedMember, Set<PersistentID>> getResults() {
-    return results;
-  }
-}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupRequest.java b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupRequest.java
index 1cec313..32cc12a 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupRequest.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupRequest.java
@@ -19,22 +19,17 @@ import java.io.DataOutput;
 import java.io.File;
 import java.io.IOException;
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Set;
 
 import org.apache.logging.log4j.Logger;
 
-import org.apache.geode.CancelException;
 import org.apache.geode.DataSerializer;
 import org.apache.geode.cache.persistence.PersistentID;
-import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.DM;
-import org.apache.geode.distributed.internal.ReplyException;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.internal.admin.remote.AdminFailureResponse;
 import org.apache.geode.internal.admin.remote.AdminResponse;
 import org.apache.geode.internal.admin.remote.CliLegacyMessage;
-import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.i18n.LocalizedStrings;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.internal.logging.log4j.LocalizedMessage;
@@ -46,85 +41,39 @@ import org.apache.geode.internal.logging.log4j.LocalizedMessage;
 public class FinishBackupRequest extends CliLegacyMessage {
   private static final Logger logger = LogService.getLogger();
 
-  private final DM dm;
-  private final FinishBackupReplyProcessor replyProcessor;
+  private final transient FinishBackupFactory finishBackupFactory;
+
   private File targetDir;
   private File baselineDir;
   private boolean abort;
 
   public FinishBackupRequest() {
-    super();
-    this.dm = null;
-    this.replyProcessor = null;
-  }
-
-  private FinishBackupRequest(DM dm, Set<InternalDistributedMember> recipients, File targetDir,
-      File baselineDir, boolean abort) {
-    this(dm, recipients, new FinishBackupReplyProcessor(dm, recipients), targetDir, baselineDir,
-        abort);
+    this.finishBackupFactory = new FinishBackupFactory();
   }
 
-  FinishBackupRequest(DM dm, Set<InternalDistributedMember> recipients,
-      FinishBackupReplyProcessor replyProcessor, File targetDir, File baselineDir, boolean abort) {
-    this.dm = dm;
+  FinishBackupRequest(InternalDistributedMember sender, Set<InternalDistributedMember> recipients,
+      int processorId, File targetDir, File baselineDir, boolean abort,
+      FinishBackupFactory finishBackupFactory) {
+    setSender(sender);
+    setRecipients(recipients);
+    this.msgId = processorId;
+    this.finishBackupFactory = finishBackupFactory;
     this.targetDir = targetDir;
     this.baselineDir = baselineDir;
     this.abort = abort;
-    setRecipients(recipients);
-    this.replyProcessor = replyProcessor;
-    this.msgId = this.replyProcessor.getProcessorId();
-  }
-
-  public static Map<DistributedMember, Set<PersistentID>> send(DM dm, Set recipients,
-      File targetDir, File baselineDir, boolean abort) {
-    FinishBackupRequest request =
-        new FinishBackupRequest(dm, recipients, targetDir, baselineDir, abort);
-    return request.send();
-  }
-
-  Map<DistributedMember, Set<PersistentID>> send() {
-    dm.putOutgoing(this);
-
-    // invokes doBackup and releases BackupLock
-    AdminResponse response = createResponse(dm);
-
-    try {
-      replyProcessor.waitForReplies();
-    } catch (ReplyException e) {
-      if (!(e.getCause() instanceof CancelException)) {
-        throw e;
-      }
-    } catch (InterruptedException e) {
-      logger.warn(e.getMessage(), e);
-    }
-
-    // adding local member to the results
-    response.setSender(dm.getDistributionManagerId());
-    replyProcessor.process(response, false);
-    return replyProcessor.getResults();
   }
 
   @Override
   protected AdminResponse createResponse(DM dm) {
     HashSet<PersistentID> persistentIds;
     try {
-      persistentIds = doBackup(dm);
+      persistentIds = finishBackupFactory
+          .createFinishBackup(dm.getCache(), this.targetDir, this.baselineDir, this.abort).run();
     } catch (IOException e) {
       logger.error(LocalizedMessage.create(LocalizedStrings.CliLegacyMessage_ERROR, getClass()), e);
       return AdminFailureResponse.create(getSender(), e);
     }
-    return new FinishBackupResponse(getSender(), persistentIds);
-  }
-
-  private HashSet<PersistentID> doBackup(DM dm) throws IOException {
-    InternalCache cache = dm.getCache();
-    HashSet<PersistentID> persistentIds;
-    if (cache == null || cache.getBackupManager() == null) {
-      persistentIds = new HashSet<>();
-    } else {
-      persistentIds = cache.getBackupManager().doBackup(targetDir, baselineDir, abort);
-    }
-    return persistentIds;
+    return finishBackupFactory.createBackupResponse(getSender(), persistentIds);
   }
 
   @Override
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupResponse.java b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupResponse.java
deleted file mode 100644
index 03fd471..0000000
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/FinishBackupResponse.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-package org.apache.geode.internal.cache.backup;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.util.HashSet;
-
-import org.apache.geode.DataSerializer;
-import org.apache.geode.cache.persistence.PersistentID;
-import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
-import org.apache.geode.internal.admin.remote.AdminResponse;
-
-/**
- * The reply for a {@link FinishBackupRequest}. The reply contains the persistent ids of the disk
- * stores that were backed up on this member.
- */
-public class FinishBackupResponse extends AdminResponse {
-
-  private HashSet<PersistentID> persistentIds;
-
-  public FinishBackupResponse() {
-    super();
-  }
-
-  public FinishBackupResponse(InternalDistributedMember sender,
-      HashSet<PersistentID> persistentIds) {
-    this.setRecipient(sender);
-    this.persistentIds = persistentIds;
-  }
-
-  public HashSet<PersistentID> getPersistentIds() {
-    return persistentIds;
-  }
-
-  @Override
-  public void fromData(DataInput in) throws IOException, ClassNotFoundException {
-    super.fromData(in);
-    persistentIds = DataSerializer.readHashSet(in);
-  }
-
-  @Override
-  public void toData(DataOutput out) throws IOException {
-    super.toData(out);
-    DataSerializer.writeHashSet(persistentIds, out);
-  }
-
-  @Override
-  protected Object clone() throws CloneNotSupportedException {
-    return super.clone();
-  }
-
-  public int getDSFID() {
-    return FINISH_BACKUP_RESPONSE;
-  }
-
-  @Override
-  public String toString() {
-    return getClass().getName() + ": " + persistentIds;
-  }
-}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupFactory.java b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupFactory.java
index 7b9c32e..eebc439 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupFactory.java
@@ -24,9 +24,9 @@ import org.apache.geode.internal.cache.InternalCache;
 
 class PrepareBackupFactory {
 
-  PrepareBackupReplyProcessor createReplyProcessor(PrepareBackupResultCollector resultCollector,
-      DM dm, Set<InternalDistributedMember> recipients) {
-    return new PrepareBackupReplyProcessor(resultCollector, dm, recipients);
+  BackupReplyProcessor createReplyProcessor(BackupResultCollector resultCollector, DM dm,
+      Set<InternalDistributedMember> recipients) {
+    return new BackupReplyProcessor(resultCollector, dm, recipients);
   }
 
   PrepareBackupRequest createRequest(InternalDistributedMember sender,
@@ -38,8 +38,8 @@ class PrepareBackupFactory {
     return new PrepareBackup(member, cache);
   }
 
-  PrepareBackupResponse createPrepareBackupResponse(InternalDistributedMember sender,
+  BackupResponse createBackupResponse(InternalDistributedMember sender,
       HashSet<PersistentID> persistentIds) {
-    return new PrepareBackupResponse(sender, persistentIds);
+    return new BackupResponse(sender, persistentIds);
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupOperation.java b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupOperation.java
index 9ebedb8..b9d377c 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupOperation.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupOperation.java
@@ -15,83 +15,50 @@
 package org.apache.geode.internal.cache.backup;
 
 import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Set;
 
 import org.apache.logging.log4j.Logger;
 
-import org.apache.geode.CancelException;
-import org.apache.geode.cache.persistence.PersistentID;
-import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.DM;
-import org.apache.geode.distributed.internal.ReplyException;
+import org.apache.geode.distributed.internal.DistributionMessage;
+import org.apache.geode.distributed.internal.ReplyProcessor21;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.logging.LogService;
 
-class PrepareBackupOperation implements PrepareBackupResultCollector {
+class PrepareBackupOperation extends BackupOperation {
   private static final Logger logger = LogService.getLogger();
 
-  private final DM dm;
   private final InternalDistributedMember member;
   private final InternalCache cache;
   private final Set<InternalDistributedMember> recipients;
   private final PrepareBackupFactory prepareBackupFactory;
 
-  private final Map<DistributedMember, Set<PersistentID>> results =
-      Collections.synchronizedMap(new HashMap<DistributedMember, Set<PersistentID>>());
-
   PrepareBackupOperation(DM dm, InternalDistributedMember member, InternalCache cache,
       Set<InternalDistributedMember> recipients, PrepareBackupFactory prepareBackupFactory) {
-    this.dm = dm;
+    super(dm);
     this.member = member;
     this.cache = cache;
     this.recipients = recipients;
     this.prepareBackupFactory = prepareBackupFactory;
   }
 
-  Map<DistributedMember, Set<PersistentID>> send() {
-    PrepareBackupReplyProcessor replyProcessor =
-        prepareBackupFactory.createReplyProcessor(this, dm, recipients);
-    PrepareBackupRequest request =
-        prepareBackupFactory.createRequest(member, recipients, replyProcessor.getProcessorId());
-
-    dm.putOutgoing(request);
-
-    processLocally();
-
-    try {
-      replyProcessor.waitForReplies();
-    } catch (ReplyException e) {
-      if (!(e.getCause() instanceof CancelException)) {
-        throw e;
-      }
-    } catch (InterruptedException e) {
-      logger.warn(e.getMessage(), e);
-    }
-
-    return results;
+  @Override
+  ReplyProcessor21 createReplyProcessor() {
+    return prepareBackupFactory.createReplyProcessor(this, getDistributionManager(), recipients);
   }
 
   @Override
-  public void addToResults(InternalDistributedMember member, Set<PersistentID> persistentIds) {
-    if (persistentIds != null && !persistentIds.isEmpty()) {
-      results.put(member, persistentIds);
-    }
+  DistributionMessage createDistributionMessage(ReplyProcessor21 replyProcessor) {
+    return prepareBackupFactory.createRequest(member, recipients, replyProcessor.getProcessorId());
   }
 
-  private void processLocally() {
+  @Override
+  void processLocally() {
     try {
       addToResults(member, prepareBackupFactory.createPrepareBackup(member, cache).run());
     } catch (IOException e) {
       logger.fatal("Failed to PrepareBackup in " + member, e);
     }
   }
-
-  Map<DistributedMember, Set<PersistentID>> getResults() {
-    return this.results;
-  }
-
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupRequest.java b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupRequest.java
index 23bcd6c..ccbf1d1 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupRequest.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/backup/PrepareBackupRequest.java
@@ -62,7 +62,7 @@ public class PrepareBackupRequest extends CliLegacyMessage {
       logger.error(LocalizedMessage.create(LocalizedStrings.CliLegacyMessage_ERROR, getClass()), e);
       return AdminFailureResponse.create(getSender(), e);
     }
-    return prepareBackupFactory.createPrepareBackupResponse(getSender(), persistentIds);
+    return prepareBackupFactory.createBackupResponse(getSender(), persistentIds);
   }
 
   @Override
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/BackupPrepareAndFinishMsgDUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/BackupPrepareAndFinishMsgDUnitTest.java
index 3469ea4..f48f7f3 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/BackupPrepareAndFinishMsgDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/BackupPrepareAndFinishMsgDUnitTest.java
@@ -143,7 +143,8 @@ public abstract class BackupPrepareAndFinishMsgDUnitTest extends CacheTestCase {
     future = CompletableFuture.runAsync(function);
     Awaitility.await().atMost(5, TimeUnit.SECONDS)
         .until(() -> assertTrue(waitingForBackupLockCount == 1));
-    FinishBackupRequest.send(dm, recipients, diskDirs[0], null, false);
+    new FinishBackupOperation(dm, dm.getId(), dm.getCache(), recipients, diskDirs[0], null, false,
+        new FinishBackupFactory()).send();
     future.get(5, TimeUnit.SECONDS);
   }
 
@@ -156,7 +157,8 @@ public abstract class BackupPrepareAndFinishMsgDUnitTest extends CacheTestCase {
     List<CompletableFuture<?>> futureList = doReadActions();
     CompletableFuture.allOf(futureList.toArray(new CompletableFuture<?>[futureList.size()]));
     assertTrue(waitingForBackupLockCount == 0);
-    FinishBackupRequest.send(dm, recipients, diskDirs[0], null, false);
+    new FinishBackupOperation(dm, dm.getId(), dm.getCache(), recipients, diskDirs[0], null, false,
+        new FinishBackupFactory()).send();
   }
 
   private void verifyKeyValuePair(Integer key, Integer expectedValue) {
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupReplyProcessorTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/BackupReplyProcessorTest.java
similarity index 66%
rename from geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupReplyProcessorTest.java
rename to geode-core/src/test/java/org/apache/geode/internal/cache/backup/BackupReplyProcessorTest.java
index 0f8f32b..e014852 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupReplyProcessorTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/BackupReplyProcessorTest.java
@@ -33,11 +33,11 @@ import org.apache.geode.distributed.internal.membership.InternalDistributedMembe
 import org.apache.geode.test.junit.categories.UnitTest;
 
 @Category(UnitTest.class)
-public class PrepareBackupReplyProcessorTest {
+public class BackupReplyProcessorTest {
 
-  private PrepareBackupReplyProcessor prepareBackupReplyProcessor;
+  private BackupReplyProcessor backupReplyProcessor;
 
-  private PrepareBackupResultCollector resultCollector;
+  private BackupResultCollector resultCollector;
   private DM dm;
   private InternalDistributedSystem system;
   private InternalDistributedMember sender;
@@ -45,16 +45,16 @@ public class PrepareBackupReplyProcessorTest {
   private Set<InternalDistributedMember> recipients;
   private Set<PersistentID> persistentIds;
 
-  private PrepareBackupResponse prepareBackupResponse;
-  private DistributionMessage nonPrepareBackupResponse;
+  private BackupResponse backupResponse;
+  private DistributionMessage nonBackupResponse;
 
   @Before
   public void setUp() throws Exception {
-    resultCollector = mock(PrepareBackupResultCollector.class);
+    resultCollector = mock(BackupResultCollector.class);
     dm = mock(DM.class);
     system = mock(InternalDistributedSystem.class);
-    prepareBackupResponse = mock(PrepareBackupResponse.class);
-    nonPrepareBackupResponse = mock(DistributionMessage.class);
+    backupResponse = mock(BackupResponse.class);
+    nonBackupResponse = mock(DistributionMessage.class);
     sender = mock(InternalDistributedMember.class);
 
     recipients = new HashSet<>();
@@ -62,28 +62,28 @@ public class PrepareBackupReplyProcessorTest {
 
     when(dm.getSystem()).thenReturn(system);
     when(dm.getCancelCriterion()).thenReturn(mock(CancelCriterion.class));
-    when(prepareBackupResponse.getSender()).thenReturn(sender);
-    when(prepareBackupResponse.getPersistentIds()).thenReturn(persistentIds);
-    when(nonPrepareBackupResponse.getSender()).thenReturn(sender);
+    when(backupResponse.getSender()).thenReturn(sender);
+    when(backupResponse.getPersistentIds()).thenReturn(persistentIds);
+    when(nonBackupResponse.getSender()).thenReturn(sender);
 
-    prepareBackupReplyProcessor = new PrepareBackupReplyProcessor(resultCollector, dm, recipients);
+    backupReplyProcessor = new BackupReplyProcessor(resultCollector, dm, recipients);
   }
 
   @Test
   public void stopBecauseOfExceptionsReturnsFalse() throws Exception {
-    assertThat(prepareBackupReplyProcessor.stopBecauseOfExceptions()).isFalse();
+    assertThat(backupReplyProcessor.stopBecauseOfExceptions()).isFalse();
   }
 
   @Test
-  public void processPrepareBackupResponseAddsSenderToResults() throws Exception {
-    prepareBackupReplyProcessor.process(prepareBackupResponse, false);
+  public void processBackupResponseAddsSenderToResults() throws Exception {
+    backupReplyProcessor.process(backupResponse, false);
 
     verify(resultCollector, times(1)).addToResults(eq(sender), eq(persistentIds));
   }
 
   @Test
-  public void processNonPrepareBackupResponseDoesNotAddSenderToResults() throws Exception {
-    prepareBackupReplyProcessor.process(nonPrepareBackupResponse, false);
+  public void processNonBackupResponseDoesNotAddSenderToResults() throws Exception {
+    backupReplyProcessor.process(nonBackupResponse, false);
 
     verify(resultCollector, times(0)).addToResults(eq(sender), eq(persistentIds));
   }
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupFactoryTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/FinishBackupFactoryTest.java
similarity index 63%
copy from geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupFactoryTest.java
copy to geode-core/src/test/java/org/apache/geode/internal/cache/backup/FinishBackupFactoryTest.java
index 8b4476d..ce2e7f4 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupFactoryTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/FinishBackupFactoryTest.java
@@ -17,6 +17,7 @@ package org.apache.geode.internal.cache.backup;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
+import java.io.File;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -25,6 +26,7 @@ import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
 import org.apache.geode.CancelCriterion;
+import org.apache.geode.cache.persistence.PersistentID;
 import org.apache.geode.distributed.internal.DM;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
@@ -32,11 +34,11 @@ import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.test.junit.categories.UnitTest;
 
 @Category(UnitTest.class)
-public class PrepareBackupFactoryTest {
+public class FinishBackupFactoryTest {
 
-  private PrepareBackupFactory prepareBackupFactory;
+  private FinishBackupFactory finishBackupFactory;
 
-  private PrepareBackupResultCollector resultCollector;
+  private BackupResultCollector resultCollector;
   private DM dm;
   private InternalDistributedMember sender;
   private Set<InternalDistributedMember> recipients;
@@ -45,7 +47,7 @@ public class PrepareBackupFactoryTest {
 
   @Before
   public void setUp() throws Exception {
-    resultCollector = mock(PrepareBackupResultCollector.class);
+    resultCollector = mock(BackupResultCollector.class);
     dm = mock(DM.class);
     sender = mock(InternalDistributedMember.class);
     member = mock(InternalDistributedMember.class);
@@ -56,30 +58,30 @@ public class PrepareBackupFactoryTest {
     when(dm.getSystem()).thenReturn(mock(InternalDistributedSystem.class));
     when(dm.getCancelCriterion()).thenReturn(mock(CancelCriterion.class));
 
-    prepareBackupFactory = new PrepareBackupFactory();
+    finishBackupFactory = new FinishBackupFactory();
   }
 
   @Test
-  public void createReplyProcessorReturnsPrepareBackupReplyProcessor() throws Exception {
-    assertThat(prepareBackupFactory.createReplyProcessor(resultCollector, dm, recipients))
-        .isInstanceOf(PrepareBackupReplyProcessor.class);
+  public void createReplyProcessorReturnsBackupReplyProcessor() throws Exception {
+    assertThat(finishBackupFactory.createReplyProcessor(resultCollector, dm, recipients))
+        .isInstanceOf(BackupReplyProcessor.class);
   }
 
   @Test
-  public void createRequestReturnsPrepareBackupRequest() throws Exception {
-    assertThat(prepareBackupFactory.createRequest(sender, recipients, 1))
-        .isInstanceOf(PrepareBackupRequest.class);
+  public void createRequestReturnsFinishBackupRequest() throws Exception {
+    assertThat(finishBackupFactory.createRequest(sender, recipients, 1, new File("targetDir"),
+        new File("baselineDir"), false)).isInstanceOf(FinishBackupRequest.class);
   }
 
   @Test
-  public void createPrepareBackupReturnsPrepareBackup() throws Exception {
-    assertThat(prepareBackupFactory.createPrepareBackup(member, cache))
-        .isInstanceOf(PrepareBackup.class);
+  public void createFinishBackupReturnsFinishBackup() throws Exception {
+    assertThat(finishBackupFactory.createFinishBackup(cache, new File("targetDir"),
+        new File("baselineDir"), false)).isInstanceOf(FinishBackup.class);
   }
 
   @Test
-  public void createPrepareBackupResponseReturnsPrepareBackupResponse() {
-    assertThat(prepareBackupFactory.createPrepareBackupResponse(member, null))
-        .isInstanceOf(PrepareBackupResponse.class);
+  public void createBackupResponseReturnsBackupResponse() {
+    assertThat(finishBackupFactory.createBackupResponse(member, null))
+        .isInstanceOf(BackupResponse.class);
   }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupOperationTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/FinishBackupOperationTest.java
similarity index 62%
copy from geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupOperationTest.java
copy to geode-core/src/test/java/org/apache/geode/internal/cache/backup/FinishBackupOperationTest.java
index c0267cb..c0972e8 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupOperationTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/FinishBackupOperationTest.java
@@ -17,6 +17,7 @@ package org.apache.geode.internal.cache.backup;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
+import java.io.File;
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.Set;
@@ -36,7 +37,7 @@ import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.test.junit.categories.UnitTest;
 
 @Category(UnitTest.class)
-public class PrepareBackupOperationTest {
+public class FinishBackupOperationTest {
 
   private DM dm;
   private InternalCache cache;
@@ -46,46 +47,52 @@ public class PrepareBackupOperationTest {
   private InternalDistributedMember member1;
   private InternalDistributedMember member2;
 
-  private PrepareBackupFactory prepareBackupFactory;
-  private PrepareBackupReplyProcessor prepareBackupReplyProcessor;
-  private PrepareBackupRequest prepareBackupRequest;
-  private PrepareBackup prepareBackup;
+  private File targetDir = new File("targetDir");
+  private File baselineDir = new File("baselineDir");
+  private boolean abort = false;
 
-  private PrepareBackupOperation prepareBackupOperation;
+  private FinishBackupFactory finishBackupFactory;
+  private BackupReplyProcessor finishBackupReplyProcessor;
+  private FinishBackupRequest finishBackupRequest;
+  private FinishBackup finishBackup;
+
+  private FinishBackupOperation finishBackupOperation;
 
   @Before
   public void setUp() throws Exception {
     dm = mock(DM.class);
     cache = mock(InternalCache.class);
 
-    prepareBackupReplyProcessor = mock(PrepareBackupReplyProcessor.class);
-    prepareBackupRequest = mock(PrepareBackupRequest.class);
-    prepareBackup = mock(PrepareBackup.class);
+    finishBackupReplyProcessor = mock(BackupReplyProcessor.class);
+    finishBackupRequest = mock(FinishBackupRequest.class);
+    finishBackup = mock(FinishBackup.class);
 
-    prepareBackupFactory = mock(PrepareBackupFactory.class);
+    finishBackupFactory = mock(FinishBackupFactory.class);
 
     sender = mock(InternalDistributedMember.class, "sender");
     member1 = mock(InternalDistributedMember.class, "member1");
     member2 = mock(InternalDistributedMember.class, "member2");
     recipients = new HashSet<>();
 
-    prepareBackupOperation =
-        new PrepareBackupOperation(dm, sender, cache, recipients, prepareBackupFactory);
+    finishBackupOperation = new FinishBackupOperation(dm, sender, cache, recipients, targetDir,
+        baselineDir, abort, finishBackupFactory);
 
-    when(prepareBackupReplyProcessor.getProcessorId()).thenReturn(42);
+    when(finishBackupReplyProcessor.getProcessorId()).thenReturn(42);
 
-    when(prepareBackupFactory.createReplyProcessor(eq(prepareBackupOperation), eq(dm),
-        eq(recipients))).thenReturn(prepareBackupReplyProcessor);
-    when(prepareBackupFactory.createRequest(eq(sender), eq(recipients), eq(42)))
-        .thenReturn(prepareBackupRequest);
-    when(prepareBackupFactory.createPrepareBackup(eq(sender), eq(cache))).thenReturn(prepareBackup);
+    when(
+        finishBackupFactory.createReplyProcessor(eq(finishBackupOperation), eq(dm), eq(recipients)))
+            .thenReturn(finishBackupReplyProcessor);
+    when(finishBackupFactory.createRequest(eq(sender), eq(recipients), eq(42), eq(targetDir),
+        eq(baselineDir), eq(abort))).thenReturn(finishBackupRequest);
+    when(finishBackupFactory.createFinishBackup(eq(cache), eq(targetDir), eq(baselineDir),
+        eq(abort))).thenReturn(finishBackup);
   }
 
   @Test
-  public void sendShouldSendPrepareBackupMessage() throws Exception {
-    prepareBackupOperation.send();
+  public void sendShouldSendfinishBackupMessage() throws Exception {
+    finishBackupOperation.send();
 
-    verify(dm, times(1)).putOutgoing(prepareBackupRequest);
+    verify(dm, times(1)).putOutgoing(finishBackupRequest);
   }
 
   @Test
@@ -93,9 +100,9 @@ public class PrepareBackupOperationTest {
     HashSet<PersistentID> persistentIdsForMember1 = new HashSet<>();
     persistentIdsForMember1.add(mock(PersistentID.class));
     doAnswer(invokeAddToResults(new MemberWithPersistentIds(member1, persistentIdsForMember1)))
-        .when(prepareBackupReplyProcessor).waitForReplies();
+        .when(finishBackupReplyProcessor).waitForReplies();
 
-    assertThat(prepareBackupOperation.send()).containsOnlyKeys(member1)
+    assertThat(finishBackupOperation.send()).containsOnlyKeys(member1)
         .containsValues(persistentIdsForMember1);
   }
 
@@ -103,9 +110,9 @@ public class PrepareBackupOperationTest {
   public void sendReturnsResultsForLocalMember() throws Exception {
     HashSet<PersistentID> persistentIdsForSender = new HashSet<>();
     persistentIdsForSender.add(mock(PersistentID.class));
-    when(prepareBackup.run()).thenReturn(persistentIdsForSender);
+    when(finishBackup.run()).thenReturn(persistentIdsForSender);
 
-    assertThat(prepareBackupOperation.send()).containsOnlyKeys(sender)
+    assertThat(finishBackupOperation.send()).containsOnlyKeys(sender)
         .containsValue(persistentIdsForSender);
   }
 
@@ -121,100 +128,97 @@ public class PrepareBackupOperationTest {
         new MemberWithPersistentIds(member1, persistentIdsForMember1),
         new MemberWithPersistentIds(member2, persistentIdsForMember2)};
 
-    doAnswer(invokeAddToResults(ids)).when(prepareBackupReplyProcessor).waitForReplies();
-
-    // prepareBackupOperation.addToResults(ids[0].member, ids[0].persistentIds);
-    // prepareBackupOperation.addToResults(ids[1].member, ids[1].persistentIds);
+    doAnswer(invokeAddToResults(ids)).when(finishBackupReplyProcessor).waitForReplies();
 
     HashSet<PersistentID> persistentIdsForSender = new HashSet<>();
     persistentIdsForSender.add(mock(PersistentID.class));
-    when(prepareBackup.run()).thenReturn(persistentIdsForSender);
+    when(finishBackup.run()).thenReturn(persistentIdsForSender);
 
-    assertThat(prepareBackupOperation.send()).containsOnlyKeys(member1, member2, sender)
+    assertThat(finishBackupOperation.send()).containsOnlyKeys(member1, member2, sender)
         .containsValues(persistentIdsForSender, persistentIdsForMember1, persistentIdsForMember2);
   }
 
   @Test
   public void getResultsShouldReturnEmptyMapByDefault() throws Exception {
-    assertThat(prepareBackupOperation.getResults()).isEmpty();
+    assertThat(finishBackupOperation.getResults()).isEmpty();
   }
 
   @Test
   public void addToResultsWithNullShouldBeNoop() throws Exception {
-    prepareBackupOperation.addToResults(member1, null);
-    assertThat(prepareBackupOperation.getResults()).isEmpty();
+    finishBackupOperation.addToResults(member1, null);
+    assertThat(finishBackupOperation.getResults()).isEmpty();
   }
 
   @Test
   public void addToResultsWithEmptySetShouldBeNoop() throws Exception {
-    prepareBackupOperation.addToResults(member1, new HashSet<>());
-    assertThat(prepareBackupOperation.getResults()).isEmpty();
+    finishBackupOperation.addToResults(member1, new HashSet<>());
+    assertThat(finishBackupOperation.getResults()).isEmpty();
   }
 
   @Test
   public void addToResultsShouldShowUpInGetResults() throws Exception {
     HashSet<PersistentID> persistentIdsForMember1 = new HashSet<>();
     persistentIdsForMember1.add(mock(PersistentID.class));
-    prepareBackupOperation.addToResults(member1, persistentIdsForMember1);
-    assertThat(prepareBackupOperation.getResults()).containsOnlyKeys(member1)
+    finishBackupOperation.addToResults(member1, persistentIdsForMember1);
+    assertThat(finishBackupOperation.getResults()).containsOnlyKeys(member1)
         .containsValue(persistentIdsForMember1);
   }
 
   @Test
   public void sendShouldHandleIOExceptionThrownFromRun() throws Exception {
-    when(prepareBackup.run()).thenThrow(new IOException("expected exception"));
-    prepareBackupOperation.send();
+    when(finishBackup.run()).thenThrow(new IOException("expected exception"));
+    finishBackupOperation.send();
   }
 
   @Test(expected = RuntimeException.class)
   public void sendShouldThrowNonIOExceptionThrownFromRun() throws Exception {
-    when(prepareBackup.run()).thenThrow(new RuntimeException("expected exception"));
-    prepareBackupOperation.send();
+    when(finishBackup.run()).thenThrow(new RuntimeException("expected exception"));
+    finishBackupOperation.send();
   }
 
   @Test
   public void sendShouldHandleCancelExceptionFromWaitForReplies() throws Exception {
     ReplyException replyException =
         new ReplyException("expected exception", new CacheClosedException("expected exception"));
-    doThrow(replyException).when(prepareBackupReplyProcessor).waitForReplies();
-    prepareBackupOperation.send();
+    doThrow(replyException).when(finishBackupReplyProcessor).waitForReplies();
+    finishBackupOperation.send();
   }
 
   @Test
   public void sendShouldHandleInterruptedExceptionFromWaitForReplies() throws Exception {
-    doThrow(new InterruptedException("expected exception")).when(prepareBackupReplyProcessor)
+    doThrow(new InterruptedException("expected exception")).when(finishBackupReplyProcessor)
         .waitForReplies();
-    prepareBackupOperation.send();
+    finishBackupOperation.send();
   }
 
   @Test(expected = ReplyException.class)
   public void sendShouldThrowReplyExceptionWithNoCauseFromWaitForReplies() throws Exception {
-    doThrow(new ReplyException("expected exception")).when(prepareBackupReplyProcessor)
+    doThrow(new ReplyException("expected exception")).when(finishBackupReplyProcessor)
         .waitForReplies();
-    prepareBackupOperation.send();
+    finishBackupOperation.send();
   }
 
   @Test(expected = ReplyException.class)
   public void sendShouldThrowReplyExceptionWithCauseThatIsNotACancelFromWaitForReplies()
       throws Exception {
     doThrow(new ReplyException("expected exception", new RuntimeException("expected")))
-        .when(prepareBackupReplyProcessor).waitForReplies();
-    prepareBackupOperation.send();
+        .when(finishBackupReplyProcessor).waitForReplies();
+    finishBackupOperation.send();
   }
 
   @Test
-  public void sendShouldPrepareForBackupInLocalMemberBeforeWaitingForReplies() throws Exception {
-    InOrder inOrder = inOrder(prepareBackup, prepareBackupReplyProcessor);
-    prepareBackupOperation.send();
+  public void sendShouldfinishForBackupInLocalMemberBeforeWaitingForReplies() throws Exception {
+    InOrder inOrder = inOrder(finishBackup, finishBackupReplyProcessor);
+    finishBackupOperation.send();
 
-    inOrder.verify(prepareBackup, times(1)).run();
-    inOrder.verify(prepareBackupReplyProcessor, times(1)).waitForReplies();
+    inOrder.verify(finishBackup, times(1)).run();
+    inOrder.verify(finishBackupReplyProcessor, times(1)).waitForReplies();
   }
 
   private Answer<Object> invokeAddToResults(MemberWithPersistentIds... memberWithPersistentIds) {
     return invocation -> {
       for (MemberWithPersistentIds ids : memberWithPersistentIds) {
-        prepareBackupOperation.addToResults(ids.member, ids.persistentIds);
+        finishBackupOperation.addToResults(ids.member, ids.persistentIds);
       }
       return null;
     };
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/FinishBackupRequestTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/FinishBackupRequestTest.java
index 68cae0f..5e1a5a1 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/FinishBackupRequestTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/FinishBackupRequestTest.java
@@ -15,11 +15,7 @@
 package org.apache.geode.internal.cache.backup;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -27,25 +23,17 @@ import static org.mockito.Mockito.when;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Set;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
-import org.mockito.InOrder;
 
-import org.apache.geode.cache.CacheClosedException;
 import org.apache.geode.cache.persistence.PersistentID;
-import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.DM;
-import org.apache.geode.distributed.internal.ReplyException;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.internal.admin.remote.AdminFailureResponse;
-import org.apache.geode.internal.admin.remote.AdminResponse;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.test.junit.categories.UnitTest;
 
@@ -54,158 +42,76 @@ public class FinishBackupRequestTest {
 
   private FinishBackupRequest finishBackupRequest;
 
-  private FinishBackupReplyProcessor replyProcessor;
   private DM dm;
   private InternalCache cache;
   private BackupManager backupManager;
+  private int processorId = 79;
   private File targetDir;
   private File baselineDir;
-
-  private InternalDistributedMember localMember;
-  private InternalDistributedMember member1;
-  private InternalDistributedMember member2;
-
+  private boolean abort;
+  private FinishBackupFactory finishBackupFactory;
+  private InternalDistributedMember sender;
   private Set<InternalDistributedMember> recipients;
+  private HashSet<PersistentID> persistentIds;
+  private FinishBackup finishBackup;
 
   @Before
   public void setUp() throws Exception {
     // mocks here
-    replyProcessor = mock(FinishBackupReplyProcessor.class);
     dm = mock(DM.class);
     cache = mock(InternalCache.class);
     backupManager = mock(BackupManager.class);
     targetDir = mock(File.class);
     baselineDir = mock(File.class);
+    abort = false;
 
     when(dm.getCache()).thenReturn(cache);
-    when(dm.getDistributionManagerId()).thenReturn(localMember);
+    when(dm.getDistributionManagerId()).thenReturn(sender);
     when(cache.getBackupManager()).thenReturn(backupManager);
-    when(replyProcessor.getResults()).thenReturn(Collections.emptyMap());
 
-    localMember = mock(InternalDistributedMember.class);
-    member1 = mock(InternalDistributedMember.class);
-    member2 = mock(InternalDistributedMember.class);
+    sender = mock(InternalDistributedMember.class);
 
     recipients = new HashSet<>();
-    recipients.add(member1);
-    recipients.add(member2);
+    persistentIds = new HashSet<>();
 
-    finishBackupRequest =
-        new FinishBackupRequest(dm, recipients, replyProcessor, targetDir, baselineDir, false);
-  }
+    finishBackup = mock(FinishBackup.class);
+    when(finishBackup.run()).thenReturn(persistentIds);
 
-  @Test
-  public void getRecipientsReturnsRecipientMembers() throws Exception {
-    assertThat(finishBackupRequest.getRecipients()).hasSize(2).contains(member1, member2);
-  }
+    finishBackupFactory = mock(FinishBackupFactory.class);
+    when(finishBackupFactory.createFinishBackup(eq(cache), eq(targetDir), eq(baselineDir),
+        eq(abort))).thenReturn(finishBackup);
+    when(finishBackupFactory.createBackupResponse(eq(sender), eq(persistentIds)))
+        .thenReturn(mock(BackupResponse.class));
 
-  @Test
-  public void getRecipientsDoesNotIncludeNull() throws Exception {
-    InternalDistributedMember nullMember = null;
 
-    assertThat(finishBackupRequest.getRecipients()).doesNotContain(nullMember);
+    finishBackupRequest = new FinishBackupRequest(sender, recipients, processorId, targetDir,
+        baselineDir, false, finishBackupFactory);
   }
 
   @Test
-  public void sendShouldUseDMToSendMessage() throws Exception {
-    finishBackupRequest.send();
+  public void usesFactoryToCreateFinishBackup() throws Exception {
+    finishBackupRequest.createResponse(dm);
 
-    verify(dm, times(1)).putOutgoing(finishBackupRequest);
+    verify(finishBackupFactory, times(1)).createFinishBackup(eq(cache), eq(targetDir),
+        eq(baselineDir), eq(abort));
   }
 
   @Test
-  public void sendShouldWaitForRepliesFromRecipients() throws Exception {
-    finishBackupRequest.send();
+  public void usesFactoryToCreateBackupResponse() throws Exception {
+    finishBackupRequest.createResponse(dm);
 
-    verify(replyProcessor, times(1)).waitForReplies();
+    verify(finishBackupFactory, times(1)).createBackupResponse(eq(sender), eq(persistentIds));
   }
 
   @Test
-  public void sendShouldReturnResultsContainingRecipientsAndLocalMember() throws Exception {
-    Set<PersistentID> localMember_PersistentIdSet = new HashSet<>();
-    localMember_PersistentIdSet.add(mock(PersistentID.class));
-    Set<PersistentID> member1_PersistentIdSet = new HashSet<>();
-    member1_PersistentIdSet.add(mock(PersistentID.class));
-    Set<PersistentID> member2_PersistentIdSet = new HashSet<>();
-    member2_PersistentIdSet.add(mock(PersistentID.class));
-    member2_PersistentIdSet.add(mock(PersistentID.class));
-    Map<DistributedMember, Set<PersistentID>> expectedResults = new HashMap<>();
-    expectedResults.put(localMember, localMember_PersistentIdSet);
-    expectedResults.put(member1, member1_PersistentIdSet);
-    expectedResults.put(member2, member2_PersistentIdSet);
-    when(replyProcessor.getResults()).thenReturn(expectedResults);
-
-    Map<DistributedMember, Set<PersistentID>> results = finishBackupRequest.send();
-
-    assertThat(results).isEqualTo(expectedResults);
-  }
-
-  @Test
-  public void sendShouldInvokeProcessLocally() throws Exception {
-    finishBackupRequest.send();
-
-    verify(replyProcessor, times(1)).process(any(AdminResponse.class), eq(false));
-  }
-
-  @Test
-  public void sendShouldInvokeDoBackupLocally() throws Exception {
-    finishBackupRequest.send();
-
-    verify(backupManager, times(1)).doBackup(targetDir, baselineDir, false);
-  }
-
-  /**
-   * Confirms fix for GEODE-3940: Backup can hang while trying to get a lock
-   */
-  @Test
-  public void sendShouldDoBackupInLocalMemberBeforeWaitingForReplies() throws Exception {
-    InOrder inOrder = inOrder(backupManager, replyProcessor);
-
-    finishBackupRequest.send();
-
-    // assert that doBackup which releases BackupLock is invoked before invoking waitForReplies
-    inOrder.verify(backupManager, times(1)).doBackup(targetDir, baselineDir, false);
-    inOrder.verify(replyProcessor, times(1)).waitForReplies();
+  public void returnsBackupResponse() throws Exception {
+    assertThat(finishBackupRequest.createResponse(dm)).isInstanceOf(BackupResponse.class);
   }
 
   @Test
-  public void repliesWithFinishBackupResponse() throws Exception {
-    finishBackupRequest.send();
+  public void returnsAdminFailureResponseWhenFinishBackupThrowsIOException() throws Exception {
+    when(finishBackup.run()).thenThrow(new IOException());
 
-    verify(replyProcessor, times(1)).process(any(FinishBackupResponse.class), eq(false));
+    assertThat(finishBackupRequest.createResponse(dm)).isInstanceOf(AdminFailureResponse.class);
   }
-
-  @Test
-  public void repliesWithAdminFailureResponseWhenDoBackupThrowsIOException() throws Exception {
-    when(backupManager.doBackup(targetDir, baselineDir, false)).thenThrow(new IOException());
-
-    finishBackupRequest.send();
-
-    verify(replyProcessor, times(1)).process(any(AdminFailureResponse.class), eq(false));
-  }
-
-  @Test
-  public void sendShouldCompleteIfWaitForRepliesThrowsReplyExceptionCausedByCacheClosedException()
-      throws Exception {
-    doThrow(new ReplyException(new CacheClosedException())).when(replyProcessor).waitForReplies();
-
-    finishBackupRequest.send();
-  }
-
-  @Test
-  public void sendShouldThrowIfWaitForRepliesThrowsReplyExceptionNotCausedByCacheClosedException()
-      throws Exception {
-    doThrow(new ReplyException(new NullPointerException())).when(replyProcessor).waitForReplies();
-
-    assertThatThrownBy(() -> finishBackupRequest.send()).isInstanceOf(ReplyException.class)
-        .hasCauseInstanceOf(NullPointerException.class);
-  }
-
-  @Test
-  public void sendCompletesWhenWaitForRepliesThrowsInterruptedException() throws Exception {
-    doThrow(new InterruptedException()).when(replyProcessor).waitForReplies();
-
-    finishBackupRequest.send();
-  }
-
 }
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupFactoryTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupFactoryTest.java
index 8b4476d..41431a3 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupFactoryTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupFactoryTest.java
@@ -36,7 +36,7 @@ public class PrepareBackupFactoryTest {
 
   private PrepareBackupFactory prepareBackupFactory;
 
-  private PrepareBackupResultCollector resultCollector;
+  private BackupResultCollector resultCollector;
   private DM dm;
   private InternalDistributedMember sender;
   private Set<InternalDistributedMember> recipients;
@@ -45,7 +45,7 @@ public class PrepareBackupFactoryTest {
 
   @Before
   public void setUp() throws Exception {
-    resultCollector = mock(PrepareBackupResultCollector.class);
+    resultCollector = mock(BackupResultCollector.class);
     dm = mock(DM.class);
     sender = mock(InternalDistributedMember.class);
     member = mock(InternalDistributedMember.class);
@@ -60,9 +60,9 @@ public class PrepareBackupFactoryTest {
   }
 
   @Test
-  public void createReplyProcessorReturnsPrepareBackupReplyProcessor() throws Exception {
+  public void createReplyProcessorReturnsBackupReplyProcessor() throws Exception {
     assertThat(prepareBackupFactory.createReplyProcessor(resultCollector, dm, recipients))
-        .isInstanceOf(PrepareBackupReplyProcessor.class);
+        .isInstanceOf(BackupReplyProcessor.class);
   }
 
   @Test
@@ -78,8 +78,8 @@ public class PrepareBackupFactoryTest {
   }
 
   @Test
-  public void createPrepareBackupResponseReturnsPrepareBackupResponse() {
-    assertThat(prepareBackupFactory.createPrepareBackupResponse(member, null))
-        .isInstanceOf(PrepareBackupResponse.class);
+  public void createBackupResponseReturnsBackupResponse() {
+    assertThat(prepareBackupFactory.createBackupResponse(member, null))
+        .isInstanceOf(BackupResponse.class);
   }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupOperationTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupOperationTest.java
index c0267cb..2e4246a 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupOperationTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupOperationTest.java
@@ -47,7 +47,7 @@ public class PrepareBackupOperationTest {
   private InternalDistributedMember member2;
 
   private PrepareBackupFactory prepareBackupFactory;
-  private PrepareBackupReplyProcessor prepareBackupReplyProcessor;
+  private BackupReplyProcessor prepareBackupReplyProcessor;
   private PrepareBackupRequest prepareBackupRequest;
   private PrepareBackup prepareBackup;
 
@@ -58,7 +58,7 @@ public class PrepareBackupOperationTest {
     dm = mock(DM.class);
     cache = mock(InternalCache.class);
 
-    prepareBackupReplyProcessor = mock(PrepareBackupReplyProcessor.class);
+    prepareBackupReplyProcessor = mock(BackupReplyProcessor.class);
     prepareBackupRequest = mock(PrepareBackupRequest.class);
     prepareBackup = mock(PrepareBackup.class);
 
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupRequestTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupRequestTest.java
index ae120c8..706ef27 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupRequestTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/backup/PrepareBackupRequestTest.java
@@ -62,8 +62,8 @@ public class PrepareBackupRequestTest {
     when(dm.getCache()).thenReturn(cache);
     when(dm.getDistributionManagerId()).thenReturn(sender);
     when(prepareBackupFactory.createPrepareBackup(eq(sender), eq(cache))).thenReturn(prepareBackup);
-    when(prepareBackupFactory.createPrepareBackupResponse(eq(sender), eq(persistentIds)))
-        .thenReturn(mock(PrepareBackupResponse.class));
+    when(prepareBackupFactory.createBackupResponse(eq(sender), eq(persistentIds)))
+        .thenReturn(mock(BackupResponse.class));
     when(prepareBackup.run()).thenReturn(persistentIds);
 
     prepareBackupRequest =
@@ -78,16 +78,15 @@ public class PrepareBackupRequestTest {
   }
 
   @Test
-  public void usesFactoryToCreatePrepareBackupResponse() throws Exception {
+  public void usesFactoryToCreateBackupResponse() throws Exception {
     prepareBackupRequest.createResponse(dm);
 
-    verify(prepareBackupFactory, times(1)).createPrepareBackupResponse(eq(sender),
-        eq(persistentIds));
+    verify(prepareBackupFactory, times(1)).createBackupResponse(eq(sender), eq(persistentIds));
   }
 
   @Test
-  public void returnsPrepareBackupResponse() throws Exception {
-    assertThat(prepareBackupRequest.createResponse(dm)).isInstanceOf(PrepareBackupResponse.class);
+  public void returnsBackupResponse() throws Exception {
+    assertThat(prepareBackupRequest.createResponse(dm)).isInstanceOf(BackupResponse.class);
   }
 
   @Test

-- 
To stop receiving notification emails like this one, please contact
['"commits@geode.apache.org" <co...@geode.apache.org>'].