Explicit error message if extent is not present on ZK (#2066)

* Explicit error message if extent is not present on ZK

Client can get no extent error in the following two scenarios.
1. When client attempted to read/open an extent that
   is not on ZK (metadata server)
2. When client attempted to read a Ledger which is on metadata
   server, but somehow missing on bookies (Data server)

It is quite confusing to get the same error, NoSuchLedgerExists
for both these cases. This checkin introduced a new error at the
BookKeeper client level, NoSuchLedgerExistsOnMetadataServer if
it is not available on ZK.

For errors related to Ledger is not available on bookie,
I left NoSuchLedgerExists as-is(instead of changing it to
NoSuchLedgerExistsOnDataServer) to minimize code changes.

This change alone provides enough distinction between these
two types of errors.

Signed-off-by: Venkateswararao Jujjuri (JV) <vjujjuri@salesforce.com>

* Checkstyle fixes

* Some more fixes

* Fixing DL test fixes
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ScanAndCompareGarbageCollector.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ScanAndCompareGarbageCollector.java
index b1e7722..247b610 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ScanAndCompareGarbageCollector.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/ScanAndCompareGarbageCollector.java
@@ -171,7 +171,7 @@
                             } catch (BKException e) {
                                 rc = e.getCode();
                             }
-                            if (rc != BKException.Code.NoSuchLedgerExistsException) {
+                            if (rc != BKException.Code.NoSuchLedgerExistsOnMetadataServerException) {
                                 LOG.warn("Ledger {} Missing in metadata list, but ledgerManager returned rc: {}.",
                                          bkLid, rc);
                                 continue;
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BKException.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BKException.java
index 781a07b..a3f03c2 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BKException.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BKException.java
@@ -72,6 +72,8 @@
             return new BKNotEnoughBookiesException();
         case Code.NoSuchLedgerExistsException:
             return new BKNoSuchLedgerExistsException();
+        case Code.NoSuchLedgerExistsOnMetadataServerException:
+            return new BKNoSuchLedgerExistsOnMetadataServerException();
         case Code.BookieHandleNotAvailableException:
             return new BKBookieHandleNotAvailableException();
         case Code.ZKException:
@@ -279,6 +281,14 @@
             super(BKException.Code.NoSuchLedgerExistsException);
         }
     }
+    /**
+     * Bookkeeper no such ledger exists on metadata server exception.
+     */
+    public static class BKNoSuchLedgerExistsOnMetadataServerException extends BKException {
+        public BKNoSuchLedgerExistsOnMetadataServerException() {
+            super(Code.NoSuchLedgerExistsOnMetadataServerException);
+        }
+    }
 
     /**
      * Bookkeeper bookie handle not available exception.
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java
index 9303ffd..6d2319c 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java
@@ -492,7 +492,7 @@
                 bkc.getLedgerManager().readLedgerMetadata(lid)
                     .whenComplete((metadata, exception) -> {
                             if (BKException.getExceptionCode(exception)
-                                == BKException.Code.NoSuchLedgerExistsException) {
+                                == BKException.Code.NoSuchLedgerExistsOnMetadataServerException) {
                                 // the ledger was deleted during this iteration.
                                 cb.processResult(BKException.Code.OK, null, null);
                                 return;
@@ -1541,7 +1541,8 @@
             throw new RuntimeException(ie);
         } catch (ExecutionException e) {
             if (e.getCause() != null
-                    && e.getCause().getClass().equals(BKException.BKNoSuchLedgerExistsException.class)) {
+                    && e.getCause().getClass()
+                    .equals(BKException.BKNoSuchLedgerExistsOnMetadataServerException.class)) {
                 LOG.debug("Ledger: {} has been deleted", ledgerId);
                 return false;
             } else {
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerChecker.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerChecker.java
index b9745a9..fe6370b 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerChecker.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerChecker.java
@@ -264,7 +264,8 @@
 
         public void readEntryComplete(int rc, long ledgerId, long entryId,
                                       ByteBuf buffer, Object ctx) {
-            if (BKException.Code.NoSuchEntryException != rc && BKException.Code.NoSuchLedgerExistsException != rc) {
+            if (BKException.Code.NoSuchEntryException != rc && BKException.Code.NoSuchLedgerExistsException != rc
+                    && BKException.Code.NoSuchLedgerExistsOnMetadataServerException != rc) {
                 entryMayExist.set(true);
             }
 
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/UpdateLedgerOp.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/UpdateLedgerOp.java
index 6fce7e1..268eff6 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/UpdateLedgerOp.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/UpdateLedgerOp.java
@@ -116,7 +116,7 @@
             outstanding.add(writePromise);
             writePromise.whenComplete((metadata, ex) -> {
                         if (ex != null
-                            && !(ex instanceof BKException.BKNoSuchLedgerExistsException)) {
+                            && !(ex instanceof BKException.BKNoSuchLedgerExistsOnMetadataServerException)) {
                             String error = String.format("Failed to update ledger metadata %s, replacing %s with %s",
                                                          ledgerId, oldBookieId, newBookieId);
                             LOG.error(error, ex);
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/api/BKException.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/api/BKException.java
index 058a9a7..0ec0997 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/api/BKException.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/api/BKException.java
@@ -116,7 +116,9 @@
         case Code.NotEnoughBookiesException:
             return "Not enough non-faulty bookies available";
         case Code.NoSuchLedgerExistsException:
-            return "No such ledger exists";
+            return "No such ledger exists on Bookies";
+        case Code.NoSuchLedgerExistsOnMetadataServerException:
+            return "No such ledger exists on Metadata Server";
         case Code.BookieHandleNotAvailableException:
             return "Bookie handle is not available";
         case Code.ZKException:
@@ -242,6 +244,9 @@
         int TimeoutException = -23;
         int SecurityException = -24;
 
+        /** No such ledger exists one metadata server. */
+        int NoSuchLedgerExistsOnMetadataServerException = -25;
+
         /**
          * Operation is illegal.
          */
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/impl/OpenBuilderBase.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/impl/OpenBuilderBase.java
index c2c4c35..07e8615 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/impl/OpenBuilderBase.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/impl/OpenBuilderBase.java
@@ -66,7 +66,7 @@
     protected int validate() {
         if (ledgerId < 0) {
             LOG.error("invalid ledgerId {} < 0", ledgerId);
-            return Code.NoSuchLedgerExistsException;
+            return Code.NoSuchLedgerExistsOnMetadataServerException;
         }
         return Code.OK;
     }
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java
index 9308bfb..79a4f50 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/AbstractZkLedgerManager.java
@@ -129,7 +129,8 @@
                             }
                         });
                 }
-            } else if (BKException.getExceptionCode(exception) == BKException.Code.NoSuchLedgerExistsException) {
+            } else if (BKException.getExceptionCode(exception)
+                    == BKException.Code.NoSuchLedgerExistsOnMetadataServerException) {
                 // the ledger is removed, do nothing
                 Set<LedgerMetadataListener> listenerSet = listeners.remove(ledgerId);
                 if (null != listenerSet) {
@@ -437,7 +438,7 @@
                         LOG.debug("No such ledger: " + ledgerId,
                                   KeeperException.create(KeeperException.Code.get(rc), path));
                     }
-                    promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsException());
+                    promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsOnMetadataServerException());
                     return;
                 }
                 if (rc != KeeperException.Code.OK.intValue()) {
@@ -494,7 +495,7 @@
                     promise.complete(new Versioned<>(metadata, new LongVersion(stat.getVersion())));
                 } else if (KeeperException.Code.NONODE.intValue() == rc) {
                     LOG.warn("Ledger node does not exist in ZooKeeper: ledgerId={}", ledgerId);
-                    promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsException());
+                    promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsOnMetadataServerException());
                 } else {
                     LOG.warn("Conditional update ledger metadata failed: {}", KeeperException.Code.get(rc));
                     promise.completeExceptionally(new BKException.ZKException());
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerManager.java
index 039ff7c..15da14b 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerManager.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/LedgerManager.java
@@ -65,7 +65,7 @@
      * @return Future which, when completed, denotes that the ledger metadata has been removed.
      *         Completed with an exception:<ul>
      *          <li>{@link BKException.BKMetadataVersionException} if version doesn't match</li>
-     *          <li>{@link BKException.BKNoSuchLedgerExistsException} if ledger not exist</li>
+     *          <li>{@link BKException.BKNoSuchLedgerExistsOnMetadataServerException} if ledger not exist</li>
      *          <li>{@link BKException.ZKException} for other issues</li>
      *          </ul>
      */
@@ -78,7 +78,7 @@
      *          Ledger Id
      * @return Future which, when completed, contains the requested versioned metadata.
      *         Completed with an exception::<ul>
-     *          <li>{@link BKException.BKNoSuchLedgerExistsException} if ledger not exist</li>
+     *          <li>{@link BKException.BKNoSuchLedgerExistsOnMetadataServerException} if ledger not exist</li>
      *          <li>{@link BKException.ZKException} for other issues</li>
      *          </ul>
      */
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java
index 266db3a..201a0a3 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/MSLedgerManagerFactory.java
@@ -263,7 +263,8 @@
                                 }
                             });
                     }
-                } else if (BKException.getExceptionCode(exception) == BKException.Code.NoSuchLedgerExistsException) {
+                } else if (BKException.getExceptionCode(exception)
+                        == BKException.Code.NoSuchLedgerExistsOnMetadataServerException) {
                     // the ledger is removed, do nothing
                     Set<LedgerMetadataListener> listenerSet = listeners.remove(ledgerId);
                     if (null != listenerSet) {
@@ -416,7 +417,7 @@
                     int bkRc;
                     if (MSException.Code.NoKey.getCode() == rc) {
                         LOG.warn("Ledger entry does not exist in meta table: ledgerId={}", ledgerId);
-                        promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsException());
+                        promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsOnMetadataServerException());
                     } else if (MSException.Code.OK.getCode() == rc) {
                         FutureUtils.complete(promise, null);
                     } else {
@@ -438,7 +439,7 @@
                     if (MSException.Code.NoKey.getCode() == rc) {
                         LOG.error("No ledger metadata found for ledger " + ledgerId + " : ",
                                 MSException.create(MSException.Code.get(rc), "No key " + key + " found."));
-                        promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsException());
+                        promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsOnMetadataServerException());
                         return;
                     }
                     if (MSException.Code.OK.getCode() != rc) {
@@ -489,7 +490,7 @@
                         promise.completeExceptionally(new BKException.BKMetadataVersionException());
                     } else if (MSException.Code.NoKey.getCode() == rc) {
                         LOG.warn("Ledger {} doesn't exist when writing its ledger metadata.", ledgerId);
-                        promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsException());
+                        promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsOnMetadataServerException());
                     } else if (MSException.Code.OK.getCode() == rc) {
                         promise.complete(new Versioned<>(metadata, version));
                     } else {
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/Auditor.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/Auditor.java
index ad58849..cbf9b45 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/Auditor.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/Auditor.java
@@ -895,7 +895,7 @@
                         numFragmentsPerLedger.registerSuccessfulValue(lh.getNumFragments());
                         numBookiesPerLedger.registerSuccessfulValue(lh.getNumBookies());
                         numLedgersChecked.inc();
-                    } else if (Code.NoSuchLedgerExistsException == rc) {
+                    } else if (Code.NoSuchLedgerExistsOnMetadataServerException == rc) {
                         if (LOG.isDebugEnabled()) {
                             LOG.debug("Ledger {} was deleted before we could check it", ledgerId);
                         }
@@ -966,8 +966,8 @@
                             }
                         }
                         iterCallback.processResult(BKException.Code.OK, null, null);
-                    } else if (BKException
-                            .getExceptionCode(exception) == BKException.Code.NoSuchLedgerExistsException) {
+                    } else if (BKException.getExceptionCode(exception)
+                            == BKException.Code.NoSuchLedgerExistsOnMetadataServerException) {
                         LOG.debug("Ignoring replication of already deleted ledger {}", ledgerId);
                         iterCallback.processResult(BKException.Code.OK, null, null);
                     } else {
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/BookieLedgerIndexer.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/BookieLedgerIndexer.java
index c09a770..026fd72 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/BookieLedgerIndexer.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/BookieLedgerIndexer.java
@@ -76,7 +76,7 @@
                                     }
                                     iterCallback.processResult(BKException.Code.OK, null, null);
                                 } else if (BKException.getExceptionCode(exception)
-                                           == BKException.Code.NoSuchLedgerExistsException) {
+                                           == BKException.Code.NoSuchLedgerExistsOnMetadataServerException) {
                                     LOG.info("Ignoring replication of already deleted ledger {}", ledgerId);
                                     iterCallback.processResult(BKException.Code.OK, null, null);
                                 } else {
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java
index 74d2081..1bba2d5 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java
@@ -45,7 +45,7 @@
 
 import org.apache.bookkeeper.bookie.BookieThread;
 import org.apache.bookkeeper.client.BKException;
-import org.apache.bookkeeper.client.BKException.BKNoSuchLedgerExistsException;
+import org.apache.bookkeeper.client.BKException.BKNoSuchLedgerExistsOnMetadataServerException;
 import org.apache.bookkeeper.client.BKException.BKNotEnoughBookiesException;
 import org.apache.bookkeeper.client.BookKeeper;
 import org.apache.bookkeeper.client.BookKeeperAdmin;
@@ -330,14 +330,14 @@
                 return false;
             }
 
-        } catch (BKNoSuchLedgerExistsException e) {
+        } catch (BKNoSuchLedgerExistsOnMetadataServerException e) {
             // Ledger might have been deleted by user
-            LOG.info("BKNoSuchLedgerExistsException while opening "
+            LOG.info("BKNoSuchLedgerExistsOnMetadataServerException while opening "
                 + "ledger {} for replication. Other clients "
                 + "might have deleted the ledger. "
                 + "So, no harm to continue", ledgerIdToReplicate);
             underreplicationManager.markLedgerReplicated(ledgerIdToReplicate);
-            getExceptionCounter("BKNoSuchLedgerExistsException").inc();
+            getExceptionCounter("BKNoSuchLedgerExistsOnMetadataServerException").inc();
             return false;
         } catch (BKNotEnoughBookiesException e) {
             logBKExceptionAndReleaseLedger(e, ledgerIdToReplicate);
@@ -456,7 +456,7 @@
                     Thread.currentThread().interrupt();
                     LOG.info("InterruptedException while fencing the ledger {}"
                             + " for rereplication of postponed ledgers", ledgerId, e);
-                } catch (BKNoSuchLedgerExistsException bknsle) {
+                } catch (BKNoSuchLedgerExistsOnMetadataServerException bknsle) {
                     if (LOG.isDebugEnabled()) {
                         LOG.debug("Ledger {} was deleted, safe to continue", ledgerId, bknsle);
                     }
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeper.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeper.java
index c65e070..81212d1 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeper.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeper.java
@@ -163,7 +163,7 @@
 
         MockLedgerHandle lh = ledgers.get(lId);
         if (lh == null) {
-            cb.openComplete(BKException.Code.NoSuchLedgerExistsException, null, ctx);
+            cb.openComplete(BKException.Code.NoSuchLedgerExistsOnMetadataServerException, null, ctx);
         } else if (lh.digest != digestType) {
             cb.openComplete(BKException.Code.DigestMatchException, null, ctx);
         } else if (!Arrays.equals(lh.passwd, passwd)) {
@@ -190,7 +190,7 @@
             ledgers.remove(lId);
             cb.deleteComplete(0, ctx);
         } else {
-            cb.deleteComplete(BKException.Code.NoSuchLedgerExistsException, ctx);
+            cb.deleteComplete(BKException.Code.NoSuchLedgerExistsOnMetadataServerException, ctx);
         }
     }
 
@@ -203,7 +203,7 @@
         }
 
         if (!ledgers.containsKey(lId)) {
-            throw BKException.create(BKException.Code.NoSuchLedgerExistsException);
+            throw BKException.create(BKException.Code.NoSuchLedgerExistsOnMetadataServerException);
         }
 
         ledgers.remove(lId);
@@ -238,7 +238,7 @@
 
                 MockLedgerHandle lh = ledgers.get(ledgerId);
                 if (lh == null) {
-                    promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsException());
+                    promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsOnMetadataServerException());
                 } else if (lh.digest != DigestType.fromApiDigestType(digestType)) {
                     promise.completeExceptionally(new BKException.BKDigestMatchException());
                 } else if (!Arrays.equals(lh.passwd, password)) {
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeperTestCase.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeperTestCase.java
index 69b5635..c5878f1 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeperTestCase.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeperTestCase.java
@@ -379,7 +379,7 @@
             executor.executeOrdered(ledgerId, () -> {
                 LedgerMetadata ledgerMetadata = mockLedgerMetadataRegistry.get(ledgerId);
                 if (ledgerMetadata == null) {
-                    promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsException());
+                    promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsOnMetadataServerException());
                 } else {
                     promise.complete(new Versioned<>(ledgerMetadata, new LongVersion(1)));
                 }
@@ -398,7 +398,7 @@
                     if (mockLedgerMetadataRegistry.remove(ledgerId) != null) {
                         promise.complete(null);
                     } else {
-                        promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsException());
+                        promise.completeExceptionally(new BKException.BKNoSuchLedgerExistsOnMetadataServerException());
                     }
                 });
             return promise;
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/api/BookKeeperApiTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/api/BookKeeperApiTest.java
index 5429c0d..a71002d 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/api/BookKeeperApiTest.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/api/BookKeeperApiTest.java
@@ -41,7 +41,7 @@
 import org.apache.bookkeeper.client.BKException.BKDigestMatchException;
 import org.apache.bookkeeper.client.BKException.BKDuplicateEntryIdException;
 import org.apache.bookkeeper.client.BKException.BKLedgerFencedException;
-import org.apache.bookkeeper.client.BKException.BKNoSuchLedgerExistsException;
+import org.apache.bookkeeper.client.BKException.BKNoSuchLedgerExistsOnMetadataServerException;
 import org.apache.bookkeeper.client.BKException.BKUnauthorizedAccessException;
 import org.apache.bookkeeper.client.MockBookKeeperTestCase;
 import org.apache.bookkeeper.conf.ClientConfiguration;
@@ -339,7 +339,7 @@
         }
     }
 
-    @Test(expected = BKNoSuchLedgerExistsException.class)
+    @Test(expected = BKNoSuchLedgerExistsOnMetadataServerException.class)
     public void testDeleteLedger() throws Exception {
         long lId;
 
@@ -358,7 +358,7 @@
             .execute());
     }
 
-    @Test(expected = BKNoSuchLedgerExistsException.class)
+    @Test(expected = BKNoSuchLedgerExistsOnMetadataServerException.class)
     public void testCannotDeleteLedgerTwice() throws Exception {
         long lId;
 
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/api/BookKeeperBuildersTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/api/BookKeeperBuildersTest.java
index 85cb727..f0e07e2 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/api/BookKeeperBuildersTest.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/api/BookKeeperBuildersTest.java
@@ -30,7 +30,7 @@
 import java.util.Map;
 import org.apache.bookkeeper.client.BKException.BKClientClosedException;
 import org.apache.bookkeeper.client.BKException.BKIncorrectParameterException;
-import org.apache.bookkeeper.client.BKException.BKNoSuchLedgerExistsException;
+import org.apache.bookkeeper.client.BKException.BKNoSuchLedgerExistsOnMetadataServerException;
 import org.apache.bookkeeper.client.BookKeeper;
 import org.apache.bookkeeper.client.LedgerHandle;
 import org.apache.bookkeeper.client.LedgerMetadataBuilder;
@@ -307,12 +307,12 @@
         fail("shoud not be able to create a ledger with such specs");
     }
 
-    @Test(expected = BKNoSuchLedgerExistsException.class)
+    @Test(expected = BKNoSuchLedgerExistsOnMetadataServerException.class)
     public void testOpenLedgerNoId() throws Exception {
         result(newOpenLedgerOp().execute());
     }
 
-    @Test(expected = BKNoSuchLedgerExistsException.class)
+    @Test(expected = BKNoSuchLedgerExistsOnMetadataServerException.class)
     public void testOpenLedgerBadId() throws Exception {
         result(newOpenLedgerOp()
             .withPassword(password)
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerTest.java
index 2c0ae4f..0dc2b53 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerTest.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/AbstractZkLedgerManagerTest.java
@@ -366,7 +366,7 @@
             result(ledgerManager.readLedgerMetadata(ledgerId));
             fail("Should fail on reading ledger metadata if a ledger doesn't exist");
         } catch (BKException bke) {
-            assertEquals(Code.NoSuchLedgerExistsException, bke.getCode());
+            assertEquals(Code.NoSuchLedgerExistsOnMetadataServerException, bke.getCode());
         }
 
         verify(mockZk, times(1))
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/GcLedgersTest.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/GcLedgersTest.java
index 37eacf4..10f7048 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/GcLedgersTest.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/meta/GcLedgersTest.java
@@ -406,7 +406,7 @@
      *
      * ScanAndCompareGarbageCollector/GC should clean data of ledger only if both the LedgerManager.getLedgerRanges says
      * that ledger is not existing and also ledgerManager.readLedgerMetadata fails with error
-     * NoSuchLedgerExistsException.
+     * NoSuchLedgerExistsOnMetadataServerException.
      *
      */
     @Test
@@ -464,7 +464,7 @@
      *
      * ScanAndCompareGarbageCollector/GC should clean data of ledger only if both the LedgerManager.getLedgerRanges says
      * that ledger is not existing and also ledgerManager.readLedgerMetadata fails with error
-     * NoSuchLedgerExistsException.
+     * NoSuchLedgerExistsOnMetadataServerException.
      *
      */
     @Test
@@ -508,7 +508,8 @@
      *
      * ScanAndCompareGarbageCollector/GC should clean data of ledger only if both the LedgerManager.getLedgerRanges says
      * that ledger is not existing and also ledgerManager.readLedgerMetadata fails with error
-     * NoSuchLedgerExistsException, but is shouldn't delete if the readLedgerMetadata fails with any other error.
+     * NoSuchLedgerExistsOnMetadataServerException, but is shouldn't delete if the readLedgerMetadata fails with any
+     * other error.
      */
     @Test
     public void testGcLedgersIfReadLedgerMetadataFailsForDeletedLedgers() throws Exception {
diff --git a/stream/distributedlog/core/src/test/java/org/apache/distributedlog/bk/TestLedgerAllocator.java b/stream/distributedlog/core/src/test/java/org/apache/distributedlog/bk/TestLedgerAllocator.java
index 1786fe4..011562e 100644
--- a/stream/distributedlog/core/src/test/java/org/apache/distributedlog/bk/TestLedgerAllocator.java
+++ b/stream/distributedlog/core/src/test/java/org/apache/distributedlog/bk/TestLedgerAllocator.java
@@ -271,7 +271,7 @@
         try {
             bkc.get().openLedger(lh1.getId(), BookKeeper.DigestType.CRC32, dlConf.getBKDigestPW().getBytes());
             fail("LedgerHandle allocated by allocator1 should be deleted.");
-        } catch (BKException.BKNoSuchLedgerExistsException nslee) {
+        } catch (BKException.BKNoSuchLedgerExistsOnMetadataServerException nslee) {
             // as expected
         }
         long eid = lh2.addEntry("hello world".getBytes());
diff --git a/stream/distributedlog/core/src/test/java/org/apache/distributedlog/tools/TestDistributedLogTool.java b/stream/distributedlog/core/src/test/java/org/apache/distributedlog/tools/TestDistributedLogTool.java
index 553e017..4e03554 100644
--- a/stream/distributedlog/core/src/test/java/org/apache/distributedlog/tools/TestDistributedLogTool.java
+++ b/stream/distributedlog/core/src/test/java/org/apache/distributedlog/tools/TestDistributedLogTool.java
@@ -22,7 +22,7 @@
 import static org.junit.Assert.fail;
 
 import java.net.URI;
-import org.apache.bookkeeper.client.BKException.BKNoSuchLedgerExistsException;
+import org.apache.bookkeeper.client.BKException.BKNoSuchLedgerExistsOnMetadataServerException;
 import org.apache.bookkeeper.common.util.ReflectionUtils;
 import org.apache.distributedlog.DLMTestUtil;
 import org.apache.distributedlog.DLSN;
@@ -203,7 +203,7 @@
         // correct functionality.
         try {
             cmd.runCmd();
-        } catch (BKNoSuchLedgerExistsException ex) {
+        } catch (BKNoSuchLedgerExistsOnMetadataServerException ex) {
         }
     }
 
@@ -214,7 +214,7 @@
         cmd.setLedgerId(99999999);
         try {
             cmd.runCmd();
-        } catch (BKNoSuchLedgerExistsException ex) {
+        } catch (BKNoSuchLedgerExistsOnMetadataServerException ex) {
         }
     }
 
diff --git a/tests/integration/smoke/src/test/java/org/apache/bookkeeper/tests/integration/TestBookieShellCluster.java b/tests/integration/smoke/src/test/java/org/apache/bookkeeper/tests/integration/TestBookieShellCluster.java
index c68a3e1..6a6c879 100644
--- a/tests/integration/smoke/src/test/java/org/apache/bookkeeper/tests/integration/TestBookieShellCluster.java
+++ b/tests/integration/smoke/src/test/java/org/apache/bookkeeper/tests/integration/TestBookieShellCluster.java
@@ -211,7 +211,8 @@
                 validateNEntries(bk, ledgerId, numEntries);
                 Assert.fail("Shouldn't have been able to find anything");
             } catch (ExecutionException ee) {
-                Assert.assertEquals(ee.getCause().getClass(), BKException.BKNoSuchLedgerExistsException.class);
+                Assert.assertEquals(ee.getCause().getClass(),
+                        BKException.BKNoSuchLedgerExistsOnMetadataServerException.class);
             }
 
             log.info("Restore the ledger metadata");