import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
+
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction;
private final RemoteDeviceId id;
private final FutureCallback<DOMRpcResult> loggingCallback;
- public ReadOnlyTx(final NetconfBaseOps netconfOps, final RemoteDeviceId id) {
+ private final long requestTimeoutMillis;
+
+ public ReadOnlyTx(final NetconfBaseOps netconfOps, final RemoteDeviceId id, final long requestTimeoutMillis) {
this.netconfOps = netconfOps;
this.id = id;
+ this.requestTimeoutMillis = requestTimeoutMillis;
// Simple logging callback to log result of read operation
loggingCallback = new FutureCallback<DOMRpcResult>() {
} else {
LOG.warn("{}: Reading data unsuccessful: {}", id, result.getErrors());
}
-
}
@Override
}
});
+
+ if(!readWithTimeout("readConfigurationData", configRunning)) {
+ return null;
+ }
+
return MappingCheckedFuture.create(transformedFuture, ReadFailedException.MAPPER);
}
}
});
+ if(!readWithTimeout("readOperationalData", configCandidate)) {
+ return null;
+ }
+
return MappingCheckedFuture.create(transformedFuture, ReadFailedException.MAPPER);
}
public Object getIdentifier() {
return this;
}
+
+ private boolean readWithTimeout(String operation, ListenableFuture<DOMRpcResult> future) {
+ try {
+ future.get(requestTimeoutMillis, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException | ExecutionException e) {
+ LOG.error("{}: {} failed with error", id, operation, e);
+ throw new RuntimeException(id + ": readOperationalData failed");
+ } catch (TimeoutException e) {
+ LOG.warn("{}: Unable to {} after {} milliseconds", id, operation, requestTimeoutMillis, e);
+ future.cancel(true);
+ return false;
+ }
+ return true;
+ }
}