I tried to create an issue on code.google.com/p/web2py but it crashed
and are currently not working. I'm not sure if issue is created or
not.

Here is c/p:


What steps will reproduce the problem?
1. import memcache client:

from gluon.contrib.memcache import MemcacheClient
memcache_servers = ['127.0.0.1:11211']
cache.memcache = MemcacheClient(request, memcache_servers)

2. define test function

def test():
    mem = cache.memcache('global_counter', lambda: 0, time_expire =
100000)
    mem = cache.memcache.increment('global_counter', 1)

    ram = cache.ram('global_counter', lambda: 0, time_expire = 100000)
    ram = cache.ram.increment('global_counter', 1)

    return '%(mem)s : %(ram)s' % dict(mem = mem, ram = ram)

3. run in browser multiple times

What is the expected output? What do you see instead?

Expected:
1 : 1
2 : 2
3 : 3
4 : 4
...

Shown:
1 : 1
1 : 2
2 : 3
3 : 4
...


What version of the product are you using? On what operating system?

Trunk.

Please provide any additional information below.

Bug is in gluon/contrib/memcache/__init__.py in increment method of
class _MemcacheClient.
Line 66 creates a newKey by adding a prefix (app name).
Line 67 calls self.get(...) which adds another prefix, so the key is
prefixed twice.
Line 71 calls self.set(...) which also adds second prefix.

Bugfix is either to call self.get and self.set with key instead of
newKey, or to call Client.set and Client.get instead.

I attached a diff file which fixes the bug.

Attached:

diff -r 303827f25e8d gluon/contrib/memcache/__init__.py
--- a/gluon/contrib/memcache/__init__.py        Tue Aug 16 12:35:25 2011
-0500
+++ b/gluon/contrib/memcache/__init__.py        Wed Aug 17 11:25:10 2011
+0200
@@ -64,11 +64,11 @@ class _MemcacheClient(Client):

     def increment(self, key, value=1, time_expire=300):
         newKey = self.__keyFormat__(key)
-        obj = self.get(newKey)
+        obj = Client.get(self, newKey)
         if obj:
             return Client.incr(self, newKey, value)
         else:
-            self.set(newKey, value, time_expire)
+            Client.set(self, newKey, value, time_expire)
             return value

     def set(self, key, value, time_expire=300):



Marin

Reply via email to