public DatabaseBranch getBranch(String client, boolean createIfNotExistant) { DatabaseBranch branch = branches.get(client); if (branch == null && createIfNotExistant) { branch = new DatabaseBranch(); branches.put(client, branch); } return branch; }
/** * This method uses the {@link DatabaseReconciliator} to compare the local database with the * downloaded remote databases, in order to determine a winner. The winner's database versions * will be applied locally. * * <p>For the comparison, the {@link DatabaseVersionHeader}s (mainly the {@link VectorClock}) of each * database version are compared. Using these vector clocks, the underlying algorithms determine * potential conflicts (between database versions, = simultaneous vector clocks), and resolve these * conflicts by comparing local timestamps. * * <p>The detailed algorithm is described in the {@link DatabaseReconciliator}. * * @param localBranch Local database branch (extracted from the local database) * @param allStitchedBranches The newly downloaded remote database version headers (= branches) * @return Returns the branch of the winner * @throws Exception If any kind of error occurs (...) */ private Map.Entry<String, DatabaseBranch> determineWinnerBranch(DatabaseBranches allStitchedBranches) throws Exception { logger.log(Level.INFO, "Determine winner using database reconciliator ..."); Entry<String, DatabaseBranch> winnersBranch = databaseReconciliator.findWinnerBranch(allStitchedBranches); if (winnersBranch != null) { return winnersBranch; } else { return new AbstractMap.SimpleEntry<String, DatabaseBranch>("", new DatabaseBranch()); } }
@Override public DatabaseBranch clone() { DatabaseBranch clonedBranch = new DatabaseBranch(); clonedBranch.addAll(getAll()); return clonedBranch; }
public DatabaseBranch getLocalDatabaseBranch() { DatabaseBranch databaseBranch = new DatabaseBranch();
public DatabaseBranch findWinnersApplyBranch(DatabaseBranch losersBranch, DatabaseBranch winnersBranch) { logger.log(Level.INFO, "Finding winnersApplyBranch."); logger.log(Level.INFO, "Losers Branch: " + losersBranch); logger.log(Level.INFO, "Winners Branch: " + winnersBranch); DatabaseBranch winnersApplyBranch = new DatabaseBranch(); boolean applyBranchStarted = false; for (int i = 0; i < winnersBranch.size(); i++) { if (!applyBranchStarted) { if (i >= losersBranch.size() || !losersBranch.get(i).equals(winnersBranch.get(i))) { applyBranchStarted = true; } } if (applyBranchStarted) { winnersApplyBranch.add(winnersBranch.get(i)); } } return winnersApplyBranch; }
public static DatabaseBranch createBranch(String[] databaseVersionHeaderStrings) throws Exception { DatabaseBranch branch = new DatabaseBranch(); for (String databaseVersionHeaderString : databaseVersionHeaderStrings) { DatabaseVersionHeader databaseVersionHeader = createFromString(databaseVersionHeaderString); branch.add(databaseVersionHeader); } return branch; }
private void applyChangesAndPersistDatabase(MemoryDatabase winnersDatabase, boolean cleanupOccurred, List<PartialFileHistory> preDeleteFileHistoriesWithLastVersion) throws Exception { if (options.isApplyChanges()) { new ApplyChangesOperation(config, localDatabase, transferManager, winnersDatabase, result, cleanupOccurred, preDeleteFileHistoriesWithLastVersion).execute(); } else { logger.log(Level.INFO, "Doing nothing on the file system, because --no-apply switched on"); } // We only persist the versions that we have already applied. DatabaseBranch currentApplyBranch = new DatabaseBranch(); for (DatabaseVersion databaseVersion : winnersDatabase.getDatabaseVersions()) { currentApplyBranch.add(databaseVersion.getHeader()); } persistDatabaseVersions(currentApplyBranch, winnersDatabase); localDatabase.commit(); }
DatabaseBranch winnersBranch = new DatabaseBranch(); DatabaseVersionHeaderComparator databaseVersionHeaderComparator = new DatabaseVersionHeaderComparator(false);
public DatabaseBranch findLosersPruneBranch(DatabaseBranch losersBranch, DatabaseBranch winnersBranch) { DatabaseBranch losersPruneBranch = new DatabaseBranch(); boolean pruneBranchStarted = false; for (int i = 0; i < losersBranch.size(); i++) { if (pruneBranchStarted) { losersPruneBranch.add(losersBranch.get(i)); } else if (i < winnersBranch.size() && !losersBranch.get(i).equals(winnersBranch.get(i))) { pruneBranchStarted = true; losersPruneBranch.add(losersBranch.get(i)); } } return losersPruneBranch; }
localDatabase.writeCleanupTime(System.currentTimeMillis() / 1000); localBranch = new DatabaseBranch();