/** * Read the given database files into individual per-user {@link DatabaseBranch}es. This method only * reads the headers from the local database files, and not the entire databases into memory. * * <p>The returned database branches contain only the per-client {@link DatabaseVersionHeader}s, and not * the entire stitched branches, i.e. A's database branch will only contain database version headers from A. */ private SortedMap<DatabaseRemoteFile, List<DatabaseVersion>> readUnknownDatabaseVersionHeaders(SortedMap<File, DatabaseRemoteFile> remoteDatabases) throws IOException, StorageException { logger.log(Level.INFO, "Loading database headers, creating branches ..."); // Read database files SortedMap<DatabaseRemoteFile, List<DatabaseVersion>> remoteDatabaseHeaders = new TreeMap<DatabaseRemoteFile, List<DatabaseVersion>>(); for (Map.Entry<File, DatabaseRemoteFile> remoteDatabaseFileEntry : remoteDatabases.entrySet()) { MemoryDatabase remoteDatabase = new MemoryDatabase(); // Database cannot be reused, since these might be different clients File remoteDatabaseFileInCache = remoteDatabaseFileEntry.getKey(); DatabaseRemoteFile remoteDatabaseFile = remoteDatabaseFileEntry.getValue(); databaseSerializer.load(remoteDatabase, remoteDatabaseFileInCache, null, null, DatabaseReadType.HEADER_ONLY); // only load headers! remoteDatabaseHeaders.put(remoteDatabaseFile, remoteDatabase.getDatabaseVersions()); } return remoteDatabaseHeaders; }
/** * Serializes a {@link MemoryDatabase} to a file, using the configured transformer. */ protected void saveDeltaDatabase(MemoryDatabase db, File localDatabaseFile) throws IOException { logger.log(Level.INFO, "- Saving database to " + localDatabaseFile + " ..."); DatabaseXmlSerializer dao = new DatabaseXmlSerializer(config.getTransformer()); dao.save(db.getDatabaseVersions(), localDatabaseFile); }
private Collection<DatabaseVersion> attemptResumeDatabaseVersions(Collection<Long> versions) throws Exception { try { Collection<DatabaseVersion> databaseVersions = new ArrayList<>(); for (Long version : versions) { File databaseFile = config.getTransactionDatabaseFile(version); // If a single database file is missing, we should restart if (!databaseFile.exists()) { return null; } DatabaseXmlSerializer databaseSerializer = new DatabaseXmlSerializer(); MemoryDatabase memoryDatabase = new MemoryDatabase(); databaseSerializer.load(memoryDatabase, databaseFile, null, null, DatabaseReadType.FULL); if (memoryDatabase.getDatabaseVersions().size() == 0) { return null; } databaseVersions.add(memoryDatabase.getLastDatabaseVersion()); } return databaseVersions; } catch (Exception e) { logger.log(Level.WARNING, "Cannot load database versions from 'state'. Cannot resume."); return null; } }
dao.save(memoryDatabase.getDatabaseVersions(), config.getTransactionDatabaseFile(databaseVersionClock));
public static void assertDatabaseEquals(MemoryDatabase expectedDatabase, MemoryDatabase actualDatabase) { logger.log(Level.INFO, "--"); logger.log(Level.INFO, "Now comparing two databases."); logger.log(Level.INFO, "DON'T WORRY. This can take a long time or even overload the heap space."); List<DatabaseVersion> writtenDatabaseVersions = expectedDatabase.getDatabaseVersions(); List<DatabaseVersion> readDatabaseVersions = actualDatabase.getDatabaseVersions(); assertEquals("Different number of database versions.", writtenDatabaseVersions.size(), readDatabaseVersions.size()); for (DatabaseVersion writtenDatabaseVersion : writtenDatabaseVersions) { DatabaseVersion readDatabaseVersion = null; for (DatabaseVersion aReadDatabaseVersion : readDatabaseVersions) { if (aReadDatabaseVersion.equals(writtenDatabaseVersion)) { readDatabaseVersion = aReadDatabaseVersion; break; } } assertNotNull("Database version " + writtenDatabaseVersion + " does not exist in read database.", readDatabaseVersion); assertDatabaseVersionEquals(writtenDatabaseVersion, readDatabaseVersion); } logger.log(Level.INFO, "End of comparing databases"); logger.log(Level.INFO, "--"); }
public static void writeDatabaseFileToDisk(MemoryDatabase db, File writtenDatabaseFile, Transformer transformer) throws IOException { DatabaseXmlSerializer dao = new DatabaseXmlSerializer(transformer); dao.save(db.getDatabaseVersions(), writtenDatabaseFile); }
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(); }