Page Speed Optimization Libraries
1.8.31.2
|
#include "async_fetch_with_lock.h"
Public Member Functions | |
AsyncFetchWithLock (const Hasher *hasher, const RequestContextPtr &request_context, const GoogleString &url, const GoogleString &cache_key, NamedLockManager *lock_manager, MessageHandler *message_handler) | |
bool | Start (UrlAsyncFetcher *fetcher) |
const GoogleString & | url () const |
Url to be fetched. | |
const GoogleString & | cache_key () const |
Cache key to be locked. | |
Protected Member Functions | |
virtual bool | ShouldYieldToRedundantFetchInProgress ()=0 |
virtual void | Finalize (bool lock_failure, bool success) |
virtual bool | StartFetch (UrlAsyncFetcher *fetcher, MessageHandler *handler)=0 |
virtual void | HandleDone (bool success) |
virtual void | HandleHeadersComplete () |
virtual bool | HandleWrite (const StringPiece &content, MessageHandler *handler) |
virtual bool | HandleFlush (MessageHandler *handler) |
AsyncFetch object which tries to acquire lock before fetching content. Start() will returns false, if it fails to acquire lock. Note that acquiring a lock will fail if same resource is fetching somewhere else. Caller will call the Start() which will try to acquire a lock and internally call StartFetch() which actually triggers a fetch. Sequence of the events: 1) Caller calls AsyncFetchWithLock::Start(). 2) Start() will try to acquire lock. If lock is acquired successfully, AsyncFetchWithLock::StartFetch() will be called, otherwise AsyncFetchWithLock::Finalize() is called with lock_failure as true and success as false and StartFetch() returns false and async_fetch_with_lock object will be deleted. Note: StartFetch() will be called in case of lock failure only if ShouldYieldToRedundantFetchInProgress() returns false. 3) Subclass defines StartFetch() function which actually triggers UrlAsyncFetcher::Fetch(). 4) Subclass can override HandleHeadersComplete(), HandleWrite(), HandleFlush() and HandleDone() for special handling during fetch. HandleDone() also releases the lock. Note: If any of these functions is overridden, then AsyncFetchWithLock::HandleXXX should also be called. 5) Lastly AsyncFetchWithLock::Finalize() is called just before async_fetch delete itself.
virtual void net_instaweb::AsyncFetchWithLock::Finalize | ( | bool | lock_failure, |
bool | success | ||
) | [protected, virtual] |
Finalize is called either when we fail to acquire acquire a lock or at the end of request after releasing the lock.
virtual void net_instaweb::AsyncFetchWithLock::HandleDone | ( | bool | success | ) | [protected, virtual] |
Releases the lock. If subclass overrides the function, then, it should also call AsyncFetchWithLock::HandleDone()
Implements net_instaweb::AsyncFetch.
virtual void net_instaweb::AsyncFetchWithLock::HandleHeadersComplete | ( | ) | [protected, virtual] |
HandleHeadersComplete(), HandleWrite() and HandleFlush() are no-op functions and any special handling can be done in subclass and must call the superclass function before returning.
Implements net_instaweb::AsyncFetch.
virtual bool net_instaweb::AsyncFetchWithLock::ShouldYieldToRedundantFetchInProgress | ( | ) | [protected, pure virtual] |
If someone is already fetching this resource, should we yield to them and try again later? If so, return true. Otherwise, if we must fetch the resource regardless, return false.
bool net_instaweb::AsyncFetchWithLock::Start | ( | UrlAsyncFetcher * | fetcher | ) |
This will first try to acquire lock and triggers fetch by calling StartFetch() if successful. Returns false, if it fails to acquire lock and deletes this.
virtual bool net_instaweb::AsyncFetchWithLock::StartFetch | ( | UrlAsyncFetcher * | fetcher, |
MessageHandler * | handler | ||
) | [protected, pure virtual] |
StartFetch() will be called after the lock is acquired. The subclass implements this function and is responsible for UrlAsyncFetcher::Fetch().