- public static <T extends DataObject> void write(DataBroker broker, LogicalDatastoreType datastoreType,
- InstanceIdentifier<T> path, T data) {
- WriteTransaction tx = broker.newWriteOnlyTransaction();
- tx.put(datastoreType, path, data, true);
- tx.submit();
+
+ public static <T extends DataObject> void write(DataBroker broker, final LogicalDatastoreType datastoreType,
+ final InstanceIdentifier<T> path, final T data) {
+ threadPool.submit(new MdsalDsTask<>(datastoreType, path, data, TransactionType.WRITE));
+ }
+
+ static <T extends DataObject> void delete(DataBroker broker, final LogicalDatastoreType datastoreType,
+ final InstanceIdentifier<T> path) {
+ threadPool.submit(new MdsalDsTask<>(datastoreType, path, null, TransactionType.DELETE));
+ }
+
+ static enum TransactionType {
+ WRITE, UPDATE, DELETE;
+ }
+
+ static class MdsalDsTask<T extends DataObject> implements Runnable {
+ LogicalDatastoreType datastoreType;
+ InstanceIdentifier<T> path;
+ T data;
+ TransactionType type;
+
+ public MdsalDsTask(LogicalDatastoreType datastoreType, InstanceIdentifier<T> path, T data, TransactionType type) {
+ this.datastoreType = datastoreType;
+ this.path = path;
+ this.data = data;
+ this.type = type;
+ }
+
+ @Override
+ public void run() {
+ try {
+ LOG.trace("BgpUtil MDSAL task started ");
+ WriteTransaction tx = getTransactionChain().newWriteOnlyTransaction();
+ switch (type) {
+ case WRITE:
+ tx.put(datastoreType, path, data, true);
+ break;
+ case UPDATE:
+ tx.merge(datastoreType, path, data, true);
+ break;
+ case DELETE:
+ tx.delete(datastoreType, path);
+ break;
+ default:
+ LOG.error("Invalid Transaction type: {}", type);
+ }
+ pendingWrTransaction.incrementAndGet();
+ addFutureCallback(tx, path, data);
+ LOG.trace("Transaction type: {} submitted", type);
+ } catch (final Exception e) {
+ LOG.error("TxChain transaction submission failed, re-init TxChain", e);
+ initTransactionChain();
+ }
+ }