diff --git a/pkg/meta/redis.go b/pkg/meta/redis.go index f4825a6363f90..8d4d7a57a7e1d 100644 --- a/pkg/meta/redis.go +++ b/pkg/meta/redis.go @@ -84,10 +84,11 @@ import ( type redisMeta struct { *baseMeta - rdb redis.UniversalClient - prefix string - shaLookup string // The SHA returned by Redis for the loaded `scriptLookup` - shaResolve string // The SHA returned by Redis for the loaded `scriptResolve` + rdb redis.UniversalClient + prefix string + shaLookup string // The SHA returned by Redis for the loaded `scriptLookup` + shaResolve string // The SHA returned by Redis for the loaded `scriptResolve` + aclKeyCache map[uint32]string } var _ Meta = &redisMeta{} @@ -243,9 +244,10 @@ func newRedisMeta(driver, addr string, conf *Config) (Meta, error) { } m := &redisMeta{ - baseMeta: newBaseMeta(addr, conf), - rdb: rdb, - prefix: prefix, + baseMeta: newBaseMeta(addr, conf), + rdb: rdb, + prefix: prefix, + aclKeyCache: make(map[uint32]string), } m.en = m m.checkServerConfig() @@ -636,7 +638,11 @@ func (m *redisMeta) totalInodesKey() string { } func (m *redisMeta) aclKey(id uint32) string { - return fmt.Sprintf("%sacl%d", m.prefix, id) + if key, ok := m.aclKeyCache[id]; ok { + return key + } + m.aclKeyCache[id] = fmt.Sprintf("%sacl%d", m.prefix, id) + return m.aclKeyCache[id] } func (m *redisMeta) delfiles() string { diff --git a/pkg/meta/tkv.go b/pkg/meta/tkv.go index 74c2d0e38d0e5..664dad0d948a8 100644 --- a/pkg/meta/tkv.go +++ b/pkg/meta/tkv.go @@ -76,8 +76,9 @@ func (tx *kvTxn) deleteKeys(prefix []byte) { type kvMeta struct { *baseMeta - client tkvClient - snap map[Ino]*DumpedEntry + client tkvClient + snap map[Ino]*DumpedEntry + aclKeyCache map[uint32][]byte } var _ Meta = &kvMeta{} @@ -100,8 +101,9 @@ func newKVMeta(driver, addr string, conf *Config) (Meta, error) { // TODO: ping server and check latency > Millisecond // logger.Warnf("The latency to database is too high: %s", time.Since(start)) m := &kvMeta{ - baseMeta: newBaseMeta(addr, conf), - client: client, + baseMeta: newBaseMeta(addr, conf), + client: client, + aclKeyCache: make(map[uint32][]byte), } m.en = m return m, nil @@ -253,7 +255,11 @@ func (m *kvMeta) dirQuotaKey(inode Ino) []byte { } func (m *kvMeta) aclKey(id uint32) []byte { - return m.fmtKey("R", id) + if key, ok := m.aclKeyCache[id]; ok { + return key + } + m.aclKeyCache[id] = m.fmtKey("R", id) + return m.aclKeyCache[id] } func (m *kvMeta) parseACLId(key string) uint32 {