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

Reply via email to