changeset 3221:899914a18d7e

Import queue: Implemented multiple reader / one writer strategy when locking ressources.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 09 May 2019 15:07:09 +0200
parents 56b297592c0a
children 83e8e1ea0aff
files pkg/imports/queue.go
diffstat 1 files changed, 12 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/imports/queue.go	Thu May 09 14:21:50 2019 +0200
+++ b/pkg/imports/queue.go	Thu May 09 15:07:09 2019 +0200
@@ -107,13 +107,13 @@
 	signalChan chan struct{}
 	creatorsMu sync.Mutex
 	creators   map[JobKind]JobCreator
-	usedDeps   map[string]struct{}
+	usedDeps   map[string]int
 }
 
 var iqueue = importQueue{
 	signalChan: make(chan struct{}),
 	creators:   map[JobKind]JobCreator{},
-	usedDeps:   map[string]struct{}{},
+	usedDeps:   map[string]int{},
 }
 
 var (
@@ -438,12 +438,10 @@
 	q.creatorsMu.Lock()
 nextCreator:
 	for kind, jc := range q.creators {
-		deps := jc.Depends()
-		for l := range deps {
-			for _, d := range deps[l] {
-				if _, found := q.usedDeps[d]; found {
-					continue nextCreator
-				}
+		// only test exclusive locks
+		for _, d := range jc.Depends()[0] {
+			if q.usedDeps[d] > 0 {
+				continue nextCreator
 			}
 		}
 		which = append(which, string(kind))
@@ -595,10 +593,9 @@
 
 		// Lock dependencies.
 		q.creatorsMu.Lock()
-		deps := jc.Depends()
-		for l := range deps {
-			for _, d := range deps[l] {
-				q.usedDeps[d] = struct{}{}
+		for _, deps := range jc.Depends() {
+			for _, d := range deps {
+				q.usedDeps[d]++
 			}
 		}
 		q.creatorsMu.Unlock()
@@ -608,10 +605,9 @@
 			// Unlock the dependencies.
 			defer func() {
 				q.creatorsMu.Lock()
-				deps := jc.Depends()
-				for l := range deps {
-					for _, d := range deps[l] {
-						delete(q.usedDeps, d)
+				for _, deps := range jc.Depends() {
+					for _, d := range deps {
+						q.usedDeps[d]--
 					}
 				}
 				q.creatorsMu.Unlock()