Hi Michael,
That does help FileCache.validate() recognize that the cache is not expired yet. However,
it did not improve the times. It takes 16 seconds to create a client either way.
After that change, the problem is that although ObjectCache.get is always getting a valid
file pointer, it's hitting an exception (EOFError) doing pickle.load(fp). When that
happens, the file is just downloaded again.
Here's the sequence of events:
DocumentReader.open:
Trying
http://172.28.50.249/wsdl/billingServices/v3.0/RequestScrubAddress.wsdl
Loading ObjectCache 51012453-document
Loading pickled object...
Exception raised: <type 'exceptions.EOFError'>
Got None from cache
Downloading... Done
Saving FileCache 51012453-document... Done
So it doesn't really matter that the new cache file was saved, because the same thing
happens the next time I run. This happens for ALL of WSDL and XSD files.
I fixed that problem by opening the file in binary mode when reading and writing.
Specifically, the changes I made were in cache.py:
1. In FileCache.put(), change this line:
f = self.open(fn, 'w')
to
f = self.open(fn, 'wb')
2. In FileCache.getf(), change this line:
return self.open(fn)
to
return self.open(fn, 'rb')
I don't know the codebase well enough to know if these changes are safe, but it is
pulling the objects from the file cache, the service is still running successfully, and
loading the client went from 16 seconds down to 2.5 seconds.
Hopefully this fix, or something similar can be introduced back into the suds main line.
Thanks for the help!
Mike
-----Original Message-----
From: Michael Sommerville [mailto:msommerville@gmail.com]
Sent: Friday, July 22, 2011 7:21 AM
To: Lin, Mike M
Cc: fedora-suds-list(a)redhat.com
Subject: Re: [Fedora-suds-list] Suds is not reusing cached WSDLs and XSDs, although I
expect it to
On Tue, Jul 19, 2011 at 5:55 PM, Lin, Mike M <mmlin(a)directv.com> wrote:
I've been having major performance problems creating clients with
large WSDL
and XSD files. Here's a question about caching I posted on StackOverflow,
but never got an answer to. I think I might be misunderstanding the way
suds does caching. Can anyone confirm that my thinking is wrong?
Thanks,
Mike
Suds is not reusing cached WSDLs and XSDs, although I expect it to
[snip]
Does it help if you modify suds/cache.py to use mtimes rather than
ctimes? I.e. change:
created = dt.fromtimestamp(os.path.getctime(fn))
to
created = dt.fromtimestamp(os.path.getmtime(fn))