Browse Source

Addresses concurrent map read and write (#688)

James Read 8 months ago
parent
commit
d94f2aca1c
2 changed files with 30 additions and 4 deletions
  1. 26 3
      service/internal/entities/storage.go
  2. 4 1
      service/internal/entities/templates.go

+ 26 - 3
service/internal/entities/storage.go

@@ -60,15 +60,38 @@ func GetAll() *variableBase {
 }
 
 func GetEntities() entitiesByClass {
-	return contents.Entities
+	rwmutex.RLock()
+
+	copiedEntities := make(entitiesByClass, len(contents.Entities))
+
+	for entityName, entityInstances := range contents.Entities {
+		copiedInstances := make(entityInstancesByKey, len(entityInstances))
+
+		for key, entity := range entityInstances {
+			copiedInstances[key] = entity
+		}
+		copiedEntities[entityName] = copiedInstances
+	}
+
+	rwmutex.RUnlock()
+
+	return copiedEntities
 }
 
 func GetEntityInstances(entityName string) entityInstancesByKey {
+	rwmutex.RLock()
+	defer rwmutex.RUnlock()
+
 	if entities, ok := contents.Entities[entityName]; ok {
-		return entities
+		copiedInstances := make(entityInstancesByKey, len(entities))
+
+		for key, entity := range entities {
+			copiedInstances[key] = entity
+		}
+		return copiedInstances
 	}
 
-	return nil
+	return make(entityInstancesByKey, 0)
 }
 
 func AddEntity(entityName string, entityKey string, data any) {

+ 4 - 1
service/internal/entities/templates.go

@@ -91,7 +91,7 @@ func ParseTemplateWithArgs(source string, ent *Entity, args map[string]string) s
 	}
 
 	templateVariables := &variableBase{
-		OliveTin:      contents.OliveTin,
+		OliveTin:      GetAll().OliveTin,
 		Arguments:     args,
 		CurrentEntity: entdata,
 	}
@@ -126,5 +126,8 @@ func ParseTemplateBoolWith(source string, ent *Entity) bool {
 }
 
 func ClearEntities(entityType string) {
+	rwmutex.Lock()
+	defer rwmutex.Unlock()
+
 	delete(contents.Entities, entityType)
 }