[Xapian-discuss] Re: Twisted + Xapian WriteableDatabase leaves
db_lock file on exit.
Michel Pelletier
michel at dialnetwork.com
Fri May 5 19:49:25 BST 2006
We use twisted and xapian together very well, I have not noticed the
problem you are having. However we do not use the twisted.application
stuff, it's a bit too frameworky for me and unecessary as we run a bunch
of small, standalone clients and servers that share very little
infrastructure. It sounds like this stuff is hanging onto a reference
of your service.
-Michel
jarrod roberson wrote:
> On 5/3/06, James Aylett <james-xapian at tartarus.org> wrote:
>
>>
>> On Wed, May 03, 2006 at 11:26:21AM -0400, jarrod roberson wrote:
>>
>> > the problem is I can't reproduce it outside of Twisted.
>> >
>> > all my command line tools that I have written ( all in Python ) that
>> use
>> the
>> > exact same code exit and close properly.
>>
>> Is the reference inside a thread in twisted? We've had problems there,
>> although I can't remember any details at all.
>
>
>
> No it is just in a "Service" class
>
> here is what I have tried, I snipped all the app specific logic, here is
> whare I open the db, and try to close it.
>
> When the server shuts down, the stopService() gets called and prints out
> the
> message as well
>
> #
> # Service Implementations
> ======================================================
> #
>
> class XapianIndexerService(service.Service):
>
> implements(IndexerService)
>
> def __init__(self, fileRoot, indexRoot, flushInterval=60):
> self.fileRoot = fileRoot
> self.db = xapian.WritableDatabase(indexRoot, xapian.DB_CREATE_OR_OPEN
> )
> self.flushInterval = flushInterval
>
> def startService(self):
> print 'Start Xapian Index Service'
> self.periodicFlush = task.LoopingCall(self.db.flush)
> self.periodicFlush.start(self.flushInterval)
>
> def index(self, path):
> #
> # details snipped but this is where I create the
> # documents and add or replace them
> #
>
> def remove(self, docID):
> # delete document from xapian database
> self.db.delete_document(docID)
>
> def stopService(self):
> print 'Stopping Xapian Indexer Service'
> self.periodicFlush.stop()
> self.db.flush()
>
> #
> # Application
> ==================================================================
> #
> application = service.Application('wfsindexer')
> i = XapianIndexerService('/wfs/', '/index/wfs/')
> serviceCollection = service.IServiceCollection(application)
> i.setServiceParent(serviceCollection)
> internet.TCPServer(9000, IndexerFactory(i)
> ).setServiceParent(serviceCollection)
>
> def delService(i):
> del i
>
> # I tried every phase and they all do the same thing.
> reactor.addSystemEventTrigger( 'before', 'shutdown', delService, i )
More information about the Xapian-discuss
mailing list