mirror of
https://github.com/openimsdk/open-im-server.git
synced 2026-05-04 00:55:59 +08:00
fix: resolve deadlock in cache eviction and improve GetBatch implementation and full id version (#3591)
* fix: performance issues with Kafka caused by encapsulating the MQ interface * fix: admin token in standalone mode * fix: full id version * fix: resolve deadlock in cache eviction and improve GetBatch implementation
This commit is contained in:
@@ -52,8 +52,53 @@ type ExpirationLRU[K comparable, V any] struct {
|
||||
}
|
||||
|
||||
func (x *ExpirationLRU[K, V]) GetBatch(keys []K, fetch func(keys []K) (map[K]V, error)) (map[K]V, error) {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
var (
|
||||
err error
|
||||
results = make(map[K]V)
|
||||
misses = make([]K, 0, len(keys))
|
||||
)
|
||||
|
||||
for _, key := range keys {
|
||||
x.lock.Lock()
|
||||
v, ok := x.core.Get(key)
|
||||
x.lock.Unlock()
|
||||
if ok {
|
||||
x.target.IncrGetHit()
|
||||
v.lock.RLock()
|
||||
results[key] = v.value
|
||||
if v.err != nil && err == nil {
|
||||
err = v.err
|
||||
}
|
||||
v.lock.RUnlock()
|
||||
continue
|
||||
}
|
||||
misses = append(misses, key)
|
||||
}
|
||||
|
||||
if len(misses) == 0 {
|
||||
return results, err
|
||||
}
|
||||
|
||||
fetchValues, fetchErr := fetch(misses)
|
||||
if fetchErr != nil && err == nil {
|
||||
err = fetchErr
|
||||
}
|
||||
|
||||
for key, val := range fetchValues {
|
||||
results[key] = val
|
||||
if fetchErr != nil {
|
||||
x.target.IncrGetFailed()
|
||||
continue
|
||||
}
|
||||
x.target.IncrGetSuccess()
|
||||
item := &expirationLruItem[V]{value: val}
|
||||
x.lock.Lock()
|
||||
x.core.Add(key, item)
|
||||
x.lock.Unlock()
|
||||
}
|
||||
|
||||
// any keys not returned from fetch remain absent (no cache write)
|
||||
return results, err
|
||||
}
|
||||
|
||||
func (x *ExpirationLRU[K, V]) Get(key K, fetch func() (V, error)) (V, error) {
|
||||
|
||||
@@ -35,7 +35,7 @@ type slotLRU[K comparable, V any] struct {
|
||||
func (x *slotLRU[K, V]) GetBatch(keys []K, fetch func(keys []K) (map[K]V, error)) (map[K]V, error) {
|
||||
var (
|
||||
slotKeys = make(map[uint64][]K)
|
||||
kVs = make(map[K]V)
|
||||
vs = make(map[K]V)
|
||||
)
|
||||
|
||||
for _, k := range keys {
|
||||
@@ -49,10 +49,10 @@ func (x *slotLRU[K, V]) GetBatch(keys []K, fetch func(keys []K) (map[K]V, error)
|
||||
return nil, err
|
||||
}
|
||||
for key, value := range batches {
|
||||
kVs[key] = value
|
||||
vs[key] = value
|
||||
}
|
||||
}
|
||||
return kVs, nil
|
||||
return vs, nil
|
||||
}
|
||||
|
||||
func (x *slotLRU[K, V]) getIndex(k K) uint64 {
|
||||
|
||||
Reference in New Issue
Block a user