On Fri, 2005-05-06 at 13:48, Henrik Nordstrom wrote:
> On Thu, 5 May 2005, Ernest Rider wrote:
> 
> > Recently a requirement came up to be able to fast purge squid entries by
> > URL matching.
> 
> Quite common request. Unfortunately not very easy to implement due to the 
> design of the cache. The URL is for the major part of the cache only kept 
> on disk, not in memory.
> 
> > void
> > storeRemoveRegex(const char *regex) {
> > 	 hash_link *walker;
> > 	 int i=0;
> > 	 regex_t compare;
> > 	 regmatch_t pmatch;
> >     debug(20, 2) ("storeRemoveRegex: Constructing Regex with %s\n",regex);
> > 	 int code = regcomp(&compare, regex, REG_EXTENDED | REG_ICASE | REG_NEWLINE);
> > 	 if(!code) {
> >     debug(20, 2) ("storeRemoveRegex: Constructing Regex Done\n");
> >     debug(20, 2) ("storeRemoveRegex: Finding first entry\n");
> > 	 hash_first(store_table);
> >     debug(20, 2) ("storeRemoveRegex: Finding first entry done\n");
> >     debug(20, 2) ("storeRemoveRegex: Finding initial entry\n");
> > 	 walker=hash_next(store_table);
> >     debug(20, 2) ("storeRemoveRegex: Finding initial entry done (%p)\n",walker);
> >     debug(20, 2) ("storeRemoveRegex: Entering Loop\n");
> >     while(walker) {
> >     	    debug(20, 2) ("storeRemoveRegex: Start Loop block with %p\n",walker);
> > 			StoreEntry *store_entry = (StoreEntry *) walker;
> > 			if(store_entry->mem_status == NOT_IN_MEMORY) {
> >  			    debug(20, 2) ("storeRemoveRegex: The Entry object was null doing persistence retrieval\n");
> > 				<WHAT SHOULD GO HERE>
> 
> Exacly.. this is the problem... The information you need is not available 
> in memory and you need to swap in the object from disk.
> 
> This is mostly the same as the external purge tool (see related software), 
> except that doing it within Squid is a little more complex due to the 
> multiplexed nature of Squid.
> 
So there is no easy way to get it back into memory for comparison? No
API etc...?
> 
> > 			    debug(20, 2) ("storeRemoveRegex: The Entry object retrieved has pointer %p\n", store_entry->mem_obj);
> > 			}
> >     	    debug(20, 2) ("storeRemoveRegex: Executing regex match on %s",storeUrl(store_entry));
> > 			if(!regexec(&compare, storeUrl(store_entry),1, &pmatch,0)) {
> > 				storeLockObject(store_entry);
> > 			  	debug(20, 2) ("storeRemoveRegex: Releasing Item (%5d) from the store:\n",i);
> > 	  			storeEntryDump(store_entry,2);
> > 	  			storeRelease(store_entry);
> 
> This part is fine. As Squid is singlethreaded there is no locking needed.
> 
> The loop may hit the same entry more than once (twice, once on the public 
> location, and then once again on the private key location) if it is in 
> use, but it is safe to call storeRelease multiple times so this is not a 
> problem.
> 
> 
> Be warned that the hash_next function is not safe to be used in event 
> operations. There can only be one hash_next iteration at a time. Some 
> juggling will be required for doing this in a reasonable manner in an 
> incremental event function without running into locking/concurrency 
> issues.
> 
Can you see a safe way of doing this?`
> 
> Regards
> Henrik
> 
Received on Tue May 10 2005 - 14:35:28 MDT
This archive was generated by hypermail pre-2.1.9 : Tue May 31 2005 - 12:00:03 MDT