CNlucius
Committed by Gerrit Code Review

ONOS-2707

Fix bug of process ovsdb table update

Change-Id: I55a879da1bf8770b68cb13c676f54482f685e60d
...@@ -19,6 +19,7 @@ import static com.google.common.base.Preconditions.checkNotNull; ...@@ -19,6 +19,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
19 19
20 import java.math.BigInteger; 20 import java.math.BigInteger;
21 import java.util.HashSet; 21 import java.util.HashSet;
22 +import java.util.Iterator;
22 import java.util.List; 23 import java.util.List;
23 import java.util.Map; 24 import java.util.Map;
24 import java.util.Set; 25 import java.util.Set;
...@@ -60,7 +61,6 @@ import org.onosproject.ovsdb.rfc.schema.DatabaseSchema; ...@@ -60,7 +61,6 @@ import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
60 import org.onosproject.ovsdb.rfc.table.Bridge; 61 import org.onosproject.ovsdb.rfc.table.Bridge;
61 import org.onosproject.ovsdb.rfc.table.Interface; 62 import org.onosproject.ovsdb.rfc.table.Interface;
62 import org.onosproject.ovsdb.rfc.table.OvsdbTable; 63 import org.onosproject.ovsdb.rfc.table.OvsdbTable;
63 -import org.onosproject.ovsdb.rfc.table.Port;
64 import org.onosproject.ovsdb.rfc.table.TableGenerator; 64 import org.onosproject.ovsdb.rfc.table.TableGenerator;
65 import org.onosproject.ovsdb.rfc.utils.FromJsonUtil; 65 import org.onosproject.ovsdb.rfc.utils.FromJsonUtil;
66 import org.osgi.service.component.ComponentContext; 66 import org.osgi.service.component.ComponentContext;
...@@ -220,24 +220,23 @@ public class OvsdbControllerImpl implements OvsdbController { ...@@ -220,24 +220,23 @@ public class OvsdbControllerImpl implements OvsdbController {
220 log.debug("Begin to process table updates uuid: {}, databaseName: {}, tableName: {}", 220 log.debug("Begin to process table updates uuid: {}, databaseName: {}, tableName: {}",
221 uuid.value(), dbName, tableName); 221 uuid.value(), dbName, tableName);
222 222
223 - Row row = clientService.getRow(dbName, tableName, uuid.value()); 223 + Row oldRow = update.getOld(uuid);
224 - clientService.updateOvsdbStore(dbName, tableName, uuid.value(), 224 + Row newRow = update.getNew(uuid);
225 - update.getNew(uuid)); 225 + if (newRow != null) {
226 - if (update.getNew(uuid) != null) { 226 + clientService.updateOvsdbStore(dbName, tableName,
227 - boolean isNewRow = (row == null) ? true : false; 227 + uuid.value(), newRow);
228 - if (isNewRow) { 228 +
229 - if (OvsdbConstant.PORT.equals(tableName)) { 229 + if (OvsdbConstant.INTERFACE.equals(tableName)) {
230 - dispatchEvent(clientService, update.getNew(uuid), 230 + dispatchInterfaceEvent(clientService,
231 - null, OvsdbEvent.Type.PORT_ADDED, 231 + newRow, null,
232 + OvsdbEvent.Type.PORT_ADDED,
232 dbSchema); 233 dbSchema);
233 } 234 }
234 - }
235 } else if (update.getOld(uuid) != null) { 235 } else if (update.getOld(uuid) != null) {
236 - clientService.removeRow(dbName, tableName, uuid.toString()); 236 + clientService.removeRow(dbName, tableName, uuid.value());
237 - if (update.getOld(uuid) != null) {
238 if (OvsdbConstant.PORT.equals(tableName)) { 237 if (OvsdbConstant.PORT.equals(tableName)) {
239 - dispatchEvent(clientService, null, 238 + dispatchInterfaceEvent(clientService, null,
240 - update.getOld(uuid), 239 + oldRow,
241 OvsdbEvent.Type.PORT_REMOVED, 240 OvsdbEvent.Type.PORT_REMOVED,
242 dbSchema); 241 dbSchema);
243 } 242 }
...@@ -245,7 +244,6 @@ public class OvsdbControllerImpl implements OvsdbController { ...@@ -245,7 +244,6 @@ public class OvsdbControllerImpl implements OvsdbController {
245 } 244 }
246 } 245 }
247 } 246 }
248 - }
249 247
250 /** 248 /**
251 * Dispatches event to the north. 249 * Dispatches event to the north.
...@@ -256,57 +254,42 @@ public class OvsdbControllerImpl implements OvsdbController { ...@@ -256,57 +254,42 @@ public class OvsdbControllerImpl implements OvsdbController {
256 * @param eventType type of event 254 * @param eventType type of event
257 * @param dbSchema ovsdb database schema 255 * @param dbSchema ovsdb database schema
258 */ 256 */
259 - private void dispatchEvent(OvsdbClientService clientService, Row newRow, 257 + private void dispatchInterfaceEvent(OvsdbClientService clientService,
260 - Row oldRow, Type eventType, 258 + Row newRow, Row oldRow,
259 + Type eventType,
261 DatabaseSchema dbSchema) { 260 DatabaseSchema dbSchema) {
262 - Port port = null;
263 - if (OvsdbEvent.Type.PORT_ADDED.equals(eventType)) {
264 - port = (Port) TableGenerator.getTable(dbSchema, newRow,
265 - OvsdbTable.PORT);
266 - } else if (OvsdbEvent.Type.PORT_REMOVED.equals(eventType)) {
267 - port = (Port) TableGenerator.getTable(dbSchema, oldRow,
268 - OvsdbTable.PORT);
269 - }
270 - if (port == null) {
271 - return;
272 - }
273 261
274 long dpid = getDataPathid(clientService, dbSchema); 262 long dpid = getDataPathid(clientService, dbSchema);
275 - OvsdbSet intfUuidSet = (OvsdbSet) port.getInterfacesColumn().data();
276 - @SuppressWarnings({ "unchecked" })
277 - Set<UUID> intfUuids = intfUuidSet.set();
278 - for (UUID intfUuid : intfUuids) {
279 - Row intfRow = clientService
280 - .getRow(OvsdbConstant.DATABASENAME, "Interface",
281 - intfUuid.toString());
282 - if (intfRow == null) {
283 - continue;
284 - }
285 Interface intf = (Interface) TableGenerator 263 Interface intf = (Interface) TableGenerator
286 - .getTable(dbSchema, intfRow, OvsdbTable.INTERFACE); 264 + .getTable(dbSchema, newRow, OvsdbTable.INTERFACE);
265 + if (intf == null) {
266 + return;
267 + }
287 268
288 String portType = (String) intf.getTypeColumn().data(); 269 String portType = (String) intf.getTypeColumn().data();
289 long localPort = getOfPort(intf); 270 long localPort = getOfPort(intf);
271 + if (localPort < 0) {
272 + return;
273 + }
290 String[] macAndIfaceId = getMacAndIfaceid(intf); 274 String[] macAndIfaceId = getMacAndIfaceid(intf);
291 if (macAndIfaceId == null) { 275 if (macAndIfaceId == null) {
292 return; 276 return;
293 } 277 }
294 - EventSubject eventSubject = new DefaultEventSubject( 278 +
295 - MacAddress 279 + EventSubject eventSubject = new DefaultEventSubject(MacAddress.valueOf(
296 - .valueOf(macAndIfaceId[0]), 280 + macAndIfaceId[0]),
297 new HashSet<IpAddress>(), 281 new HashSet<IpAddress>(),
298 - new OvsdbPortName(port.getName()), 282 + new OvsdbPortName(intf
283 + .getName()),
299 new OvsdbPortNumber(localPort), 284 new OvsdbPortNumber(localPort),
300 - new OvsdbDatapathId(Long.toString(dpid)), 285 + new OvsdbDatapathId(Long
286 + .toString(dpid)),
301 new OvsdbPortType(portType), 287 new OvsdbPortType(portType),
302 new OvsdbIfaceId(macAndIfaceId[1])); 288 new OvsdbIfaceId(macAndIfaceId[1]));
303 for (OvsdbEventListener listener : ovsdbEventListener) { 289 for (OvsdbEventListener listener : ovsdbEventListener) {
304 listener.handle(new OvsdbEvent<EventSubject>(eventType, 290 listener.handle(new OvsdbEvent<EventSubject>(eventType,
305 eventSubject)); 291 eventSubject));
306 } 292 }
307 -
308 - }
309 -
310 } 293 }
311 294
312 /** 295 /**
...@@ -345,14 +328,15 @@ public class OvsdbControllerImpl implements OvsdbController { ...@@ -345,14 +328,15 @@ public class OvsdbControllerImpl implements OvsdbController {
345 * @return ofport the ofport number 328 * @return ofport the ofport number
346 */ 329 */
347 private long getOfPort(Interface intf) { 330 private long getOfPort(Interface intf) {
348 - OvsdbSet ovsdbSet = (OvsdbSet) intf.getOpenFlowPortColumn().data(); 331 + OvsdbSet ofPortSet = (OvsdbSet) intf.getOpenFlowPortColumn().data();
349 @SuppressWarnings("unchecked") 332 @SuppressWarnings("unchecked")
350 - Set<Long> ofPorts = ovsdbSet.set(); 333 + Set<Integer> ofPorts = ofPortSet.set();
351 while (ofPorts == null || ofPorts.size() <= 0) { 334 while (ofPorts == null || ofPorts.size() <= 0) {
352 log.debug("The ofport is null in {}", intf.getName()); 335 log.debug("The ofport is null in {}", intf.getName());
353 - return 0; 336 + return -1;
354 } 337 }
355 - return (long) ofPorts.toArray()[0]; 338 + Iterator<Integer> it = ofPorts.iterator();
339 + return Long.parseLong(it.next().toString());
356 } 340 }
357 341
358 /** 342 /**
...@@ -376,9 +360,9 @@ public class OvsdbControllerImpl implements OvsdbController { ...@@ -376,9 +360,9 @@ public class OvsdbControllerImpl implements OvsdbController {
376 "Bridge", bridgeUuid); 360 "Bridge", bridgeUuid);
377 Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, bridgeRow, 361 Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, bridgeRow,
378 OvsdbTable.BRIDGE); 362 OvsdbTable.BRIDGE);
379 - OvsdbSet ovsdbSet = (OvsdbSet) bridge.getDatapathIdColumn().data(); 363 + OvsdbSet dpidSet = (OvsdbSet) bridge.getDatapathIdColumn().data();
380 @SuppressWarnings("unchecked") 364 @SuppressWarnings("unchecked")
381 - Set<String> dpids = ovsdbSet.set(); 365 + Set<String> dpids = dpidSet.set();
382 if (dpids == null || dpids.size() == 0) { 366 if (dpids == null || dpids.size() == 0) {
383 return 0; 367 return 0;
384 } 368 }
......