Skip to content

Conversation

@dongnguyenvt
Copy link
Contributor

No description provided.

@hashicorp-cla
Copy link

hashicorp-cla commented Jun 17, 2023

CLA assistant check
All committers have signed the CLA.

// Check for existing item
if ent, ok := c.items[key]; ok {
c.evictList.moveToFront(ent)
if c.onEvict != nil {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there is an alternative way that use the lru.ContainsOrAdd interface and check exist boolean return

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

curious why onEvict needs to be called when adding an existing item?
This caused issue in our use case, where we used gRPC channel as ent.value, and onEvict will close the channel unexpectedly if we try to add that existing channel again

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll leave it for maintainers of this project to make the call

  • the value is dropped from cache, and some projects rely on evict callback to cleanup (cgo project will also free memory), in some race condition it can cause memory leak and hard to trace
  • in your usecase you can use the somewhat side-effect free ContainsOrAdd

p/s: not sure why you adding back grpc connection to the cache that you just picked from

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand using evict when item is dropped from cache. But in this code block, why do we need to drop from cache? Isn't c.evictList.moveToFront(ent) is enough and the item should still be kept in the cache?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you can see right after that the value is overrided with new value, so old value is drop, in your usecase it seems both values are same

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, this behavior came as a surprise for us, as we had a large cache size and didn't expect evict callback to be triggered. Anyways, we can use something like ContainsOrAdd as you suggested

@jefferai
Copy link
Member

Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

4 participants