private void checkExternalBlob(
     Mailbox mbox, boolean checkSize, BlobInfo blobInfo, ExternalStoreManager sm)
     throws ServiceException {
   MailboxBlob mblob = sm.getMailboxBlob(mbox, blobInfo.itemId, blobInfo.version, blobInfo.path);
   if (mblob == null) {
     results.missingBlobs.put(blobInfo.itemId, blobInfo);
   } else {
     try {
       unexpectedBlobPaths.remove(mblob.getLocator());
       Blob blob = sm.getLocalBlob(mbox, mblob.getLocator(), false);
       if (blob == null) {
         results.missingBlobs.put(blobInfo.itemId, blobInfo);
       } else {
         // blob exists for the locator
         blobInfo.fileModContent = blobInfo.modContent;
         if (reportUsedBlobs) {
           results.usedBlobs.put(blobInfo.itemId, blobInfo);
         }
         if (checkSize) {
           blobInfo.fileSize = blob.getFile().length();
           blobInfo.fileDataSize = getDataSize(blob.getFile(), blobInfo.dbSize);
           if (blobInfo.dbSize != blobInfo.fileDataSize) {
             results.incorrectSize.put(blobInfo.itemId, blobInfo);
           }
         }
       }
     } catch (IOException ioe) {
       blobInfo.fetchException = ioe;
       results.missingBlobs.put(blobInfo.itemId, blobInfo);
     }
   }
 }
 @Override
 public Results check(
     Collection<Short> volumeIds, int mboxId, boolean checkSize, boolean reportUsedBlobs)
     throws ServiceException {
   mailboxId = mboxId;
   this.checkSize = checkSize;
   this.reportUsedBlobs = reportUsedBlobs;
   results = new Results();
   Mailbox mbox = MailboxManager.getInstance().getMailboxById(mailboxId);
   DbConnection conn = null;
   assert (StoreManager.getInstance() instanceof ExternalStoreManager);
   ExternalStoreManager sm = (ExternalStoreManager) StoreManager.getInstance();
   try {
     unexpectedBlobPaths = sm.getAllBlobPaths(mbox);
   } catch (IOException ioe) {
     log.error("IOException getting remote blob list", ioe);
   }
   try {
     conn = DbPool.getConnection();
     int mailboxMaxId = DbBlobConsistency.getMaxId(conn, mbox);
     int minId = 0;
     int maxId = CHUNK_SIZE;
     while (minId <= mailboxMaxId) {
       for (BlobInfo blobInfo :
           DbBlobConsistency.getExternalMailItemBlobInfo(conn, mbox, minId, maxId)) {
         checkExternalBlob(mbox, checkSize, blobInfo, sm);
       }
       for (BlobInfo blobInfo :
           DbBlobConsistency.getExternalMailItemDumpsterBlobInfo(conn, mbox, minId, maxId)) {
         checkExternalBlob(mbox, checkSize, blobInfo, sm);
       }
       for (BlobInfo blobInfo :
           DbBlobConsistency.getExternalRevisionBlobInfo(conn, mbox, minId, maxId)) {
         checkExternalBlob(mbox, checkSize, blobInfo, sm);
       }
       for (BlobInfo blobInfo :
           DbBlobConsistency.getExternalRevisionDumpsterBlobInfo(conn, mbox, minId, maxId)) {
         checkExternalBlob(mbox, checkSize, blobInfo, sm);
       }
       minId = maxId + 1;
       maxId += CHUNK_SIZE;
     }
   } finally {
     DbPool.quietClose(conn);
   }
   for (String unexpected : unexpectedBlobPaths) {
     BlobInfo bi = new BlobInfo();
     bi.external = true;
     bi.locator = unexpected;
     bi.path = unexpected;
     results.unexpectedBlobs.put(0, bi);
     try {
       Blob blob = sm.getLocalBlob(mbox, unexpected, false);
       bi.fileSize = blob.getFile().length();
     } catch (IOException ioe) {
       // log this?
       bi.fileSize = 0L;
       bi.fetchException = ioe;
     }
   }
   return results;
 }