Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

API Coverage - Implement LMPOP #273

Open
TalZaccai opened this issue Apr 12, 2024 · 2 comments
Open

API Coverage - Implement LMPOP #273

TalZaccai opened this issue Apr 12, 2024 · 2 comments
Labels
API good first issue Good for newcomers help wanted Extra attention is needed

Comments

@TalZaccai
Copy link
Contributor

TalZaccai commented Apr 12, 2024

Here's your opportunity to implement a RESP command in Garnet!

LMPOP

Syntax:
LMPOP numkeys key [key ...] <LEFT | RIGHT> [COUNT count]

Command description:

Pops one or more elements from the first non-empty list key from the list of provided key names.

Elements are popped from either the left or right of the first non-empty list based on the passed argument. The number of returned elements is limited to the lower between the non-empty list's length, and the count argument (which defaults to 1).

Response:

One of the following:

  • Nil reply: if no element could be popped.
  • Array reply: a two-element array with the first element being the name of the key from which elements were popped and the second element being an array of elements.

How to approach this task:

  1. Add the new command info to the listCommandsInfoMap in the RespCommandsInfo class (Garnet.server/Resp/RespCommandsInfo.cs)
  2. Add the new command string to the returned HashSet in the RespInfo.GetCommands method (Garnet.server/Resp/RespInfo.cs)
  3. Add the appropriate fast parsing logic for the new command in the RespCommand.FastParseArrayCommand method (use other commands as reference) (Garnet.server/Resp/RespCommand.cs)
  4. Implement the wrapper method to the storage layer in StorageSession (Garnet.server/Storage/Session/ObjectStore/ListOps.cs)
  5. Define a new method in IGarnetAPI or IGarnetReadAPI and implement it in GarnetApiObjectCommands, calling the method you have implemented in step #4 (Garnet.server/API/IGarnetAPI.cs, Garnet.server/API/GarnetApiObjectCommands.cs)
  6. Add a new method to the RespServerSession class which will call the storage API and return the appropriate response (Garnet.server/Resp/Objects/ListCommands.cs)
  7. Add a new method to ListObjImpl which will perform the required operation on the list object (Garnet.server/Objects/List/ListObjectImpl.cs)
  8. Add a new enum value to ListOperation and add the appropriate case to the switch in ListObject.Operate, in which you will call the method defined in step #8 (Garnet.server/Objects/List/ListObject.cs)
  9. Add an appropriate case to the switch in TransactionManager.ListObjectKeys (Garnet.server/Transaction/TxnKeyManager.cs)
  10. Add tests for the new command in the RespListTests class (Garnet.test/RespListTests.cs)

Tip: First add a simple test that calls the new command and use it to debug as you develop, it will make your life much easier!

If you have any questions, the Garnet team is here to help!

@TalZaccai TalZaccai added good first issue Good for newcomers help wanted Extra attention is needed API labels Apr 12, 2024
@Zombach
Copy link

Zombach commented Apr 20, 2024

@TalZaccai I'm interested in taking a stab at this!

@TalZaccai
Copy link
Contributor Author

@TalZaccai I'm interested in taking a stab at this!

Go for it! LMK if you have any questions!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
API good first issue Good for newcomers help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

2 participants