fall back for memcached to db caching

54 views
Skip to first unread message

Adi

unread,
Dec 24, 2012, 4:04:08 PM12/24/12
to web...@googlegroups.com
Tried catching the exception when memcache is not available to switch to db caching, but getting an excepting.

Should it be possible to catch this exception, ignore it and continue running?

Thanks,
Adnan


try:
   
from gluon.contrib.memcache import MemcacheClient
    memcache_servers
= ['127.0.0.1:11211']
    cache
.memcache = MemcacheClient(request, memcache_servers)
    cache
.ram = cache.disk = cache.memcache
   
from gluon.contrib.memdb import MEMDB
    session
.connect(request,response,db=MEMDB(cache.memcache))
except:
    sys
.exc_clear()
    session
.connect(request, response, db=db)
   
pass



Traceback (most recent call last):
 
File "/Users/adnan/web2py24/gluon/main.py", line 557, in wsgibase
 session
._try_store_in_db(request, response)
 
File "/Users/adnan/web2py24/gluon/globals.py", line 739, in _try_store_in_db
 record_id
= table.insert(**dd)
 
File "/Users/adnan/web2py24/gluon/contrib/memdb.py", line 256, in insert
 id
= self._create_id()
 
File "/Users/adnan/web2py24/gluon/contrib/memdb.py", line 296, in _create_id
 
raise Exception('cannot set memcache')
Exception: cannot set memcache



Frames
 
 

 
File /Users/adnan/web2py24/gluon/main.py in wsgibase at line 557 code arguments variables
 
 

 
File /Users/adnan/web2py24/gluon/globals.py in _try_store_in_db at line 739 code arguments variables
 
 

 
File /Users/adnan/web2py24/gluon/contrib/memdb.py in insert at line 256 code arguments variables
 
 

 
File /Users/adnan/web2py24/gluon/contrib/memdb.py in _create_id at line 296 code arguments variables
 
Function argument list

(self=<DALStorage {'client_ip': <gluon.contrib.memdb.F...luon.contrib.memdb.Field object at 0x111d554d0>}>)
 
Code listing
291.
292.
293.
294.
295.

296.
297.
298.
299.
300.
 id
= self._tableobj.incr(shard_id)
 
if not id:
 
if self._tableobj.set(shard_id, '0'):
 id
= 0
 
else:

 
raise Exception('cannot set memcache')
 
return long(str(shard) + str(id))

 
def __str__(self):
 
return self._tablename












Massimo Di Pierro

unread,
Dec 24, 2012, 10:11:17 PM12/24/12
to web...@googlegroups.com
Can you try replace:

except:

with

except Exception:
<span style="color: #066;" class="styled-by-prettify"...
Show original

Adi

unread,
Dec 25, 2012, 6:01:19 AM12/25/12
to web...@googlegroups.com
Thanks Massimo. The exception works fine, but the problem raised when calling a grid. Didn't realize it's not possible to connect to another session within the "except" segment. Seems that code has to be outside. Still learning python here :)


db
.py
-----

try:
   
from gluon.contrib.memcache import MemcacheClient
    memcache_servers
= ['127.0.0.1:11211']
    cache
.memcache = MemcacheClient(request, memcache_servers)
    cache
.ram = cache.disk = cache.memcache
   
from gluon.contrib.memdb import MEMDB
    session
.connect(request,response,db=MEMDB(cache.memcache))
except Exception:
    session
.connect(request, response, db=db) # doesn't work
   
pass

# had to do it this way, and then all works as expected
if not session:
    session
.connect(request, response, db=db)

db
.define_table('mytable',Field('myfield','string'))


default.py
----------
def gr():
    q
= (db.mytable.id>0)
    grid
=SQLFORM.grid(q)
   
return dict()

Massimo Di Pierro

unread,
Dec 25, 2012, 6:23:28 AM12/25/12
to web...@googlegroups.com
I am not sure I fully understand the problem.

One issue is that you cannot do:

try:
      redirect(url)
except:
      something

you have to do

try:
      redirect(url)
except HTTP, e:
      raise e
except:
      db.rollback() # maybe
      something

because a redirect will raise HTTP which extends Exception. You need to re-reise it for it to work.

Massimo
code arguments variables
 
 

 
File /Users</spa...
Show original

Adnan Smajlovic

unread,
Dec 25, 2012, 2:14:57 PM12/25/12
to web...@googlegroups.com
What I wanted to do is when there is no memcache installed, or something happens to it while running, the application should switch automatically to db sessions, rather than just throw an error.

The code I got bellow re-creates the problem, but if I add an extra if not session: session.connect(request, response, db=db) it works fine for my purposes.

Sorry that I'm explaining this upside-down :)


--
 
 
 

Reply all
Reply to author
Forward
0 new messages