public VectorClock getVectorClock() { return header.getVectorClock(); }
/** * 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); }
private int compareByVectorClock(DatabaseVersionHeader dbvh1, DatabaseVersionHeader dbvh2) { VectorClockComparison vectorClockComparison = VectorClock.compare(dbvh1.getVectorClock(), dbvh2.getVectorClock()); if (vectorClockComparison == VectorClockComparison.SIMULTANEOUS || vectorClockComparison == VectorClockComparison.EQUAL) { if (considerTime) { return compareByTimestamp(dbvh1, dbvh2); } else { return 0; } } return vectorClockComparison == VectorClockComparison.SMALLER ? -1 : 1; }
private long writeDatabaseVersionHeaderInternal(Connection connection, DatabaseVersionHeader databaseVersionHeader) throws SQLException { try (PreparedStatement preparedStatement = connection.prepareStatement( DatabaseConnectionFactory.getStatement("databaseversion.insert.all.writeDatabaseVersion.sql"), Statement.RETURN_GENERATED_KEYS)) { preparedStatement.setString(1, DatabaseVersionStatus.MASTER.toString()); preparedStatement.setTimestamp(2, new Timestamp(databaseVersionHeader.getDate().getTime())); preparedStatement.setString(3, databaseVersionHeader.getClient()); preparedStatement.setString(4, databaseVersionHeader.getVectorClock().toString()); int affectedRows = preparedStatement.executeUpdate(); if (affectedRows == 0) { throw new SQLException("Cannot add database version header. Affected rows is zero."); } try (ResultSet resultSet = preparedStatement.getGeneratedKeys()) { if (resultSet.next()) { return resultSet.getLong(1); } else { throw new SQLException("Cannot get new database version ID"); } } } }
public void writeMuddyMultiChunks(Map<DatabaseVersionHeader, Collection<MultiChunkEntry>> muddyMultiChunksPerDatabaseVersion) throws SQLException { PreparedStatement preparedStatement = getStatement("multichunk_muddy.insert.muddy.writeMuddyMultiChunks.sql"); for (DatabaseVersionHeader muddyDatabaseVersionHeader : muddyMultiChunksPerDatabaseVersion.keySet()) { Collection<MultiChunkEntry> muddyMultiChunks = muddyMultiChunksPerDatabaseVersion.get(muddyDatabaseVersionHeader); for (MultiChunkEntry muddyMultiChunk : muddyMultiChunks) { String multiChunkIdStr = muddyMultiChunk.getId().toString(); String clientName = muddyDatabaseVersionHeader.getClient(); Long clientVersion = muddyDatabaseVersionHeader.getVectorClock().getClock(clientName); preparedStatement.setString(1, multiChunkIdStr); preparedStatement.setString(2, clientName); preparedStatement.setLong(3, clientVersion); preparedStatement.addBatch(); } } preparedStatement.executeBatch(); preparedStatement.close(); }
rangeVersionFrom = currentDatabaseVersionHeader.getVectorClock(); rangeVersionTo = currentDatabaseVersionHeader.getVectorClock(); rangeVersionTo = currentDatabaseVersionHeader.getVectorClock();
protected DatabaseVersion createDatabaseVersionFromRow(ResultSet resultSet, boolean excludeChunkData, int fileHistoryMaxCount) throws SQLException { DatabaseVersionHeader databaseVersionHeader = createDatabaseVersionHeaderFromRow(resultSet); DatabaseVersion databaseVersion = new DatabaseVersion(); databaseVersion.setHeader(databaseVersionHeader); // Add chunk/multichunk/filecontent data if (!excludeChunkData) { Map<ChunkChecksum, ChunkEntry> chunks = chunkDao.getChunks(databaseVersionHeader.getVectorClock()); Map<MultiChunkId, MultiChunkEntry> multiChunks = multiChunkDao.getMultiChunks(databaseVersionHeader.getVectorClock()); Map<FileChecksum, FileContent> fileContents = fileContentDao.getFileContents(databaseVersionHeader.getVectorClock()); for (ChunkEntry chunk : chunks.values()) { databaseVersion.addChunk(chunk); } for (MultiChunkEntry multiChunk : multiChunks.values()) { databaseVersion.addMultiChunk(multiChunk); } for (FileContent fileContent : fileContents.values()) { databaseVersion.addFileContent(fileContent); } } // Add file histories Map<FileHistoryId, PartialFileHistory> fileHistories = fileHistoryDao .getFileHistoriesWithFileVersions(databaseVersionHeader.getVectorClock(), fileHistoryMaxCount); for (PartialFileHistory fileHistory : fileHistories.values()) { databaseVersion.addFileHistory(fileHistory); } return databaseVersion; }
currentDatabaseVersionHeader.getVectorClock().setClock(resultSet.getString("vc_client"), resultSet.getLong("vc_logicaltime"));
VectorClock fromVersion = muddyDatabaseVersionHeader.getVectorClock(); VectorClock toVersion = muddyDatabaseVersionHeader.getVectorClock();
localDatabase.markDatabaseVersionDirty(databaseVersionHeader.getVectorClock()); long remoteFileToPruneVersion = databaseVersionHeader.getVectorClock().getClock(config.getMachineName()); DatabaseRemoteFile remoteFileToPrune = new DatabaseRemoteFile(remoteFileToPruneClientName, remoteFileToPruneVersion);
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; }
VectorClock lastVectorClock = (lastDatabaseVersionHeader != null) ? lastDatabaseVersionHeader.getVectorClock() : new VectorClock();
public static DatabaseVersion createDatabaseVersion(DatabaseVersionHeader basedOnDatabaseVersionHeader, Date date) { VectorClock vectorClock = (basedOnDatabaseVersionHeader != null) ? basedOnDatabaseVersionHeader.getVectorClock().clone() : new VectorClock(); vectorClock.incrementClock("someclient"); DatabaseVersion databaseVersion = new DatabaseVersion(); databaseVersion.setClient("someclient"); databaseVersion.setTimestamp(date); databaseVersion.setVectorClock(vectorClock); return databaseVersion; } }