Subject: | Add busy_locK |
HTML::Mason has a "busy_lock" solution to deal with race conditions
where too many processes may wish to update an expired cache on a busily
accessed site. This would be a useful core addition to Cache::Cache for
non Mason users. To explain what I mean, I've quoted the Mason docs below:
"The code shown in ``Basic Usage'' above,
my $result = $m->cache->get('key');
if (!defined($result)) {
... compute $result ...
$m->cache->set('key', $result);
}
can suffer from a kind of race condition for caches that are accessed
frequently and take a long time to recompute.
Suppose that a particular cache value is accessed five times a second
and takes three seconds to recompute. When the cache expires, the first
process comes in, sees that it is expired, and starts to recompute the
value. The second process comes in and does the same thing. This
sequence continues until the first process finishes and stores the new
value. On average, the value will be recomputed and written to the cache
15 times!
Mason offers a solution with the busy_lock flag:
my $result = $m->cache->get('key', busy_lock=>'30 sec');
In this case, when the value cannot be retrieved, get() sets the
expiration time of the value 30 seconds in the future before returning
undef. This tells the first process to compute the new value while
causing subsequent processes to use the old value for 30 seconds."