graph: Make user and group lookup cache re-usable
drives.go implemented a local user/group cache (ttl based) to speed up repeated user and group lookups. This commit moves the implementation to the 'identity' module to make it usable outside of drives.go.
This commit is contained in:
committed by
Ralf Haferkamp
parent
f2599dfa76
commit
c9df9f5f31
@@ -23,7 +23,6 @@ import (
|
||||
"github.com/cs3org/reva/v2/pkg/storagespace"
|
||||
"github.com/cs3org/reva/v2/pkg/utils"
|
||||
"github.com/go-chi/render"
|
||||
"github.com/jellydator/ttlcache/v3"
|
||||
libregraph "github.com/owncloud/libre-graph-api-go"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/service/grpc"
|
||||
v0 "github.com/owncloud/ocis/v2/protogen/gen/ocis/messages/settings/v0"
|
||||
@@ -780,28 +779,16 @@ func (g Graph) cs3PermissionsToLibreGraph(ctx context.Context, space *storagepro
|
||||
tmp := id
|
||||
var identitySet libregraph.IdentitySet
|
||||
if _, ok := groupsMap[id]; ok {
|
||||
var group libregraph.Group
|
||||
if item := g.groupsCache.Get(id); item == nil {
|
||||
if requestedGroup, err := g.identityBackend.GetGroup(ctx, id, url.Values{}); err == nil {
|
||||
group = *requestedGroup
|
||||
g.groupsCache.Set(id, group, ttlcache.DefaultTTL)
|
||||
}
|
||||
} else {
|
||||
group = item.Value()
|
||||
group, err := g.identityCache.GetGroup(ctx, tmp)
|
||||
if err != nil {
|
||||
g.logger.Warn().Str("groupid", tmp).Msg("Group not found by id")
|
||||
}
|
||||
|
||||
identitySet = libregraph.IdentitySet{Group: &libregraph.Identity{Id: &tmp, DisplayName: group.GetDisplayName()}}
|
||||
} else {
|
||||
var user libregraph.User
|
||||
if item := g.usersCache.Get(id); item == nil {
|
||||
if requestedUser, err := g.identityBackend.GetUser(ctx, id, &godata.GoDataRequest{}); err == nil {
|
||||
user = *requestedUser
|
||||
g.usersCache.Set(id, user, ttlcache.DefaultTTL)
|
||||
}
|
||||
} else {
|
||||
user = item.Value()
|
||||
user, err := g.identityCache.GetUser(ctx, tmp)
|
||||
if err != nil {
|
||||
g.logger.Warn().Str("userid", tmp).Msg("User not found by id")
|
||||
}
|
||||
|
||||
identitySet = libregraph.IdentitySet{User: &libregraph.Identity{Id: &tmp, DisplayName: user.GetDisplayName()}}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,6 @@ import (
|
||||
"github.com/cs3org/reva/v2/pkg/storagespace"
|
||||
"github.com/go-chi/chi/v5"
|
||||
"github.com/jellydator/ttlcache/v3"
|
||||
libregraph "github.com/owncloud/libre-graph-api-go"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/keycloak"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/log"
|
||||
ehsvc "github.com/owncloud/ocis/v2/protogen/gen/ocis/services/eventhistory/v0"
|
||||
@@ -71,8 +70,7 @@ type Graph struct {
|
||||
roleService RoleService
|
||||
permissionsService Permissions
|
||||
specialDriveItemsCache *ttlcache.Cache[string, interface{}]
|
||||
usersCache *ttlcache.Cache[string, libregraph.User]
|
||||
groupsCache *ttlcache.Cache[string, libregraph.Group]
|
||||
identityCache identity.IdentityCache
|
||||
eventsPublisher events.Publisher
|
||||
searchService searchsvc.SearchProviderService
|
||||
keycloakClient keycloak.Client
|
||||
|
||||
@@ -16,7 +16,6 @@ import (
|
||||
"github.com/go-chi/chi/v5/middleware"
|
||||
ldapv3 "github.com/go-ldap/ldap/v3"
|
||||
"github.com/jellydator/ttlcache/v3"
|
||||
libregraph "github.com/owncloud/libre-graph-api-go"
|
||||
ocisldap "github.com/owncloud/ocis/v2/ocis-pkg/ldap"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/registry"
|
||||
"github.com/owncloud/ocis/v2/ocis-pkg/roles"
|
||||
@@ -125,29 +124,18 @@ func NewService(opts ...Option) (Graph, error) {
|
||||
)
|
||||
go spacePropertiesCache.Start()
|
||||
|
||||
usersCache := ttlcache.New(
|
||||
ttlcache.WithTTL[string, libregraph.User](
|
||||
time.Duration(options.Config.Spaces.UsersCacheTTL),
|
||||
),
|
||||
ttlcache.WithDisableTouchOnHit[string, libregraph.User](),
|
||||
identityCache := identity.NewIdentityCache(
|
||||
identity.IdentityCacheWithGatewaySelector(options.GatewaySelector),
|
||||
identity.IdentityCacheWithUsersTTL(time.Duration(options.Config.Spaces.UsersCacheTTL)),
|
||||
identity.IdentityCacheWithGroupsTTL(time.Duration(options.Config.Spaces.GroupsCacheTTL)),
|
||||
)
|
||||
go usersCache.Start()
|
||||
|
||||
groupsCache := ttlcache.New(
|
||||
ttlcache.WithTTL[string, libregraph.Group](
|
||||
time.Duration(options.Config.Spaces.GroupsCacheTTL),
|
||||
),
|
||||
ttlcache.WithDisableTouchOnHit[string, libregraph.Group](),
|
||||
)
|
||||
go groupsCache.Start()
|
||||
|
||||
svc := Graph{
|
||||
config: options.Config,
|
||||
mux: m,
|
||||
logger: &options.Logger,
|
||||
specialDriveItemsCache: spacePropertiesCache,
|
||||
usersCache: usersCache,
|
||||
groupsCache: groupsCache,
|
||||
identityCache: identityCache,
|
||||
eventsPublisher: options.EventsPublisher,
|
||||
gatewaySelector: options.GatewaySelector,
|
||||
searchService: options.SearchService,
|
||||
|
||||
Reference in New Issue
Block a user