We have guards against non-existing bridge nodes, but when they succeed
we throw away the data we have read. This can lead to theoretical TOCTOE
errors.
Fix this by only reading the bridge node once.
Change-Id: I5e224b350d3c4f5e05d1366fa8f4282b6834dba8
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
for (Entry<InstanceIdentifier<QosEntries>, QosEntries> qosMapEntry: createdOrUpdated.entrySet()) {
InstanceIdentifier<OvsdbNodeAugmentation> iid =
qosMapEntry.getKey().firstIdentifierOf(OvsdbNodeAugmentation.class);
for (Entry<InstanceIdentifier<QosEntries>, QosEntries> qosMapEntry: createdOrUpdated.entrySet()) {
InstanceIdentifier<OvsdbNodeAugmentation> iid =
qosMapEntry.getKey().firstIdentifierOf(OvsdbNodeAugmentation.class);
- if (!state.getBridgeNode(iid).isPresent()) {
+ final var optBridgeNode = state.getBridgeNode(iid);
+ if (optBridgeNode.isEmpty()) {
- OvsdbNodeAugmentation operNode =
- state.getBridgeNode(iid).orElseThrow().augmentation(OvsdbNodeAugmentation.class);
+
+ OvsdbNodeAugmentation operNode = optBridgeNode.orElseThrow().augmentation(OvsdbNodeAugmentation.class);
QosEntries qosEntry = qosMapEntry.getValue();
Qos qos = transaction.getTypedRowWrapper(Qos.class);
QosEntries qosEntry = qosMapEntry.getValue();
Qos qos = transaction.getTypedRowWrapper(Qos.class);
private static void execute(final TransactionBuilder transaction, final BridgeOperationalState state,
final Map<InstanceIdentifier<Queues>, Queues> createdOrUpdated,
final InstanceIdentifierCodec instanceIdentifierCodec) {
private static void execute(final TransactionBuilder transaction, final BridgeOperationalState state,
final Map<InstanceIdentifier<Queues>, Queues> createdOrUpdated,
final InstanceIdentifierCodec instanceIdentifierCodec) {
- for (Entry<InstanceIdentifier<Queues>, Queues> queueMapEntry: createdOrUpdated.entrySet()) {
+ for (Entry<InstanceIdentifier<Queues>, Queues> queueMapEntry : createdOrUpdated.entrySet()) {
InstanceIdentifier<OvsdbNodeAugmentation> iid =
queueMapEntry.getKey().firstIdentifierOf(OvsdbNodeAugmentation.class);
InstanceIdentifier<OvsdbNodeAugmentation> iid =
queueMapEntry.getKey().firstIdentifierOf(OvsdbNodeAugmentation.class);
- if (!state.getBridgeNode(iid).isPresent()) {
+ final var optBridgeNode = state.getBridgeNode(iid);
+ if (optBridgeNode.isEmpty()) {
LOG.warn("Incomplete Queue other_config", e);
}
LOG.warn("Incomplete Queue other_config", e);
}
- OvsdbNodeAugmentation operNode =
- state.getBridgeNode(iid).orElseThrow().augmentation(OvsdbNodeAugmentation.class);
+ OvsdbNodeAugmentation operNode = optBridgeNode.orElseThrow().augmentation(OvsdbNodeAugmentation.class);
Uuid operQueueUuid = getQueueEntryUuid(operNode.getQueues(), queueEntry.key());
if (operQueueUuid == null) {
UUID namedUuid = new UUID(SouthboundConstants.QUEUE_NAMED_UUID_PREFIX
+ TransactUtils.bytesToHexString(queueEntry.getQueueId().getValue().getBytes(UTF_8)));
transaction.add(op.insert(queue).withId(namedUuid.toString()));
Uuid operQueueUuid = getQueueEntryUuid(operNode.getQueues(), queueEntry.key());
if (operQueueUuid == null) {
UUID namedUuid = new UUID(SouthboundConstants.QUEUE_NAMED_UUID_PREFIX
+ TransactUtils.bytesToHexString(queueEntry.getQueueId().getValue().getBytes(UTF_8)));
transaction.add(op.insert(queue).withId(namedUuid.toString()));
- LOG.info("Added queue Uuid : {} for Ovsdb Node : {}",
- namedUuid, operNode);
+ LOG.info("Added queue Uuid : {} for Ovsdb Node : {}", namedUuid, operNode);
} else {
UUID uuid = new UUID(operQueueUuid.getValue());
Queue extraQueue = transaction.getTypedRowSchema(Queue.class);
extraQueue.getUuidColumn().setData(uuid);
transaction.add(op.update(queue)
.where(extraQueue.getUuidColumn().getSchema().opEqual(uuid)).build());
} else {
UUID uuid = new UUID(operQueueUuid.getValue());
Queue extraQueue = transaction.getTypedRowSchema(Queue.class);
extraQueue.getUuidColumn().setData(uuid);
transaction.add(op.update(queue)
.where(extraQueue.getUuidColumn().getSchema().opEqual(uuid)).build());
- LOG.info("Updated queue entries: {} for Ovsdb Node : {}",
- queue, operNode);
+ LOG.info("Updated queue entries: {} for Ovsdb Node : {}", queue, operNode);