Skip to content

Commit

Permalink
feat: cache_check_count added
Browse files Browse the repository at this point in the history
  • Loading branch information
tolgaOzen committed Jan 31, 2024
1 parent da7d486 commit 0e5deef
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 29 deletions.
28 changes: 23 additions & 5 deletions internal/engines/cache/cache.go
Expand Up @@ -4,6 +4,8 @@ import (
"context"
"encoding/hex"

api "go.opentelemetry.io/otel/metric"

"github.com/cespare/xxhash/v2"

"github.com/Permify/permify/internal/engines"
Expand All @@ -19,15 +21,30 @@ type CheckEngineWithCache struct {
schemaReader storage.SchemaReader
checker invoke.Check
cache cache.Cache

// Metrics
cacheCounter api.Int64Counter
}

// NewCheckEngineWithCache creates a new instance of EngineKeyManager by initializing an EngineKeys
// struct with the provided cache.Cache instance.
func NewCheckEngineWithCache(checker invoke.Check, schemaReader storage.SchemaReader, cache cache.Cache) invoke.Check {
func NewCheckEngineWithCache(
checker invoke.Check,
schemaReader storage.SchemaReader,
cache cache.Cache,
meter api.Meter,
) invoke.Check {
// Cache Counter
cacheCounter, err := meter.Int64Counter("cache_check_count", api.WithDescription("Number of permission cached checks performed"))
if err != nil {
panic(err)
}

return &CheckEngineWithCache{
schemaReader: schemaReader,
checker: checker,
cache: cache,
cacheCounter: cacheCounter,
}
}

Expand All @@ -52,6 +69,8 @@ func (c *CheckEngineWithCache) Check(ctx context.Context, request *base.Permissi

// If a cached result is found, handle exclusion and return the result.
if found {
// Increase the check count in the metrics.
c.cacheCounter.Add(ctx, 1)
// If the request doesn't have the exclusion flag set, return the cached result.
return &base.PermissionCheckResponse{
Can: res.GetCan(),
Expand All @@ -60,8 +79,7 @@ func (c *CheckEngineWithCache) Check(ctx context.Context, request *base.Permissi
}

// Perform the actual permission check using the provided request.
res, err = c.checker.Check(ctx, request)

cres, err := c.checker.Check(ctx, request)
// Check if there's an error or the response is nil, and return the result.
if err != nil {
return &base.PermissionCheckResponse{
Expand All @@ -73,12 +91,12 @@ func (c *CheckEngineWithCache) Check(ctx context.Context, request *base.Permissi
}

c.setCheckKey(request, &base.PermissionCheckResponse{
Can: res.GetCan(),
Can: cres.GetCan(),
Metadata: &base.PermissionCheckResponseMetadata{},
}, isRelational)

// Return the result of the permission check.
return res, err
return cres, err
}

// GetCheckKey retrieves the value for the given key from the EngineKeys cache.
Expand Down
44 changes: 22 additions & 22 deletions internal/engines/cache/cache_test.go
Expand Up @@ -43,7 +43,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

// Initialize a new EngineKeys struct with a new cache.Cache instance
engineKeys := CheckEngineWithCache{nil, nil, cache}
engineKeys := CheckEngineWithCache{nil, nil, cache, nil}

// Create a new PermissionCheckRequest and PermissionCheckResponse
checkReq := &base.PermissionCheckRequest{
Expand Down Expand Up @@ -93,7 +93,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

// Initialize a new EngineKeys struct with a new cache.Cache instance
engineKeys := CheckEngineWithCache{nil, nil, cache}
engineKeys := CheckEngineWithCache{nil, nil, cache, nil}

// Create a new PermissionCheckRequest and PermissionCheckResponse
checkReq := &base.PermissionCheckRequest{
Expand Down Expand Up @@ -143,7 +143,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

// Initialize a new EngineKeys struct with a new cache.Cache instance
engineKeys := CheckEngineWithCache{nil, nil, cache}
engineKeys := CheckEngineWithCache{nil, nil, cache, nil}

// Create a new PermissionCheckRequest and PermissionCheckResponse
checkReq := &base.PermissionCheckRequest{
Expand Down Expand Up @@ -287,7 +287,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

// Initialize a new EngineKeys struct with a new cache.Cache instance
engineKeys := CheckEngineWithCache{nil, nil, cache}
engineKeys := CheckEngineWithCache{nil, nil, cache, nil}

// Create a new PermissionCheckRequest
checkReq := &base.PermissionCheckRequest{
Expand Down Expand Up @@ -322,7 +322,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

// Initialize a new EngineKeys struct with a new cache.Cache instance
engineKeys := CheckEngineWithCache{nil, nil, cache}
engineKeys := CheckEngineWithCache{nil, nil, cache, nil}

// Create some new PermissionCheckRequests and PermissionCheckResponses
checkReq1 := &base.PermissionCheckRequest{
Expand Down Expand Up @@ -513,7 +513,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -623,7 +623,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -735,7 +735,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -867,7 +867,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -991,7 +991,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -1108,7 +1108,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -1263,7 +1263,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -1389,7 +1389,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -1526,7 +1526,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -1654,7 +1654,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -1772,7 +1772,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -1890,7 +1890,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -2054,7 +2054,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -2206,7 +2206,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -2361,7 +2361,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -2500,7 +2500,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down Expand Up @@ -2651,7 +2651,7 @@ var _ = Describe("cache", func() {
Expect(err).ShouldNot(HaveOccurred())

checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())

invoker := invoke.NewDirectInvoker(
schemaReader,
Expand Down
15 changes: 13 additions & 2 deletions pkg/cmd/serve.go
Expand Up @@ -295,9 +295,19 @@ func serve() func(cmd *cobra.Command, args []string) error {
if err != nil {
return err
}
checker = cache.NewCheckEngineWithCache(checker, schemaReader, engineKeyCache)
checker = cache.NewCheckEngineWithCache(
checker,
schemaReader,
engineKeyCache,
meter,
)
} else {
checker = cache.NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
checker = cache.NewCheckEngineWithCache(
checkEngine,
schemaReader,
engineKeyCache,
meter,
)
}

// Create a localChecker which directly checks without considering distributed setup.
Expand All @@ -306,6 +316,7 @@ func serve() func(cmd *cobra.Command, args []string) error {
checkEngine,
schemaReader,
engineKeyCache,
meter,
)

// Initialize the lookupEngine, which is responsible for looking up certain entities or values.
Expand Down

0 comments on commit 0e5deef

Please sign in to comment.