package com.constellio.data.dao.services.transactionLog.replay; import java.io.File; import java.util.Iterator; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.constellio.data.dao.services.DataLayerLogger; import com.constellio.data.dao.services.bigVault.solr.BigVaultServer; import com.constellio.data.dao.services.bigVault.solr.BigVaultServerTransaction; import com.constellio.data.dao.services.bigVault.solr.BigVaultServerTransactionCombinator; import com.constellio.data.dao.services.transactionLog.TransactionLogReadWriteServices; public class TransactionLogReplayServices { public static int PARALLELISM = 2; public static int MAX_TRANSACTION_SIZE = BigVaultServerTransactionCombinator.DEFAULT_MAX_TRANSACTION_SIZE; private static final Logger LOGGER = LoggerFactory.getLogger(TransactionLogReplayServices.class); private TransactionLogReadWriteServices readWriteServices; private BigVaultServer bigVaultServer; private DataLayerLogger dataLayerLogger; public TransactionLogReplayServices( TransactionLogReadWriteServices readWriteServices, BigVaultServer bigVaultServer, DataLayerLogger dataLayerLogger) { this.readWriteServices = readWriteServices; this.bigVaultServer = bigVaultServer; this.dataLayerLogger = dataLayerLogger; } private void replayTransactionLog(Iterator<BigVaultServerTransaction> transactionIterator, BigVaultLogAddUpdater addUpdater) { while (transactionIterator.hasNext()) { addUpdater.add(transactionIterator.next()); } } public void replayTransactionLogs(List<File> tLogs) { TransactionsLogImportHandler transactionsLogImportHandler = new TransactionsLogImportHandler( bigVaultServer, dataLayerLogger, PARALLELISM); transactionsLogImportHandler.start(); BigVaultLogAddUpdater addUpdater = new BigVaultLogAddUpdater(transactionsLogImportHandler); TransactionLogReadWriteServices readerFactory = readWriteServices; for (File tLog : tLogs) { LOGGER.info("Replaying tlog '" + tLog.getName() + "'"); replayTransactionLog(readerFactory.newOperationsIterator(tLog), addUpdater); } addUpdater.close(); transactionsLogImportHandler.join(); } private static class BigVaultLogAddUpdater { TransactionsLogImportHandler replayHandler; BigVaultServerTransactionCombinator combinator; private BigVaultLogAddUpdater(TransactionsLogImportHandler replayHandler) { this.replayHandler = replayHandler; this.combinator = new BigVaultServerTransactionCombinator(MAX_TRANSACTION_SIZE); } private void add(BigVaultServerTransaction newTransaction) { if (combinator.canCombineWith(newTransaction)) { combinator.combineWith(newTransaction); } else { replayHandler.pushTransaction(combinator.combineAndClean()); combinator.combineWith(newTransaction); } } public void close() { if (combinator.hasData()) { replayHandler.pushTransaction(combinator.combineAndClean()); } } } }