我通过官方的sqlanydb驱动程序与SQLAnywhere 12一起使用Twisted 11。Python + Twisted + sqlanydb = abort()
通常,它工作正常。
但是偶尔应用程序会在第一个查询中异常终止。
如果一个查询工作,所有以下的工作。但是我的测试很少通过。
这是可怕的发展和strace并没有告诉我任何信息太多。有时它崩溃在select()内,有时在mmap()...
我正在运行64位Linux并在本地运行Sybase作为dbeng12进行测试。
是否有人正在成功使用这些组件?任何建议如何解决?我以前用过Django的sqlanydb,它从不崩溃。
使用打印,我发现它崩溃DeferredList内,重要的代码基本上是以下几点:
class WhoisDb(object):
# ... shortened ...
def _get_contacts(self, dom):
if not dom:
self.d.errback(UnknownDomain(self._get_limit()))
return
self.dom = Domain._make(dom[0])
dl = defer.DeferredList([
self.dbpool.runQuery(CON_SQL, (self.dom.dom_owner,)),
self.dbpool.runQuery(CON_SQL, (self.dom.dom_admin,)),
self.dbpool.runQuery(CON_SQL, (self.dom.dom_tech,)),
self.dbpool.runQuery(
LAST_UPDATE_SQL,
(self.dom.domName,)), ]).addCallback(self._fmt_string)
def get_whois(self, domain):
self.d = defer.Deferred()
if not self._check_limit():
self.d.errback(LimitExceeded(MAX_PER_HOUR))
elif not RE_ALLOWED_TLDS.match(domain):
self.d.errback(UnknownDomain(self._get_limit()))
else:
self.dbpool.runQuery(
'select ' + DOM_FIELDS + ' from domains where '
'domain = ? or domain_idn = ?',
(domain, domain,)) \
.addCallback(self._get_contacts)
return self.d
_fmt_string(),如果它崩溃不叫。
GDB里,这是一个简单的SIGSEV:
(gdb) run ~/.virtualenvs/whois/bin/trial test.test_protocol.ProtocolTestCase.test_correct_domain
Starting program: /home/hynek/.virtualenvs/whois/bin/python ~/.virtualenvs/whois/bin/trial test.test_protocol.ProtocolTestCase.test_correct_domain
[Thread debugging using libthread_db enabled]
test.test_protocol
ProtocolTestCase
test_correct_domain ... [New Thread 0x7ffff311a700 (LWP 6685)]
[New Thread 0x7ffff3099700 (LWP 6686)]
[New Thread 0x7ffff27dc700 (LWP 6723)]
[New Thread 0x7ffff1fdb700 (LWP 6724)]
[New Thread 0x7ffff17da700 (LWP 6725)]
[New Thread 0x7ffff0fd9700 (LWP 6729)]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff1fdb700 (LWP 6724)]
0x00007ffff4d4167c in ??() from /opt/sqlanywhere12/lib64/libdbcapi_r.so
也许这是由一个陈旧的连接到数据库造成的?这只会在您的应用程序运行一段时间(比如说5分钟以上)没有任何活动之后崩溃吗?在运行任何查询之前,您可以尝试检查连接的状态吗? 我也很好奇你是如何将它整合到Twisted中的。 – stderr 2011-04-26 12:46:20
我可以取消资格。我在每个setUp()中重新启动数据库服务器以防止这种影响。它无论如何都会立即发生。我在init之后添加了一个sleep()来规避可能的竞赛消息,但它没有帮助。 – hynek 2011-04-26 12:49:51
哦,这在你的测试套件中失败了吗?这实际上是我认为的好消息。选择/ mmap类型指向Twisted中的崩溃。 SqlAnyDb不包含CExtension,是吗?您是否在使用其他CExtension模块? 您正在使用Twisted Trial运行测试套件? – stderr 2011-04-26 15:49:49