Skip to content

Commit ecafd7e

Browse files
Fix race conditions in memoryStore (#148)
1 parent 89422d5 commit ecafd7e

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

store.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -186,13 +186,19 @@ func (s *memoryStore[K, T]) AddEdge(sourceHash, targetHash K, edge Edge[K]) erro
186186
}
187187

188188
func (s *memoryStore[K, T]) UpdateEdge(sourceHash, targetHash K, edge Edge[K]) error {
189-
if _, err := s.Edge(sourceHash, targetHash); err != nil {
190-
return err
191-
}
192-
193189
s.lock.Lock()
194190
defer s.lock.Unlock()
195191

192+
targetEdges, ok := s.outEdges[sourceHash]
193+
if !ok {
194+
return ErrEdgeNotFound
195+
}
196+
197+
_, ok = targetEdges[targetHash]
198+
if !ok {
199+
return ErrEdgeNotFound
200+
}
201+
196202
s.outEdges[sourceHash][targetHash] = edge
197203
s.inEdges[targetHash][sourceHash] = edge
198204

@@ -254,12 +260,15 @@ func (s *memoryStore[K, T]) ListEdges() ([]Edge[K], error) {
254260
// Because CreatesCycle doesn't need to modify the PredecessorMap, we can use
255261
// inEdges instead to compute the same thing without creating any copies.
256262
func (s *memoryStore[K, T]) CreatesCycle(source, target K) (bool, error) {
257-
if _, _, err := s.Vertex(source); err != nil {
258-
return false, fmt.Errorf("could not get vertex with hash %v: %w", source, err)
263+
s.lock.RLock()
264+
defer s.lock.RUnlock()
265+
266+
if _, ok := s.vertices[source]; !ok {
267+
return false, fmt.Errorf("could not get vertex with hash %v", source)
259268
}
260269

261-
if _, _, err := s.Vertex(target); err != nil {
262-
return false, fmt.Errorf("could not get vertex with hash %v: %w", target, err)
270+
if _, ok := s.vertices[target]; !ok {
271+
return false, fmt.Errorf("could not get vertex with hash %v", target)
263272
}
264273

265274
if source == target {

0 commit comments

Comments
 (0)