@@ -37,7 +37,7 @@ type OvsdbDriver struct {
37
37
bridgeName string // Name of the bridge we are operating on
38
38
ovs * libovsdb.OvsdbClient
39
39
cache map [string ]map [libovsdb.UUID ]libovsdb.Row
40
- cacheLock sync.Mutex
40
+ cacheLock sync.RWMutex // lock to protect cache accesses
41
41
}
42
42
43
43
// NewOvsdbDriver creates a new OVSDB driver instance.
@@ -105,6 +105,9 @@ func (d *OvsdbDriver) Delete() error {
105
105
}
106
106
107
107
func (d * OvsdbDriver ) getRootUUID () libovsdb.UUID {
108
+ d .cacheLock .RLock ()
109
+ defer d .cacheLock .RUnlock ()
110
+
108
111
for uuid := range d .cache [rootTable ] {
109
112
return uuid
110
113
}
@@ -248,6 +251,10 @@ func (d *OvsdbDriver) GetPortOrIntfNameFromID(id string, isPort bool) (string, e
248
251
table = interfaceTable
249
252
}
250
253
254
+ d .cacheLock .RLock ()
255
+ defer d .cacheLock .RUnlock ()
256
+
257
+ // walk thru all ports
251
258
for _ , row := range d .cache [table ] {
252
259
if extIDs , ok := row .Fields ["external_ids" ]; ok {
253
260
extIDMap := extIDs .(libovsdb.OvsMap ).GoMap
@@ -353,13 +360,15 @@ func (d *OvsdbDriver) DeletePort(intfName string) error {
353
360
}
354
361
355
362
// also fetch the port-uuid from cache
363
+ d .cacheLock .RLock ()
356
364
for uuid , row := range d .cache ["Port" ] {
357
365
name := row .Fields ["name" ].(string )
358
366
if name == intfName {
359
367
portUUID = []libovsdb.UUID {uuid }
360
368
break
361
369
}
362
370
}
371
+ d .cacheLock .RUnlock ()
363
372
364
373
// mutate the Ports column of the row in the Bridge table
365
374
mutateSet , _ := libovsdb .NewOvsSet (portUUID )
@@ -498,6 +507,10 @@ func (d *OvsdbDriver) RemoveController(target string) error {
498
507
499
508
// IsControllerPresent : Check if Controller already exists
500
509
func (d * OvsdbDriver ) IsControllerPresent (target string ) bool {
510
+ d .cacheLock .RLock ()
511
+ defer d .cacheLock .RUnlock ()
512
+
513
+ // walk the local cache
501
514
for tName , table := range d .cache {
502
515
if tName == "Controller" {
503
516
for _ , row := range table {
@@ -519,6 +532,10 @@ func (d *OvsdbDriver) IsControllerPresent(target string) bool {
519
532
520
533
// IsPortNamePresent checks if port already exists in OVS bridge
521
534
func (d * OvsdbDriver ) IsPortNamePresent (intfName string ) bool {
535
+ d .cacheLock .RLock ()
536
+ defer d .cacheLock .RUnlock ()
537
+
538
+ // walk the local cache
522
539
for tName , table := range d .cache {
523
540
if tName == "Port" {
524
541
for _ , row := range table {
@@ -572,6 +589,10 @@ func (d *OvsdbDriver) GetOfpPortNo(intfName string) (uint32, error) {
572
589
573
590
// IsVtepPresent checks if VTEP already exists
574
591
func (d * OvsdbDriver ) IsVtepPresent (remoteIP string ) (bool , string ) {
592
+ d .cacheLock .RLock ()
593
+ defer d .cacheLock .RUnlock ()
594
+
595
+ // walk the local cache
575
596
for tName , table := range d .cache {
576
597
if tName == "Interface" {
577
598
for _ , row := range table {
0 commit comments