I believe this is triggering infinite recursion:
pg.py class DB:
def __getattr__(self, name):
# All undefined members are same as in underlying connection:
if self.db:
return getattr(self.db, name)
"if self.db" seems to be itself calling getattr (?)
We saw this when we hit PG max_connections.
(gdb) py-bt
#4 file '/usr/lib64/python2.6/site-packages/pg.py', in '__getattr__'
#10 file '/usr/lib64/python2.6/site-packages/pg.py', in '__getattr__'
#16 file '/usr/lib64/python2.6/site-packages/pg.py', in '__getattr__'
#22 file '/usr/lib64/python2.6/site-packages/pg.py', in '__getattr__'
#28 file '/usr/lib64/python2.6/site-packages/pg.py', in '__getattr__'
#34 file '/usr/lib64/python2.6/site-packages/pg.py', in '__getattr__'
#40 file '/usr/lib64/python2.6/site-packages/pg.py', in '__getattr__'
[...]
(gdb) bt
#0 PyString_FromFormatV (format=<value optimized out>, vargs=0x7fff6c76d3d0)
at Objects/stringobject.c:244
#1 0x0000003efd6e06e0 in PyErr_Format (exception=<type at remote
0x3efd9674c0>, format=<value optimized out>) at Python/errors.c:546
#2 0x0000003efd653051 in instance_getattr1 (inst=0x24b8c68, name='db') at
Objects/classobject.c:717
#3 instance_getattr (inst=0x24b8c68, name='db') at Objects/classobject.c:754
#4 0x0000003efd6d210a in PyEval_EvalFrameEx (f=<value optimized out>,
throwflag=<value optimized out>) at Python/ceval.c:2123
#5 0x0000003efd6d7647 in PyEval_EvalCodeEx (co=0x1564af8, globals=<value
optimized out>, locals=<value optimized out>, args=<value optimized out>,
argcount=2, kws=0x0, kwcount=0, defs=0x0,
defcount=0, closure=0x0) at Python/ceval.c:3044
#6 0x0000003efd66aca0 in function_call (func=<function at remote 0x1626848>,
arg=(<DB() at remote 0x24b8c68>, 'db'), kw=0x0) at Objects/funcobject.c:524
#7 0x0000003efd643c63 in PyObject_Call (func=<function at remote 0x1626848>,
arg=<value optimized out>, kw=<value optimized out>) at Objects/abstract.c:2492
#8 0x0000003efd6cfc83 in PyEval_CallObjectWithKeywords (func=<function at
remote 0x1626848>, arg=(<DB() at remote 0x24b8c68>, 'db'), kw=<value optimized
out>) at Python/ceval.c:3663
#9 0x0000003efd652fdf in instance_getattr (inst=0x24b8c68, name=<value
optimized out>) at Objects/classobject.c:763
#10 0x0000003efd6d210a in PyEval_EvalFrameEx (f=<value optimized out>,
throwflag=<value optimized out>) at Python/ceval.c:2123
#11 0x0000003efd6d7647 in PyEval_EvalCodeEx (co=0x1564af8, globals=<value
optimized out>, locals=<value optimized out>, args=<value optimized out>,
argcount=2, kws=0x0, kwcount=0, defs=0x0,
defcount=0, closure=0x0) at Python/ceval.c:3044
#12 0x0000003efd66aca0 in function_call (func=<function at remote 0x1626848>,
arg=(<DB() at remote 0x24b8c68>, 'db'), kw=0x0) at Objects/funcobject.c:524
#13 0x0000003efd643c63 in PyObject_Call (func=<function at remote 0x1626848>,
arg=<value optimized out>, kw=<value optimized out>) at Objects/abstract.c:2492
#14 0x0000003efd6cfc83 in PyEval_CallObjectWithKeywords (func=<function at
remote 0x1626848>, arg=(<DB() at remote 0x24b8c68>, 'db'), kw=<value optimized
out>) at Python/ceval.c:3663
#15 0x0000003efd652fdf in instance_getattr (inst=0x24b8c68, name=<value
optimized out>) at Objects/classobject.c:763
#16 0x0000003efd6d210a in PyEval_EvalFrameEx (f=<value optimized out>,
throwflag=<value optimized out>) at Python/ceval.c:2123
#17 0x0000003efd6d7647 in PyEval_EvalCodeEx (co=0x1564af8, globals=<value
optimized out>, locals=<value optimized out>, args=<value optimized out>,
argcount=2, kws=0x0, kwcount=0, defs=0x0,
defcount=0, closure=0x0) at Python/ceval.c:3044
[...]
(gdb) bt f
#0 PyString_FromFormatV (format=<value optimized out>, vargs=0x7fff6c76d3d0)
at Objects/stringobject.c:244
count = {{gp_offset = 16, fp_offset = 48, overflow_arg_area =
0x7fff6c76d4c0, reg_save_area = 0x7fff6c76d3f0}}
n = <value optimized out>
f = 0x3efd7185b0 "stance has no attribute '%.400s'"
s = 0x7efd37915afa "tance has no attribute 'db'"
string = "DB instance has no attribute 'db'"
#1 0x0000003efd6e06e0 in PyErr_Format (exception=<type at remote
0x3efd9674c0>, format=<value optimized out>) at Python/errors.c:546
vargs = {{gp_offset = 24, fp_offset = 48, overflow_arg_area =
0x7fff6c76d4c0, reg_save_area = 0x7fff6c76d3f0}}
string = <value optimized out>
#2 0x0000003efd653051 in instance_getattr1 (inst=0x24b8c68, name='db') at
Objects/classobject.c:717
v = <value optimized out>
sname = <value optimized out>
#3 instance_getattr (inst=0x24b8c68, name='db') at Objects/classobject.c:754
func = <value optimized out>
res = <value optimized out>
#4 0x0000003efd6d210a in PyEval_EvalFrameEx (f=<value optimized out>,
throwflag=<value optimized out>) at Python/ceval.c:2123
stack_pointer = 0x251c3f0
next_instr = 0x1565212 "o\021"
opcode = <value optimized out>
oparg = <value optimized out>
why = WHY_NOT
err = 0
x = <DB() at remote 0x24b8c68>
v = <value optimized out>
w = 'db'
u = <value optimized out>
t = <value optimized out>
stream = 0x0
fastlocals = <value optimized out>
freevars = 0x251c3e8
retval = 0x0
tstate = <value optimized out>
co = 0x1564af8
instr_ub = -1
instr_lb = 0
instr_prev = -1
first_instr = 0x156520c "|"
names = ('db', 'getattr', '_int_error')
consts = (None, 'Connection is not valid')
[...]
Let me know if there's any questions.
Justin
_______________________________________________
PyGreSQL mailing list
[email protected]
https://mail.vex.net/mailman/listinfo.cgi/pygresql