*/
package org.opendaylight.controller.cluster.databroker;
-import com.google.common.base.Preconditions;
+import static java.util.Objects.requireNonNull;
+
+import java.util.ArrayList;
+import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
-import javax.annotation.concurrent.GuardedBy;
+import org.checkerframework.checker.lock.qual.GuardedBy;
+import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
import org.opendaylight.controller.cluster.databroker.actors.dds.AbstractClientHandle;
import org.opendaylight.controller.cluster.databroker.actors.dds.ClientLocalHistory;
import org.opendaylight.controller.cluster.databroker.actors.dds.ClientSnapshot;
import org.opendaylight.controller.cluster.databroker.actors.dds.ClientTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionChainClosedException;
-import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadTransaction;
-import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadWriteTransaction;
-import org.opendaylight.controller.sal.core.spi.data.DOMStoreTransactionChain;
-import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction;
+import org.opendaylight.mdsal.dom.spi.store.DOMStoreReadTransaction;
+import org.opendaylight.mdsal.dom.spi.store.DOMStoreReadWriteTransaction;
+import org.opendaylight.mdsal.dom.spi.store.DOMStoreTransactionChain;
+import org.opendaylight.mdsal.dom.spi.store.DOMStoreWriteTransaction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private final Map<AbstractClientHandle<?>, Boolean> openSnapshots = new WeakHashMap<>();
private final ClientLocalHistory history;
+ private final boolean debugAllocation;
- ClientBackedTransactionChain(final ClientLocalHistory history) {
- this.history = Preconditions.checkNotNull(history);
+ ClientBackedTransactionChain(final ClientLocalHistory history, final boolean debugAllocation) {
+ this.history = requireNonNull(history);
+ this.debugAllocation = debugAllocation;
}
@Override
public DOMStoreReadTransaction newReadOnlyTransaction() {
- return new ClientBackedReadTransaction(createSnapshot(), this);
+ return new ClientBackedReadTransaction(createSnapshot(), this, allocationContext());
}
@Override
public DOMStoreReadWriteTransaction newReadWriteTransaction() {
- return new ClientBackedReadWriteTransaction(createTransaction());
+ return new ClientBackedReadWriteTransaction(createTransaction(), allocationContext());
}
@Override
public DOMStoreWriteTransaction newWriteOnlyTransaction() {
- return new ClientBackedWriteTransaction(createTransaction());
+ return new ClientBackedWriteTransaction(createTransaction(), allocationContext());
}
@Override
public synchronized void close() {
+ final List<TransactionIdentifier> abortedSnapshots = new ArrayList<>();
for (AbstractClientHandle<?> snap : openSnapshots.keySet()) {
- LOG.warn("Aborting unclosed transaction {}", snap.getIdentifier());
- snap.abort();
+ final TransactionIdentifier id = snap.getIdentifier();
+ LOG.debug("Aborting recorded transaction {}", id);
+ if (snap.abort()) {
+ abortedSnapshots.add(id);
+ }
}
openSnapshots.clear();
+ if (!abortedSnapshots.isEmpty()) {
+ LOG.warn("Aborted unclosed transactions {}", abortedSnapshots, new Throwable("at"));
+ }
history.close();
}
}
private ClientSnapshot createSnapshot() {
- try {
- return recordSnapshot(history.takeSnapshot());
- } catch (org.opendaylight.mdsal.common.api.TransactionChainClosedException e) {
- throw new TransactionChainClosedException("Transaction chain has been closed", e);
- }
+ return recordSnapshot(history.takeSnapshot());
}
private ClientTransaction createTransaction() {
- try {
- return recordSnapshot(history.createTransaction());
- } catch (org.opendaylight.mdsal.common.api.TransactionChainClosedException e) {
- throw new TransactionChainClosedException("Transaction chain has been closed", e);
- }
+ return recordSnapshot(history.createTransaction());
+ }
+
+ private Throwable allocationContext() {
+ return debugAllocation ? new Throwable("allocated at") : null;
}
private synchronized <T extends AbstractClientHandle<?>> T recordSnapshot(final T snapshot) {