public Collection<PartialFileHistory> getFileHistories() { return fullDatabaseVersionCache.getFileHistories(); }
private void updateContentChecksumCache() { contentChecksumFileHistoriesCache.clear(); for (PartialFileHistory fullFileHistory : fullDatabaseVersionCache.getFileHistories()) { FileChecksum lastVersionChecksum = fullFileHistory.getLastVersion().getChecksum(); if (lastVersionChecksum != null) { List<PartialFileHistory> historiesWithVersionsWithSameChecksum = contentChecksumFileHistoriesCache.get(lastVersionChecksum); // Create if it does not exist if (historiesWithVersionsWithSameChecksum == null) { historiesWithVersionsWithSameChecksum = new ArrayList<PartialFileHistory>(); } // Add to cache historiesWithVersionsWithSameChecksum.add(fullFileHistory); contentChecksumFileHistoriesCache.put(lastVersionChecksum, historiesWithVersionsWithSameChecksum); } } }
private void updateFilenameHistoryCache() { // TODO [medium] Performance: This throws away the unchanged entries. It should only update new database version filenameHistoryCache.clear(); for (PartialFileHistory cacheFileHistory : fullDatabaseVersionCache.getFileHistories()) { FileVersion lastVersion = cacheFileHistory.getLastVersion(); String fileName = lastVersion.getPath(); if (lastVersion.getStatus() != FileStatus.DELETED) { filenameHistoryCache.put(fileName, cacheFileHistory); } } }
private void fireHasChangesEvent() { boolean firstNewFileDetected = newDatabaseVersion.getFileHistories().size() == 1; if (firstNewFileDetected) { // Only fires once! eventBus.post(new UpIndexChangesDetectedSyncExternalEvent(config.getLocalDir().getAbsolutePath())); } }
private PartialFileHistory getFileHistoryByPathFromDatabaseVersion(DatabaseVersion databaseVersion, String path) { // TODO [medium] Extremely performance intensive, because this is called inside a loop above. Implement better caching for database version!!! for (PartialFileHistory fileHistory : databaseVersion.getFileHistories()) { FileVersion lastVersion = fileHistory.getLastVersion(); if (lastVersion.getStatus() != FileStatus.DELETED && lastVersion.getPath().equals(path)) { return fileHistory; } } return null; }
private void indexWithNewFiles(List<File> files, List<File> deletedFiles, Queue<DatabaseVersion> databaseVersionQueue) throws IOException { boolean isFirstFile = true; int filesCount = files.size(); while (!files.isEmpty()) { DatabaseVersion newDatabaseVersion = new DatabaseVersion(); // Create the DeduperListener that will receive MultiChunks and store them in the DatabaseVersion object DeduperListener deduperListener = new IndexerDeduperListener(newDatabaseVersion); // Signal the start of indexing if we are about to deduplicate the first file if (isFirstFile) { deduperListener.onStart(files.size()); removeDeletedFiles(newDatabaseVersion, deletedFiles); // Add deletions in first database version isFirstFile = false; } // Find and index new files deduper.deduplicate(files, deduperListener); if (!newDatabaseVersion.getFileHistories().isEmpty()) { logger.log(Level.FINE, "Processed new database version: " + newDatabaseVersion); databaseVersionQueue.offer(newDatabaseVersion); int remainingFilesCount = filesCount - files.size(); eventBus.post(new UpIndexMidSyncExternalEvent(config.getLocalDir().toString(), filesCount, remainingFilesCount)); } //else { (comment-only else case) // Just chunks and multichunks, no filehistory. Since this means the file was being // written/vanished during operations, it makes no sense to upload it. If the user // wants it indexed, Up can be run again. //} } }
writeMultiChunks(xmlOut, databaseVersion.getMultiChunks()); writeFileContents(xmlOut, databaseVersion.getFileContents()); writeFileHistories(xmlOut, databaseVersion.getFileHistories());
/** * This method fills a {@link ChangeSet} with the files and changes that are uploaded, to include in * the {@link UpOperationResult}. * * @param newDatabaseVersion {@link DatabaseVersion} that contains the changes. * @param resultChanges {@ChangeSet} to which these changes are to be added. */ private void addNewDatabaseChangesToResultChanges(DatabaseVersion newDatabaseVersion, ChangeSet resultChanges) { for (PartialFileHistory partialFileHistory : newDatabaseVersion.getFileHistories()) { FileVersion lastFileVersion = partialFileHistory.getLastVersion(); switch (lastFileVersion.getStatus()) { case NEW: resultChanges.getNewFiles().add(lastFileVersion.getPath()); break; case CHANGED: case RENAMED: resultChanges.getChangedFiles().add(lastFileVersion.getPath()); break; case DELETED: resultChanges.getDeletedFiles().add(lastFileVersion.getPath()); break; } } }
fileHistoriesWithSameChecksum.removeAll(newDatabaseVersion.getFileHistories()); lastFileHistory = guessLastFileHistoryForFileWithMatchingChecksum(fileProperties, fileHistoriesWithSameChecksum);
for (PartialFileHistory fileHistory : databaseVersion.getFileHistories()) { FileVersion fileVersion = fileHistory.getLastVersion();
private long writeDatabaseVersion(Connection connection, DatabaseVersion databaseVersion) throws SQLException { long databaseVersionId = writeDatabaseVersionHeaderInternal(connection, databaseVersion.getHeader()); // TODO [low] Use writeDatabaseVersion()? writeVectorClock(connection, databaseVersionId, databaseVersion.getHeader().getVectorClock()); chunkDao.writeChunks(connection, databaseVersionId, databaseVersion.getChunks()); multiChunkDao.writeMultiChunks(connection, databaseVersionId, databaseVersion.getMultiChunks()); fileContentDao.writeFileContents(connection, databaseVersionId, databaseVersion.getFileContents()); fileHistoryDao.writeFileHistories(connection, databaseVersionId, databaseVersion.getFileHistories()); return databaseVersionId; }
@Override public DatabaseVersion clone() { DatabaseVersion clonedDatabaseVersion = new DatabaseVersion(); clonedDatabaseVersion.setHeader(getHeader()); for (ChunkEntry chunkEntry : getChunks()) { clonedDatabaseVersion.addChunk(chunkEntry); } for (MultiChunkEntry multiChunkEntry : getMultiChunks()) { clonedDatabaseVersion.addMultiChunk(multiChunkEntry); } for (FileContent fileContent : getFileContents()) { clonedDatabaseVersion.addFileContent(fileContent); } for (PartialFileHistory fileHistory : getFileHistories()) { clonedDatabaseVersion.addFileHistory(fileHistory); } return clonedDatabaseVersion; }
public static void assertDatabaseVersionEquals(DatabaseVersion expectedDatabaseVersion, DatabaseVersion actualDatabaseVersion) { assertVectorClockEquals(expectedDatabaseVersion.getVectorClock(), actualDatabaseVersion.getVectorClock()); compareDatabaseVersionChunks(expectedDatabaseVersion.getChunks(), actualDatabaseVersion.getChunks()); compareDatabaseVersionMultiChunks(expectedDatabaseVersion.getMultiChunks(), actualDatabaseVersion.getMultiChunks()); compareDatabaseVersionFileContents(expectedDatabaseVersion.getFileContents(), actualDatabaseVersion.getFileContents()); compareDatabaseVersionFileHistories(expectedDatabaseVersion.getFileHistories(), actualDatabaseVersion.getFileHistories()); }
for (PartialFileHistory sourceFileHistory : newDatabaseVersion.getFileHistories()) { PartialFileHistory targetFileHistory = fullDatabaseVersionCache.getFileHistory(sourceFileHistory.getFileHistoryId());