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; } }
/** * Persists a regular database version to the local database by using * {@link SqlDatabase#writeDatabaseVersion(DatabaseVersion)}. */ private void persistDatabaseVersion(MemoryDatabase winnersDatabase, DatabaseVersionHeader currentDatabaseVersionHeader) { logger.log(Level.INFO, " + Applying database version " + currentDatabaseVersionHeader.getVectorClock()); DatabaseVersion applyDatabaseVersion = winnersDatabase.getDatabaseVersion(currentDatabaseVersionHeader.getVectorClock()); logger.log(Level.FINE, " + Contents: " + applyDatabaseVersion); localDatabase.writeDatabaseVersion(applyDatabaseVersion); }
public void addDatabaseVersion(DatabaseVersion databaseVersion) { databaseVersions.add(databaseVersion); // Populate caches // WARNING: Do NOT reorder, order important!! updateDatabaseVersionIdCache(databaseVersion); updateFullDatabaseVersionCache(databaseVersion); updateFilenameHistoryCache(); updateContentChecksumCache(); }
/** * 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; }
MemoryDatabase memoryDatabase = new MemoryDatabase(); memoryDatabase.addDatabaseVersion(databaseVersion); dao.save(memoryDatabase.getDatabaseVersions(), config.getTransactionDatabaseFile(databaseVersionClock));
/** * 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); }
MemoryDatabase winnerBranchDatabase = new MemoryDatabase(); String rangeClientName = null; VectorClock rangeVersionFrom = null; VectorClock rangeVersionTo = null; while (branchIndex < winnersApplyBranchList.size() && winnerBranchDatabase.getFileHistories().size() < MAX_FILES) { DatabaseVersionHeader currentDatabaseVersionHeader = winnersApplyBranchList.get(branchIndex); DatabaseVersionHeader nextDatabaseVersionHeader = (branchIndex + 1 < winnersApplyBranchList.size()) ? winnersApplyBranchList
MemoryDatabase muddyMultiChunksDatabase = new MemoryDatabase(); DatabaseReadType.FULL); boolean hasMuddyMultiChunks = muddyMultiChunksDatabase.getMultiChunks().size() > 0; muddyMultiChunksPerDatabaseVersion.put(muddyDatabaseVersionHeader, muddyMultiChunksDatabase.getMultiChunks());
public RestoreFileSystemAction(Config config, Assembler assembler, FileVersion fileVersion, String relativeTargetPath) { super(config, new MemoryDatabase(), assembler, null, fileVersion); this.relativeTargetPath = relativeTargetPath; }
MemoryDatabase deltaDatabase = new MemoryDatabase(); deltaDatabase.addDatabaseVersion(deltaDatabaseVersion);
FileContent winningFileContent = winnersDatabase.getContent(fileVersion.getChecksum()); boolean winningFileHasContent = winningFileContent != null; MultiChunkId multiChunkIdForChunk = checksumsWithMultiChunkIds.get(chunkChecksum); if (multiChunkIdForChunk == null) { multiChunkIdForChunk = winnersDatabase.getMultiChunkIdForChunk(chunkChecksum);
if (elementPath.equalsIgnoreCase("/database/databaseVersions/databaseVersion")) { if (vectorClockInLoadRange) { database.addDatabaseVersion(databaseVersion); logger.log(Level.INFO, " + Added database version " + databaseVersion.getHeader());
for (PartialFileHistory winningFileHistory : winnersDatabase.getFileHistories()) { Map<FileHistoryId, FileVersion> winnerFileHistoryIdCache = fillFileHistoryIdCache(winnersDatabase.getFileHistories());
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 MemoryDatabase readDatabaseFileFromDisk(File databaseFile, Transformer transformer) throws IOException { MemoryDatabase db = new MemoryDatabase(); DatabaseXmlSerializer dao = new DatabaseXmlSerializer(transformer); dao.load(db, databaseFile, null, null, DatabaseReadType.FULL); return db; }
fileContent = memoryDatabase.getContent(fileVersion.getChecksum()); multiChunkIdForChunk = memoryDatabase.getMultiChunkIdForChunk(chunkChecksum);
public void removeDatabaseVersion(DatabaseVersion databaseVersion) { databaseVersions.remove(databaseVersion); // Populate caches // WARNING: Do NOT reorder, order important!! updateFullDatabaseVersionCache(); updateDatabaseVersionIdCache(); updateFilenameHistoryCache(); updateContentChecksumCache(); }
public static void writeDatabaseFileToDisk(MemoryDatabase db, File writtenDatabaseFile, Transformer transformer) throws IOException { DatabaseXmlSerializer dao = new DatabaseXmlSerializer(transformer); dao.save(db.getDatabaseVersions(), writtenDatabaseFile); }
applyChangesAndPersistDatabase(new MemoryDatabase(), cleanupOccurred, preDeleteFileHistoriesWithLastVersion);
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(); }