import static java.util.Objects.requireNonNull;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
import org.opendaylight.mdsal.binding.api.DataBroker;
import org.opendaylight.mdsal.binding.api.ReadTransaction;
-import org.opendaylight.mdsal.binding.api.Transaction;
import org.opendaylight.mdsal.binding.api.TransactionChain;
-import org.opendaylight.mdsal.binding.api.TransactionChainListener;
import org.opendaylight.mdsal.binding.api.WriteTransaction;
import org.opendaylight.mdsal.common.api.CommitInfo;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.mapping.database.LastUpdated;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.mapping.database.LastUpdatedBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.mapping.database.VirtualNetworkIdentifier;
+import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Empty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
*
* @author Lorand Jakab
*/
-public class DataStoreBackEnd implements TransactionChainListener {
+public class DataStoreBackEnd {
private static final Logger LOG = LoggerFactory.getLogger(DataStoreBackEnd.class);
private static final InstanceIdentifier<MappingDatabase> DATABASE_ROOT =
InstanceIdentifier.create(MappingDatabase.class);
@SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR", justification = "Non-final for mocking")
public DataStoreBackEnd(DataBroker broker) {
LOG.debug("Creating DataStoreBackEnd transaction chain...");
- configTxChain = broker.createMergingTransactionChain(this);
- operTxChain = broker.createMergingTransactionChain(this);
+ configTxChain = broker.createMergingTransactionChain();
+ operTxChain = broker.createMergingTransactionChain();
+ configTxChain.addCallback(new FutureCallback<Empty>() {
+ @Override
+ public void onSuccess(Empty result) {
+ onTransactionChainSuccessful(configTxChain);
+ }
+
+ @Override
+ public void onFailure(Throwable cause) {
+ onTransactionChainFailed(configTxChain, cause);
+ }
+ });
+ operTxChain.addCallback(new FutureCallback<Empty>() {
+ @Override
+ public void onSuccess(Empty result) {
+ onTransactionChainSuccessful(operTxChain);
+ }
+
+ @Override
+ public void onFailure(Throwable cause) {
+ onTransactionChainFailed(operTxChain, cause);
+ }
+ });
}
public void addAuthenticationKey(AuthenticationKey authenticationKey) {
public void saveLastUpdateTimestamp() {
Long timestamp = System.currentTimeMillis();
- LOG.debug("MD-SAL: Saving last update timestamp to operational datastore: {}", new Date(timestamp).toString());
+ LOG.debug("MD-SAL: Saving last update timestamp to operational datastore: {}", new Date(timestamp));
writePutTransaction(LAST_UPDATED, new LastUpdatedBuilder().setLastUpdated(timestamp).build(),
LogicalDatastoreType.OPERATIONAL, "Couldn't save last update timestamp to operational datastore");
}
};
}
- private <U extends org.opendaylight.yangtools.yang.binding.DataObject> void writePutTransaction(
- InstanceIdentifier<U> addIID, U data, LogicalDatastoreType logicalDatastoreType, String errMsg) {
+ private <U extends DataObject> void writePutTransaction(InstanceIdentifier<U> addIID, U data,
+ LogicalDatastoreType logicalDatastoreType, String errMsg) {
WriteTransaction writeTx = getChain(logicalDatastoreType).newWriteOnlyTransaction();
// TODO: is is a utility method, hence we do not have enough lifecycle knowledge to use plain put()
writeTx.mergeParentStructurePut(logicalDatastoreType, addIID, data);
writeTx.commit().addCallback(new FutureCallback<CommitInfo>() {
-
@Override
public void onSuccess(CommitInfo result) {
+ // No-op
}
@Override
}, MoreExecutors.directExecutor());
}
- private <U extends org.opendaylight.yangtools.yang.binding.DataObject> U readTransaction(
- InstanceIdentifier<U> readIID, LogicalDatastoreType logicalDatastoreType) {
+ private <U extends DataObject> U readTransaction(InstanceIdentifier<U> readIID,
+ LogicalDatastoreType logicalDatastoreType) {
final ListenableFuture<Optional<U>> readFuture;
try (ReadTransaction readTx = getChain(logicalDatastoreType).newReadOnlyTransaction()) {
readFuture = readTx.read(logicalDatastoreType, readIID);
try {
Optional<U> optionalDataObject = readFuture.get();
if (optionalDataObject != null && optionalDataObject.isPresent()) {
- return optionalDataObject.get();
+ return optionalDataObject.orElseThrow();
} else {
LOG.debug("{}: Failed to read", Thread.currentThread().getStackTrace()[1]);
}
return null;
}
- private <U extends org.opendaylight.yangtools.yang.binding.DataObject> void deleteTransaction(
- InstanceIdentifier<U> deleteIID, LogicalDatastoreType logicalDatastoreType, String errMsg) {
+ private <U extends DataObject> void deleteTransaction(InstanceIdentifier<U> deleteIID,
+ LogicalDatastoreType logicalDatastoreType, String errMsg) {
WriteTransaction writeTx = getChain(logicalDatastoreType).newWriteOnlyTransaction();
writeTx.delete(logicalDatastoreType, deleteIID);
writeTx.commit().addCallback(new FutureCallback<CommitInfo>() {
}, MoreExecutors.directExecutor());
}
- @Override
- public void onTransactionChainFailed(TransactionChain chain, Transaction transaction, Throwable cause) {
- LOG.error("Broken chain {} in DataStoreBackEnd, transaction {}, cause {}", chain, transaction.getIdentifier(),
- cause.getMessage());
+ @VisibleForTesting
+ void onTransactionChainFailed(TransactionChain chain, Throwable cause) {
+ LOG.error("Broken chain {} in DataStoreBackEnd, cause {}", chain, cause.getMessage());
}
- @Override
- public void onTransactionChainSuccessful(TransactionChain chain) {
+ @VisibleForTesting
+ void onTransactionChainSuccessful(TransactionChain chain) {
LOG.info("DataStoreBackEnd closed successfully, chain {}", chain);
}