Perrin,
Perrin Harkins wrote:
Right - I scoured the Cache::FastmMap perldoc and didn't see any way to do this.Anything with individual TTL settings per item will let you do this.
Are you talking about the good ol' berk db (1.85) or the newer sleepycat versions? As for choice of OS, I use FreeBSD.It doesn't normally go to disk with BerkeleyDB. There's a shared memory cache. Even things that just use the filesystem are really not going to disk on Linux, since they are effectively using the VM system as shared memory.
My module is an authentication/authorization handler. It worked by issuing an access token that gets stored in one of an array of berkeley DB's. The browser then either sends the token back to the server in the form of a cookie or part of the query string. The token had an expiry on it, and every time the token was used, the TTL was updated.Page-level locking would probably work better than that, but in my experience I never found the file-level locking in BerkeleyDB's simple mode to be an issue.
So the first crack of the module there was significant lock contention - as every access to every part of the site required an exclusive lock. Then I put in the capability to 'not update token until x time has passed', so rather than updating the token at every access, it would only do it after a certain amount of time had passed.
This worked very well for me - I still found that to be kind of messy as I thought there should be a better way of keeping track of tokens other than disk access. When I was revamping the C module, I had considered writing a threaded daemon that would keep track of the tokens in memory, with a unix domain socket interface to the httpd processes. This has lots of advantages but is complex.
Yeah, I meant how the IPC::Shareable implements locking (well, IPC::SysV) - I realize this is done in C.I don't know how BerkeleyDB implements it, but it's in the C code, not in the Perl code.
I was planning on doing my own more efficent transformation to/from a scalar, and telling IPC::Shareable to not bother serializing it (I thought I read that this module could do that, but perhaps I was mistaken (maybe I was incorrectly thinking of Cache::FastMmap).The real problem with shared memory things like IPC::Shareable is that they have to serialize and de-serialize your entire data structure using Storable every time you read or write it. They have no way to address individual entries. The fast modules handle entries individually.
Thanks, Tim
-- Report problems: http://perl.apache.org/bugs/ Mail list info: http://perl.apache.org/maillist/modperl.html List etiquette: http://perl.apache.org/maillist/email-etiquette.html