2 * Copyright © 2017 Orange, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.transportpce.common.network;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.util.concurrent.FluentFuture;
13 import com.google.common.util.concurrent.ListenableFuture;
14 import java.util.Optional;
15 import java.util.concurrent.locks.ReentrantReadWriteLock;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.opendaylight.mdsal.binding.api.DataBroker;
18 import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
19 import org.opendaylight.mdsal.common.api.CommitInfo;
20 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
21 import org.opendaylight.yangtools.yang.binding.DataObject;
22 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
26 public class RequestProcessor {
28 private static final Logger LOG = LoggerFactory.getLogger(RequestProcessor.class);
30 private final DataBroker dataBroker;
31 private ReadWriteTransaction rwTx;
32 private ReentrantReadWriteLock lock;
36 public RequestProcessor(DataBroker dataBroker) {
37 this.dataBroker = requireNonNull(dataBroker);
38 rwTx = dataBroker.newReadWriteTransaction();
39 lock = new ReentrantReadWriteLock();
40 LOG.info("RequestProcessor instantiated");
44 public <T extends DataObject> ListenableFuture<Optional<T>> read(LogicalDatastoreType store,
45 InstanceIdentifier<T> path) {
47 ListenableFuture<Optional<T>> result = null;
49 LOG.debug("Number of threads in queue to read {}", lock.getQueueLength());
50 result = rwTx.read(store, path);
56 public <T extends DataObject> void delete(LogicalDatastoreType store, InstanceIdentifier<?> path) {
59 LOG.info("Number of delete requests waiting in queue :{}", lock.getQueueLength());
60 rwTx.delete(store, path);
64 public <T extends DataObject> void put(LogicalDatastoreType store,
65 InstanceIdentifier<T> path, T data) {
68 LOG.debug("Number of put requests waiting in queue :{}", lock.getQueueLength());
69 rwTx.put(store, path, data);
73 public <T extends DataObject> void merge(LogicalDatastoreType store, InstanceIdentifier<T> path, T data) {
76 LOG.debug("Number of merge requests waiting in queue :{}", lock.getQueueLength());
77 rwTx.merge(store, path, data);
80 public FluentFuture<? extends @NonNull CommitInfo> commit() {
82 FluentFuture<? extends @NonNull CommitInfo> future = null;
83 future = rwTx.commit();
93 private void acquireLock() {
94 if (!lock.writeLock().isHeldByCurrentThread()) {
95 lock.writeLock().lock();
96 LOG.debug("Number of write lock requests waiting in queue :{}", lock.getQueueLength());
97 LOG.info("Write Lock acquired by : {}", Thread.currentThread().getName());
100 LOG.debug("Lock already acquired by : {}", Thread.currentThread().getName());
104 private void acquireReadLock() {
105 if (lock.getReadHoldCount() > 0) {
106 LOG.info("Read Lock already acquired by : {}", Thread.currentThread().getName());
108 lock.readLock().lock();
110 LOG.info("Read Lock acquired by : {}", Thread.currentThread().getName());
114 private void releaseLock() {
115 if (lock.writeLock().isHeldByCurrentThread()) {
116 LOG.info("Write Lock released by : {}", Thread.currentThread().getName());
117 lock.writeLock().unlock();
121 private void releaseReadLock() {
122 LOG.info("Read Lock released by : {}", Thread.currentThread().getName());
123 lock.readLock().unlock();
126 private ReadWriteTransaction resetRwTx() {
127 LOG.info("Resetting the read write transaction .....");
128 rwTx = dataBroker.newReadWriteTransaction();
133 * Return the dataBroker related to RequestProcessor.
134 * @return the dataBroker
136 public DataBroker getDataBroker() {