package org.opendaylight.controller.cluster.datastore;
import com.google.common.base.Preconditions;
-import org.opendaylight.controller.cluster.access.commands.DeadTransactionException;
-import org.opendaylight.controller.cluster.access.commands.LocalHistorySuccess;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.RangeSet;
+import com.google.common.collect.TreeRangeSet;
+import com.google.common.primitives.UnsignedLong;
+import java.util.HashMap;
+import java.util.Map;
import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
import org.opendaylight.controller.cluster.access.concepts.RequestException;
import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* @author Robert Varga
*/
final class LocalFrontendHistory extends AbstractFrontendHistory {
- private enum State {
- OPEN,
- CLOSED,
- }
-
- private static final Logger LOG = LoggerFactory.getLogger(LocalFrontendHistory.class);
-
private final ShardDataTreeTransactionChain chain;
- private Long lastSeenTransaction;
- private State state = State.OPEN;
-
- LocalFrontendHistory(final String persistenceId, final ShardDataTreeTransactionChain chain) {
- super(persistenceId);
+ private LocalFrontendHistory(final String persistenceId, final ShardDataTree tree,
+ final ShardDataTreeTransactionChain chain, final Map<UnsignedLong, Boolean> closedTransactions,
+ final RangeSet<UnsignedLong> purgedTransactions) {
+ super(persistenceId, tree, closedTransactions, purgedTransactions);
this.chain = Preconditions.checkNotNull(chain);
}
+ static LocalFrontendHistory create(final String persistenceId, final ShardDataTree tree,
+ final LocalHistoryIdentifier historyId) {
+ return new LocalFrontendHistory(persistenceId, tree, tree.ensureTransactionChain(historyId), ImmutableMap.of(),
+ TreeRangeSet.create());
+ }
+
+ static LocalFrontendHistory recreate(final String persistenceId, final ShardDataTree tree,
+ final ShardDataTreeTransactionChain chain, final Map<UnsignedLong, Boolean> closedTransactions,
+ final RangeSet<UnsignedLong> purgedTransactions) {
+ return new LocalFrontendHistory(persistenceId, tree, chain, new HashMap<>(closedTransactions),
+ TreeRangeSet.create(purgedTransactions));
+ }
+
@Override
public LocalHistoryIdentifier getIdentifier() {
return chain.getIdentifier();
}
+ @Override
+ FrontendTransaction createOpenSnapshot(final TransactionIdentifier id) throws RequestException {
+ return FrontendReadOnlyTransaction.create(this, chain.newReadOnlyTransaction(id));
+ }
+
@Override
FrontendTransaction createOpenTransaction(final TransactionIdentifier id) throws RequestException {
- checkDeadTransaction(id);
- lastSeenTransaction = id.getTransactionId();
- return FrontendTransaction.createOpen(this, chain.newReadWriteTransaction(id));
+ return FrontendReadWriteTransaction.createOpen(this, chain.newReadWriteTransaction(id));
}
@Override
FrontendTransaction createReadyTransaction(final TransactionIdentifier id, final DataTreeModification mod)
throws RequestException {
- checkDeadTransaction(id);
- lastSeenTransaction = id.getTransactionId();
- return FrontendTransaction.createReady(this, id, mod);
+ return FrontendReadWriteTransaction.createReady(this, id, mod);
}
@Override
- ShardDataTreeCohort createReadyCohort(final TransactionIdentifier id, final DataTreeModification mod) {
- return chain.createReadyCohort(id, mod);
- }
-
- LocalHistorySuccess destroy(final long sequence) throws RequestException {
- if (state != State.CLOSED) {
- LOG.debug("{}: closing history {}", persistenceId(), getIdentifier());
-
- // FIXME: add any finalization as needed
- state = State.CLOSED;
- }
-
- // FIXME: record a DESTROY tombstone in the journal
- return new LocalHistorySuccess(getIdentifier(), sequence);
+ ShardDataTreeCohort createFailedCohort(final TransactionIdentifier id, final DataTreeModification mod,
+ final Exception failure) {
+ return chain.createFailedCohort(id, mod, failure);
}
- boolean isDestroyed() {
- return state == State.CLOSED;
- }
-
- private void checkDeadTransaction(final TransactionIdentifier id) throws RequestException {
- // FIXME: check if this history is still open
- // FIXME: check if the last transaction has been submitted
-
- // Transaction identifiers within a local history have to have increasing IDs
- if (lastSeenTransaction != null && Long.compareUnsigned(lastSeenTransaction, id.getTransactionId()) >= 0) {
- throw new DeadTransactionException(lastSeenTransaction);
- }
+ @Override
+ ShardDataTreeCohort createReadyCohort(final TransactionIdentifier id, final DataTreeModification mod) {
+ return chain.createReadyCohort(id, mod);
}
}