public OnlineBackup full(String targetDirectory, boolean verification) {
    if (directoryContainsDb(targetDirectory)) {
      throw new RuntimeException(targetDirectory + " already contains a database");
    }

    BackupClient client =
        new BackupClient(hostNameOrIp, port, StringLogger.DEV_NULL, Client.NO_STORE_ID_GETTER);
    try {
      Response<Void> response = client.fullBackup(new ToFileStoreWriter(targetDirectory));
      GraphDatabaseService targetDb =
          startTemporaryDb(targetDirectory, VerificationLevel.NONE /* run full check instead */);
      try {
        unpackResponse(response, targetDb, MasterUtil.txHandlerForFullCopy());
      } finally {
        targetDb.shutdown();
      }
      if (verification) {
        StoreAccess newStore = new StoreAccess(targetDirectory);
        try {
          ConsistencyCheck.run(newStore, false);
        } finally {
          newStore.close();
        }
      }
    } finally {
      client.shutdown();
    }
    return this;
  }
 public final <T extends CommonAbstractStore, R extends Abstract64BitRecord> void process(
     RecordProcessor<R> processor, StoreAccess<T, R> store, Filter<? super R>... filters) {
   long highId = store.getHighId();
   System.err.printf("%s for %s records%n", processor, Long.toString(highId));
   int lastPercent = 0;
   for (R record : store.scan(filters)) {
     processor.process(record);
     int permille = (int) ((record.getId() * 1000L) / highId);
     if (permille != lastPercent) progress(lastPercent = permille);
   }
   if (lastPercent != 1000) progress(1000);
 }