blob: 8ecf37578350c03a3759c9a833d313a838266a23 [file] [log] [blame]
/*
* Copyright 2013 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Author: pulkitg@google.com (Pulkit Goyal)
//
// Reads the properties stored in the CacheInterface and populates them in
// PropertyPage.
// There is a CacheInterface object for every cohort which is stored in
// CohortCacheMap and read/write for a cohort happens on its respective
// CacheInterface object.
#ifndef PAGESPEED_OPT_HTTP_CACHE_PROPERTY_STORE_H_
#define PAGESPEED_OPT_HTTP_CACHE_PROPERTY_STORE_H_
#include <map>
#include "pagespeed/kernel/base/basictypes.h"
#include "pagespeed/kernel/base/cache_interface.h"
#include "pagespeed/kernel/base/string.h"
#include "pagespeed/kernel/base/string_util.h"
#include "pagespeed/opt/http/abstract_property_store_get_callback.h"
#include "pagespeed/opt/http/property_cache.h"
#include "pagespeed/opt/http/property_store.h"
namespace net_instaweb {
class PropertyCacheValues;
class Statistics;
class ThreadSystem;
class Timer;
class CachePropertyStore : public PropertyStore {
public:
// Property cache key prefixes.
static const char kPagePropertyCacheKeyPrefix[];
// Does not take the ownership of cache, timer and stats object.
// L2-only caches should be used for CachePropertyStore. We cannot use the L1
// cache because this data can get stale quickly.
CachePropertyStore(const GoogleString& cache_key_prefix,
CacheInterface* cache,
Timer* timer,
Statistics* stats,
ThreadSystem* thread_system);
virtual ~CachePropertyStore();
// Cache lookup is initiated for the given cohort and results are populated
// in PropertyPage if it is valid.
// callback parameter can be set to NULL if cohort_list is empty.
virtual void Get(const GoogleString& url,
const GoogleString& options_signature_hash,
const GoogleString& cache_key_suffix,
const PropertyCache::CohortVector& cohort_list,
PropertyPage* page,
BoolCallback* done,
AbstractPropertyStoreGetCallback** callback);
// Write to cache.
virtual void Put(const GoogleString& url,
const GoogleString& options_signature_hash,
const GoogleString& cache_key_suffix,
const PropertyCache::Cohort* cohort,
const PropertyCacheValues* values,
BoolCallback* done);
// Establishes a Cohort backed by the CacheInteface passed to the constructor.
void AddCohort(const GoogleString& cohort);
// Establishes a Cohort to be backed by the specified CacheInterface.
// Does not take the ownership of cache.
void AddCohortWithCache(const GoogleString& cohort,
CacheInterface* cache);
// Gets the underlying key associated with cache_key and a Cohort.
// This is the key used for the CacheInterface provided to the
// constructor. This is made visible for testing, to make it
// possible to inject delays into the cache via DelayCache::DelayKey.
GoogleString CacheKey(const StringPiece& url,
const StringPiece& options_signature_hash,
const StringPiece& cache_key_suffix,
const PropertyCache::Cohort* cohort) const;
// Returns default cache backend associated with CachePropertyStore.
const CacheInterface* cache_backend() { return default_cache_; }
virtual GoogleString Name() const;
static GoogleString FormatName2(StringPiece cohort_name1,
StringPiece cohort_cache1,
StringPiece cohort_name2,
StringPiece cohort_cache2);
private:
GoogleString cache_key_prefix_;
typedef std::map<GoogleString, CacheInterface*> CohortCacheMap;
CohortCacheMap cohort_cache_map_;
CacheInterface* default_cache_;
Timer* timer_;
Statistics* stats_;
ThreadSystem* thread_system_;
DISALLOW_COPY_AND_ASSIGN(CachePropertyStore);
};
} // namespace net_instaweb
#endif // PAGESPEED_OPT_HTTP_CACHE_PROPERTY_STORE_H_