mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2026-04-26 14:08:29 -05:00
add special nodes to cache key
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
This commit is contained in:
@@ -17,6 +17,7 @@ import (
|
|||||||
"github.com/go-chi/render"
|
"github.com/go-chi/render"
|
||||||
libregraph "github.com/owncloud/libre-graph-api-go"
|
libregraph "github.com/owncloud/libre-graph-api-go"
|
||||||
"github.com/owncloud/ocis/v2/services/graph/pkg/service/v0/errorcode"
|
"github.com/owncloud/ocis/v2/services/graph/pkg/service/v0/errorcode"
|
||||||
|
"golang.org/x/crypto/sha3"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetRootDriveChildren implements the Service interface.
|
// GetRootDriveChildren implements the Service interface.
|
||||||
@@ -219,9 +220,16 @@ func (g Graph) getSpecialDriveItems(ctx context.Context, baseURL *url.URL, space
|
|||||||
if space.GetRoot().GetStorageId() == utils.ShareStorageProviderID {
|
if space.GetRoot().GetStorageId() == utils.ShareStorageProviderID {
|
||||||
return nil // no point in stating the ShareStorageProvider
|
return nil // no point in stating the ShareStorageProvider
|
||||||
}
|
}
|
||||||
|
if space.Opaque == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
imageNode := utils.ReadPlainFromOpaque(space.Opaque, SpaceImageSpecialFolderName)
|
||||||
|
readmeNode := utils.ReadPlainFromOpaque(space.Opaque, ReadmeSpecialFolderName)
|
||||||
|
|
||||||
|
cachekey := spaceRootStatKey(space.Root, imageNode, readmeNode)
|
||||||
// if the root is older or equal to our cache we can reuse the cached extended spaces properties
|
// if the root is older or equal to our cache we can reuse the cached extended spaces properties
|
||||||
if entry := g.specialDriveItemsCache.Get(spaceRootStatKey(space.Root)); entry != nil {
|
if entry := g.specialDriveItemsCache.Get(cachekey); entry != nil {
|
||||||
if cached, ok := entry.Value().(specialDriveItemEntry); ok {
|
if cached, ok := entry.Value().(specialDriveItemEntry); ok {
|
||||||
if cached.rootMtime != nil && space.Mtime != nil {
|
if cached.rootMtime != nil && space.Mtime != nil {
|
||||||
// beware, LaterTS does not handle equalness. it returns t1 if t1 > t2, else t2, so a >= check looks like this
|
// beware, LaterTS does not handle equalness. it returns t1 if t1 > t2, else t2, so a >= check looks like this
|
||||||
@@ -233,17 +241,14 @@ func (g Graph) getSpecialDriveItems(ctx context.Context, baseURL *url.URL, space
|
|||||||
}
|
}
|
||||||
|
|
||||||
var spaceItems []libregraph.DriveItem
|
var spaceItems []libregraph.DriveItem
|
||||||
if space.Opaque == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
metadata := space.Opaque.Map
|
|
||||||
names := [2]string{SpaceImageSpecialFolderName, ReadmeSpecialFolderName}
|
|
||||||
|
|
||||||
for _, itemName := range names {
|
for itemName, itemNode := range map[string]string{
|
||||||
// The default is a path relative to the space root
|
SpaceImageSpecialFolderName: imageNode,
|
||||||
|
ReadmeSpecialFolderName: readmeNode,
|
||||||
|
} {
|
||||||
var ref storageprovider.Reference
|
var ref storageprovider.Reference
|
||||||
if itemID, ok := metadata[itemName]; ok {
|
if itemNode != "" {
|
||||||
rid, _ := storagespace.ParseID(string(itemID.Value))
|
rid, _ := storagespace.ParseID(itemNode)
|
||||||
// add the storageID of the space, all drive items of this space belong to the same storageID
|
// add the storageID of the space, all drive items of this space belong to the same storageID
|
||||||
rid.StorageId = space.GetRoot().GetStorageId()
|
rid.StorageId = space.GetRoot().GetStorageId()
|
||||||
ref = storageprovider.Reference{
|
ref = storageprovider.Reference{
|
||||||
@@ -261,17 +266,26 @@ func (g Graph) getSpecialDriveItems(ctx context.Context, baseURL *url.URL, space
|
|||||||
specialDriveItems: spaceItems,
|
specialDriveItems: spaceItems,
|
||||||
rootMtime: space.Mtime,
|
rootMtime: space.Mtime,
|
||||||
}
|
}
|
||||||
g.specialDriveItemsCache.Set(spaceRootStatKey(space.Root), spacePropertiesEntry, time.Duration(g.config.Spaces.ExtendedSpacePropertiesCacheTTL))
|
g.specialDriveItemsCache.Set(cachekey, spacePropertiesEntry, time.Duration(g.config.Spaces.ExtendedSpacePropertiesCacheTTL))
|
||||||
|
|
||||||
return spaceItems
|
return spaceItems
|
||||||
}
|
}
|
||||||
|
|
||||||
// generates a space root stat cache key used to detect changes in a space
|
// generates a space root stat cache key used to detect changes in a space
|
||||||
func spaceRootStatKey(id *storageprovider.ResourceId) string {
|
// takes into account the special nodes because changing metadata does not affect the etag / mtime
|
||||||
|
func spaceRootStatKey(id *storageprovider.ResourceId, imagenode, readmeNode string) string {
|
||||||
if id == nil {
|
if id == nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
return id.StorageId + "$" + id.SpaceId + "!" + id.OpaqueId
|
sha3 := sha3.NewShake256()
|
||||||
|
sha3.Write([]byte(id.GetStorageId()))
|
||||||
|
sha3.Write([]byte(id.GetSpaceId()))
|
||||||
|
sha3.Write([]byte(id.GetOpaqueId()))
|
||||||
|
sha3.Write([]byte(imagenode))
|
||||||
|
sha3.Write([]byte(readmeNode))
|
||||||
|
h := make([]byte, 64)
|
||||||
|
sha3.Read(h)
|
||||||
|
return fmt.Sprintf("%x", h)
|
||||||
}
|
}
|
||||||
|
|
||||||
type specialDriveItemEntry struct {
|
type specialDriveItemEntry struct {
|
||||||
|
|||||||
Reference in New Issue
Block a user