The pattern is identical between the one in the wiki and yours. Simply
move the delete of the key until you're done using the lock, which would
be in a separate request.

In your case, you would probably set the contents of the key to be the
name of the user who has it locked.

In the original pseudocode:
key  = "expensive_frontpage_item"
item = memcli:get(key)
if (! defined item) {
    # Oh crap, we have to recache it!
    # Give us 60 seconds to recache the item.
    if (memcli:add(key . "_lock", 60)) {
        item = fetch_expensive_thing_from_database
        memcli:add(key, item, 86400)
        memcli:delete(key . "_lock")
    } else {
        # Lost the race. We can do any number of things:
        # - short sleep, then re-fetch.
        # - try the above a few times, then slow-fetch and return the item
        # - show the user a page without this expensive content
        # - show some less expensive content
        # - throw an error
    }
}
return item

In yours:
key = filename
item = memcli:get(key)
if (! defined item) {
  if (memcli:add(key . "_lock", lock_timeout_time, my_admin_username)) {
     [etc]
  } else {
     # lost the race, handle how you want
  }
} else if (item.value == my_admin_username) {
  # good to go for that future request
}

Then when you're done holding the lock, delete the key.

On Sat, 4 Jun 2016, Nishant Varma wrote:

> I am reading 
> https://github.com/memcached/memcached/wiki/ProgrammingTricks#ghetto-central-locking,
>  it seems to deal with a slightly different lock scenario of getting some
> expensive item from Database to avoid "Stampeding"
> In my case its slightly different lock that I need. I show regular files from 
> a folder in a web application to many users. So, to "lock" a file using 
> memcache isn't this
> simple API sufficient or I still need that pattern :-)?
> def access(filename):
>      if memcache.add(filename, timestamp):
>         return "Access Granted. Lock Obtained" # Normally this results in 
> checking HTML checkbox against the filename so User can do actions with that/
>      else:
>         return "Access Denied" # Normally this leads to an alert saying that 
> someone else is working on this.
>
> Isn't this simple API using add good enough in my case? I am sorry if I am 
> repeating this, but I could not really relate the "fetching expensive item 
> from Database" to my
> scenario which is why I even wrote a simple script to test the validity of 
> the claim etc.
>
> Can you please let me know?
>
>
> On Saturday, June 4, 2016 at 6:42:35 PM UTC+5:30, Nishant Varma wrote:
>       Excellent I rely on you. I guess this is the reason you say I am 
> over-engineering this problem. Makes sense :-) I will again check the link 
> you gave me. I will go
>       through the documentation this weekend.
>
>       On Saturday, June 4, 2016 at 1:33:04 PM UTC+5:30, Dormando wrote:
>             Hey,
>
>             You really don't need to test this: I'm telling you flatly, as an 
> author
>             of this software and all of the documentation for it, that you 
> should
>             absolutely not rely on that pattern. I'm trying to save you some 
> time.
>
>             The pattern that is slightly better is written explicitly in 
> pseudocode in
>             the link I gave you several times in the issue. Please use it.
>
>             Thanks,
>             -Dormando
>
>             On Fri, 3 Jun 2016, Nishant Varma wrote:
>
>             > Can anyone help me peer review this script 
> https://gist.github.com/varmanishant/0129286d41038cc21471652a6460a5ff that 
> demonstrate potential problems
>             with get set if it is used
>             > to implement distributed locking. I was suggested to modify 
> from get set to add in this thread 
> https://github.com/memcached/memcached/issues/163.
>             However I wanted a small
>             > simulation to demonstrate this.
>             >
>             > --
>             >
>             > ---
>             > You received this message because you are subscribed to the 
> Google Groups "memcached" group.
>             > To unsubscribe from this group and stop receiving emails from 
> it, send an email to memcached+...@googlegroups.com.
>             > For more options, visit https://groups.google.com/d/optout.
>             >
>             >
>
>
> This e-mail message (including any attachments) may contain information that 
> is confidential, protected by the attorney-client or other applicable 
> privileges, or otherwise
> comprising non-public information. This message is intended to be conveyed 
> only to the designated recipient(s). If you have any reason to believe you 
> are not an intended
> recipient of this message, please notify the sender by replying to this 
> message and then deleting it from your system. Any use, dissemination, 
> distribution, or reproduction of
> this message by unintended recipients is not authorized and may be unlawful.
>
> --
>
> ---
> You received this message because you are subscribed to the Google Groups 
> "memcached" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to memcached+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>
>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"memcached" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to memcached+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to