mirror of
https://github.com/opennetworkinglab/onos.git
synced 2026-05-05 04:06:49 +02:00
[SDFAB-1136] Remove meter mirror
There is no valid reason to have it in the p4rtmeterprogrammable: - some devices cannot guarantee r/w symmetry - meters can be only modified - removal is a modify with default values Change-Id: I6d859f2d65195f3e7068390fee5e3a943972cac5
This commit is contained in:
parent
386f5ca225
commit
3ef744bf98
@ -19,8 +19,6 @@ package org.onosproject.drivers.p4runtime;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.common.util.concurrent.Striped;
|
||||
import org.onosproject.drivers.p4runtime.mirror.P4RuntimeMeterMirror;
|
||||
import org.onosproject.drivers.p4runtime.mirror.TimedEntry;
|
||||
import org.onosproject.net.DeviceId;
|
||||
import org.onosproject.net.meter.Band;
|
||||
import org.onosproject.net.meter.DefaultMeter;
|
||||
@ -63,7 +61,6 @@ public class P4RuntimeMeterProgrammable extends AbstractP4RuntimeHandlerBehaviou
|
||||
private static final Striped<Lock> WRITE_LOCKS = Striped.lock(30);
|
||||
|
||||
private PiMeterTranslator translator;
|
||||
private P4RuntimeMeterMirror meterMirror;
|
||||
private PiPipelineModel pipelineModel;
|
||||
|
||||
@Override
|
||||
@ -73,7 +70,6 @@ public class P4RuntimeMeterProgrammable extends AbstractP4RuntimeHandlerBehaviou
|
||||
}
|
||||
|
||||
translator = translationService.meterTranslator();
|
||||
meterMirror = handler().get(P4RuntimeMeterMirror.class);
|
||||
pipelineModel = pipeconf.pipelineModel();
|
||||
return true;
|
||||
}
|
||||
@ -120,13 +116,10 @@ public class P4RuntimeMeterProgrammable extends AbstractP4RuntimeHandlerBehaviou
|
||||
return false;
|
||||
}
|
||||
|
||||
WriteRequest request = client.write(p4DeviceId, pipeconf);
|
||||
appendEntryToWriteRequestOrSkip(request, handle, piMeterCellConfig);
|
||||
WriteRequest request = client.write(p4DeviceId, pipeconf)
|
||||
.entity(piMeterCellConfig, UpdateType.MODIFY);
|
||||
if (!request.pendingUpdates().isEmpty()) {
|
||||
result = request.submitSync().isSuccess();
|
||||
if (result) {
|
||||
meterMirror.applyWriteRequest(request);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
WRITE_LOCKS.get(deviceId).unlock();
|
||||
@ -154,8 +147,6 @@ public class P4RuntimeMeterProgrammable extends AbstractP4RuntimeHandlerBehaviou
|
||||
.filter(piMeterCellConfig -> !piMeterCellConfig.isDefaultConfig())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
meterMirror.sync(deviceId, piMeterCellConfigs);
|
||||
|
||||
if (piMeterCellConfigs.isEmpty()) {
|
||||
return CompletableFuture.completedFuture(Collections.emptyList());
|
||||
}
|
||||
@ -179,11 +170,8 @@ public class P4RuntimeMeterProgrammable extends AbstractP4RuntimeHandlerBehaviou
|
||||
// Reset all inconsistent meter cells to the default config
|
||||
if (!inconsistentOrDefaultCells.isEmpty()) {
|
||||
WriteRequest request = client.write(p4DeviceId, pipeconf);
|
||||
for (PiMeterCellId cellId : inconsistentOrDefaultCells) {
|
||||
PiMeterCellHandle handle = PiMeterCellHandle.of(deviceId, cellId);
|
||||
appendEntryToWriteRequestOrSkip(request, handle, PiMeterCellConfig.reset(cellId));
|
||||
}
|
||||
|
||||
inconsistentOrDefaultCells.forEach(cellId ->
|
||||
request.entity(PiMeterCellConfig.reset(cellId), UpdateType.MODIFY));
|
||||
request.submit().whenComplete((response, ex) -> {
|
||||
if (ex != null) {
|
||||
log.error("Exception resetting inconsistent meter entries", ex);
|
||||
@ -191,7 +179,6 @@ public class P4RuntimeMeterProgrammable extends AbstractP4RuntimeHandlerBehaviou
|
||||
log.debug("Successfully removed {} out of {} inconsistent meter entries",
|
||||
response.success().size(), response.all().size());
|
||||
}
|
||||
response.success().forEach(entity -> meterMirror.remove((PiMeterCellHandle) entity.handle()));
|
||||
});
|
||||
}
|
||||
|
||||
@ -215,7 +202,6 @@ public class P4RuntimeMeterProgrammable extends AbstractP4RuntimeHandlerBehaviou
|
||||
private Meter forgeMeter(PiMeterCellConfig config, PiMeterCellHandle handle) {
|
||||
final Optional<PiTranslatedEntity<Meter, PiMeterCellConfig>>
|
||||
translatedEntity = translator.lookup(handle);
|
||||
final TimedEntry<PiMeterCellConfig> timedEntry = meterMirror.get(handle);
|
||||
|
||||
// A meter cell config might not be present in the translation store if it
|
||||
// is default configuration.
|
||||
@ -239,13 +225,6 @@ public class P4RuntimeMeterProgrammable extends AbstractP4RuntimeHandlerBehaviou
|
||||
return null;
|
||||
}
|
||||
|
||||
// Big problems in the mirror ? This could happen in case of issues with
|
||||
// the eventual consistent maps used in the AbstractDistributedP4RuntimeMirror
|
||||
if (timedEntry == null) {
|
||||
log.warn("Meter entry handle not found in device mirror: {}", handle);
|
||||
return null;
|
||||
}
|
||||
|
||||
Meter original = translatedEntity.get().original();
|
||||
// Forge a meter with MeterCellId, Bands and DeviceId using the original value.
|
||||
DefaultMeter meter = (DefaultMeter) DefaultMeter.builder()
|
||||
@ -257,23 +236,6 @@ public class P4RuntimeMeterProgrammable extends AbstractP4RuntimeHandlerBehaviou
|
||||
return meter;
|
||||
}
|
||||
|
||||
private boolean appendEntryToWriteRequestOrSkip(
|
||||
final WriteRequest writeRequest,
|
||||
final PiMeterCellHandle handle,
|
||||
PiMeterCellConfig configToModify) {
|
||||
|
||||
final TimedEntry<PiMeterCellConfig> configOnDevice = meterMirror.get(handle);
|
||||
|
||||
if (configOnDevice != null && configOnDevice.entry().equals(configToModify)) {
|
||||
log.debug("Ignoring re-apply of existing entry: {}", configToModify);
|
||||
return true;
|
||||
}
|
||||
|
||||
writeRequest.entity(configToModify, UpdateType.MODIFY);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the given PiMeterCellConfigs are similar enough to be deemed equal
|
||||
* for reconciliation purposes. This is required to handle read/write asymmetry in devices
|
||||
|
||||
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017-present Open Networking Foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.onosproject.drivers.p4runtime.mirror;
|
||||
|
||||
import org.onosproject.net.pi.runtime.PiEntityType;
|
||||
import org.onosproject.net.pi.runtime.PiMeterCellConfig;
|
||||
import org.onosproject.net.pi.runtime.PiMeterCellHandle;
|
||||
import org.osgi.service.component.annotations.Component;
|
||||
|
||||
/**
|
||||
* Distributed implementation of a P4Runtime meter mirror.
|
||||
*/
|
||||
@Component(immediate = true, service = P4RuntimeMeterMirror.class)
|
||||
public final class DistributedP4RuntimeMeterMirror
|
||||
extends AbstractDistributedP4RuntimeMirror
|
||||
<PiMeterCellHandle, PiMeterCellConfig>
|
||||
implements P4RuntimeMeterMirror {
|
||||
|
||||
public DistributedP4RuntimeMeterMirror() {
|
||||
super(PiEntityType.METER_CELL_CONFIG);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String mapSimpleName() {
|
||||
return PiEntityType.METER_CELL_CONFIG.name().toLowerCase();
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user