我通過官方的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