~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
65 lines · 1.0 KB Raw History
package kcpstore

import (
	"context"
	"errors"
	"sync"
)

func definitive(err error) bool {
	switch {
	case err == nil:
		return true
	case errors.Is(err, ErrNoPath):
		return true
	case IsNotFound(err):
		return true
	}
	return false
}

type PathCache struct {
	store *Store

	mu sync.Mutex

	byID map[string]string
}

func NewPathCache(store *Store) *PathCache {
	return &PathCache{store: store, byID: map[string]string{}}
}

func (c *PathCache) Lookup(ctx context.Context, logicalCluster string) string {
	c.mu.Lock()
	if path, seen := c.byID[logicalCluster]; seen {
		c.mu.Unlock()
		return path
	}
	c.mu.Unlock()

	path := ""
	if c.store != nil {
		resolved, err := c.store.ClusterPath(ctx, logicalCluster)
		if !definitive(err) {
			return ""
		}
		path = resolved
	}
	c.mu.Lock()
	c.byID[logicalCluster] = path
	c.mu.Unlock()
	return path
}

func (c *PathCache) Forget(logicalCluster string) {
	c.mu.Lock()
	defer c.mu.Unlock()
	delete(c.byID, logicalCluster)
}

func (c *PathCache) Len() int {
	c.mu.Lock()
	defer c.mu.Unlock()
	return len(c.byID)
}