16 package org.openkilda.floodlight.service.batch;
21 import net.floodlightcontroller.core.IOFSwitch;
22 import org.projectfloodlight.openflow.protocol.OFMessage;
23 import org.projectfloodlight.openflow.protocol.OFType;
24 import org.projectfloodlight.openflow.types.DatapathId;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
28 import java.util.HashMap;
29 import java.util.LinkedList;
30 import java.util.List;
34 private static final Logger
log = LoggerFactory.getLogger(BatchRecord.class);
38 private final List<OfPendingMessage> batch;
39 private final LinkedList<OfPendingMessage> barriers;
40 private boolean errors =
false;
41 private boolean complete =
false;
43 BatchRecord(
SwitchUtils switchUtils, List<OfPendingMessage> batch) {
44 this.switchUtils = switchUtils;
46 this.barriers =
new LinkedList<>();
50 Map<DatapathId, IOFSwitch> affectedSwitches = writePayload();
51 writeBarriers(affectedSwitches);
53 complete = 0 == barriers.size();
55 log.debug(
"Write {}(+{}) messages", batch.size(), barriers.size());
58 boolean handleResponse(OFMessage response) {
61 if (recordResponse(barriers, response)) {
62 log.debug(
"Have barrier message response");
64 }
else if (recordResponse(batch, response)) {
66 "Have response for some of payload messages (xId: {}, type: {})",
67 response.getXid(), response.getType());
68 errors = OFType.ERROR == response.getType();
77 HashMap<DatapathId, IOFSwitch> affectedSwitches =
new HashMap<>();
80 DatapathId dpId = record.
getDpId();
81 IOFSwitch sw = affectedSwitches.get(dpId);
84 affectedSwitches.put(dpId, sw);
87 if (!sw.write(record.getRequest())) {
92 return affectedSwitches;
95 private void writeBarriers(Map<DatapathId, IOFSwitch> affectedSwitches)
throws OFInstallException {
96 for (Map.Entry<DatapathId, IOFSwitch> keyValue : affectedSwitches.entrySet()) {
97 DatapathId dpId = keyValue.getKey();
98 IOFSwitch sw = keyValue.getValue();
104 barriers.addLast(barrierRecord);
108 private boolean recordResponse(List<OfPendingMessage> pending, OFMessage response) {
109 long xid = response.getXid();
111 if (record.getXid() != xid) {
115 record.setResponse(response);
123 private void updateBarriers() {
124 boolean allDone =
true;
127 if (record.isPending()) {
134 removePendingState();
139 private void removePendingState() {
141 if (record.isPending()) {
142 record.setResponse(null);
147 boolean isComplete() {
155 List<OfPendingMessage> getBatch() {
IOFSwitch lookupSwitch(DatapathId dpId)