github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/chat/storage/blockengine_memcache.go (about)

     1  package storage
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/keybase/client/go/logger"
     7  
     8  	lru "github.com/hashicorp/golang-lru"
     9  	"github.com/keybase/client/go/libkb"
    10  	"github.com/keybase/client/go/protocol/chat1"
    11  	"github.com/keybase/client/go/protocol/gregor1"
    12  	context "golang.org/x/net/context"
    13  )
    14  
    15  type logContext struct {
    16  	log  logger.Logger
    17  	vlog *libkb.VDebugLog
    18  }
    19  
    20  func newLogContext() *logContext {
    21  	return &logContext{
    22  		log:  logger.NewNull(),
    23  		vlog: libkb.NewVDebugLog(logger.NewNull()),
    24  	}
    25  }
    26  
    27  func (c *logContext) GetLog() logger.Logger {
    28  	return c.log
    29  }
    30  
    31  func (c *logContext) GetVDebugLog() *libkb.VDebugLog {
    32  	return c.vlog
    33  }
    34  
    35  type blockEngineMemCacheImpl struct {
    36  	blockCache *lru.Cache
    37  	logContext *logContext
    38  	lockTab    *libkb.LockTable
    39  }
    40  
    41  func newBlockEngineMemCache() *blockEngineMemCacheImpl {
    42  	c, _ := lru.New(100)
    43  	return &blockEngineMemCacheImpl{
    44  		blockCache: c,
    45  		logContext: newLogContext(),
    46  		lockTab:    libkb.NewLockTable(),
    47  	}
    48  }
    49  
    50  func (b *blockEngineMemCacheImpl) key(uid gregor1.UID, convID chat1.ConversationID, id int) string {
    51  	return fmt.Sprintf("%s:%s:%d", uid, convID, id)
    52  }
    53  
    54  func (b *blockEngineMemCacheImpl) getBlock(ctx context.Context, uid gregor1.UID,
    55  	convID chat1.ConversationID, id int) (block, bool) {
    56  	key := b.key(uid, convID, id)
    57  	lock := b.lockTab.AcquireOnName(ctx, b.logContext, key)
    58  	defer lock.Release(ctx)
    59  	if v, ok := b.blockCache.Get(key); ok {
    60  		bl := v.(block)
    61  		var retMsgs [blockSize]chat1.MessageUnboxed
    62  		for i := 0; i < blockSize; i++ {
    63  			retMsgs[i] = bl.Msgs[i].DeepCopy()
    64  		}
    65  		return block{
    66  			BlockID: bl.BlockID,
    67  			Msgs:    retMsgs,
    68  		}, true
    69  	}
    70  	return block{}, false
    71  }
    72  
    73  func (b *blockEngineMemCacheImpl) writeBlock(ctx context.Context, uid gregor1.UID,
    74  	convID chat1.ConversationID, bl block) {
    75  	key := b.key(uid, convID, bl.BlockID)
    76  	lock := b.lockTab.AcquireOnName(ctx, b.logContext, key)
    77  	defer lock.Release(ctx)
    78  	var storedMsgs [blockSize]chat1.MessageUnboxed
    79  	for i := 0; i < blockSize; i++ {
    80  		storedMsgs[i] = bl.Msgs[i].DeepCopy()
    81  	}
    82  	b.blockCache.Add(key, block{
    83  		BlockID: bl.BlockID,
    84  		Msgs:    storedMsgs,
    85  	})
    86  }
    87  
    88  func (b *blockEngineMemCacheImpl) OnLogout(m libkb.MetaContext) error {
    89  	b.blockCache.Purge()
    90  	return nil
    91  }
    92  
    93  func (b *blockEngineMemCacheImpl) OnDbNuke(m libkb.MetaContext) error {
    94  	b.blockCache.Purge()
    95  	return nil
    96  }
    97  
    98  var blockEngineMemCache = newBlockEngineMemCache()