return 5; //EIO
}
- rgw_user_init(store->meta_mgr);
+ rgw_user_init(store);
rgw_bucket_init(store->meta_mgr);
StoreDestructor store_destructor(store);
{
RWLock::RLocker l(lock);
+ if (!enabled) {
+ return -ENOENT;
+ }
+
map<string, ObjectCacheEntry>::iterator iter = cache_map.find(name);
if (iter == cache_map.end()) {
ldout(cct, 10) << "cache get: name=" << name << " : miss" << dendl;
{
RWLock::WLocker l(lock);
+ if (!enabled) {
+ return false;
+ }
+
list<rgw_cache_entry_info *>::iterator citer;
list<ObjectCacheEntry *> cache_entry_list;
{
RWLock::WLocker l(lock);
+ if (!enabled) {
+ return;
+ }
+
ldout(cct, 10) << "cache put: name=" << name << dendl;
map<string, ObjectCacheEntry>::iterator iter = cache_map.find(name);
if (iter == cache_map.end()) {
{
RWLock::WLocker l(lock);
+ if (!enabled) {
+ return;
+ }
+
map<string, ObjectCacheEntry>::iterator iter = cache_map.find(name);
if (iter == cache_map.end())
return;
lru_iter = lru.end();
}
+void ObjectCache::set_enabled(bool status)
+{
+ RWLock::WLocker l(lock);
+
+ enabled = status;
+
+ if (!enabled) {
+ do_invalidate_all();
+ }
+}
+
+void ObjectCache::invalidate_all()
+{
+ RWLock::WLocker l(lock);
+
+ do_invalidate_all();
+}
+
+void ObjectCache::do_invalidate_all()
+{
+ cache_map.clear();
+ lru.clear();
+
+ lru_size = 0;
+ lru_counter = 0;
+ lru_window = 0;
+
+ for (list<RGWChainedCache *>::iterator iter = chained_cache.begin(); iter != chained_cache.end(); ++iter) {
+ (*iter)->invalidate_all();
+ }
+}
+
+void ObjectCache::chain_cache(RGWChainedCache *cache) {
+ RWLock::WLocker l(lock);
+ chained_cache.push_back(cache);
+}
RWLock lock;
CephContext *cct;
+ list<RGWChainedCache *> chained_cache;
+
+ bool enabled;
+
void touch_lru(string& name, ObjectCacheEntry& entry, std::list<string>::iterator& lru_iter);
void remove_lru(string& name, std::list<string>::iterator& lru_iter);
+
+ void do_invalidate_all();
public:
- ObjectCache() : lru_size(0), lru_counter(0), lru_window(0), lock("ObjectCache"), cct(NULL) { }
+ ObjectCache() : lru_size(0), lru_counter(0), lru_window(0), lock("ObjectCache"), cct(NULL), enabled(false) { }
int get(std::string& name, ObjectCacheInfo& bl, uint32_t mask, rgw_cache_entry_info *cache_info);
void put(std::string& name, ObjectCacheInfo& bl, rgw_cache_entry_info *cache_info);
void remove(std::string& name);
lru_window = cct->_conf->rgw_cache_lru_size / 2;
}
bool chain_cache_entry(list<rgw_cache_entry_info *>& cache_info_entries, RGWChainedCache::Entry *chained_entry);
+
+ void set_enabled(bool status);
+
+ void chain_cache(RGWChainedCache *cache);
+ void invalidate_all();
};
template <class T>
uint64_t cookie,
uint64_t notifier_id,
bufferlist& bl);
+
+ void set_cache_enabled(bool state) {
+ cache.set_enabled(state);
+ }
public:
RGWCache() {}
+ void register_chained_cache(RGWChainedCache *cc) {
+ cache.chain_cache(cc);
+ }
+
int set_attr(void *ctx, rgw_obj& obj, const char *name, bufferlist& bl, RGWObjVersionTracker *objv_tracker);
int set_attrs(void *ctx, rgw_obj& obj,
map<string, bufferlist>& attrs,
if (r)
return 1;
- rgw_user_init(store->meta_mgr);
+ rgw_user_init(store);
rgw_bucket_init(store->meta_mgr);
rgw_log_usage_init(g_ceph_context, store);
#define dout_subsys ceph_subsys_rgw
+struct bucket_info_entry {
+ RGWBucketInfo info;
+ time_t mtime;
+ map<string, bufferlist> attrs;
+};
+
+static RGWChainedCacheImpl<bucket_info_entry> binfo_cache;
+
void RGWDefaultRegionInfo::dump(Formatter *f) const {
encode_json("default_region", default_region, f);
}
void handle_error(uint64_t cookie, int err) {
lderr(rados->ctx()) << "RGWWatcher::handle_error cookie " << cookie
<< " err " << cpp_strerror(err) << dendl;
+ rados->set_cache_enabled(false);
+ rados->finalize_watch();
+ int ret = rados->init_watch();
+ if (ret < 0) {
+ ldout(rados->ctx(), 0) << "ERROR: init_watch() returned ret=" << ret << ", cache is disabled" << dendl;
+ return;
+ }
}
};
}
ldout(cct, 20) << __func__ << " bucket index max shards: " << bucket_index_max_shards << dendl;
+ binfo_cache.init(this);
+
return ret;
}
watch_initialized = true;
+ set_cache_enabled(true);
+
return 0;
}
return 0;
}
-struct bucket_info_entry {
- RGWBucketInfo info;
- time_t mtime;
- map<string, bufferlist> attrs;
-};
-
-static RGWChainedCacheImpl<bucket_info_entry> binfo_cache;
-
int RGWRados::get_bucket_info(RGWObjectCtx& obj_ctx, const string& bucket_name, RGWBucketInfo& info,
time_t *pmtime, map<string, bufferlist> *pattrs)
{
virtual ~RGWChainedCache() {}
virtual void chain_cb(const string& key, void *data) = 0;
virtual void invalidate(const string& key) = 0;
+ virtual void invalidate_all() = 0;
struct Entry {
RGWChainedCache *cache;
bufferlist& bl, off_t ofs, off_t end,
rgw_cache_entry_info *cache_info);
+ virtual void register_chained_cache(RGWChainedCache *cache) {}
virtual bool chain_cache_entry(list<rgw_cache_entry_info *>& cache_info_entries, RGWChainedCache::Entry *chained_entry) { return false; }
int iterate_obj(RGWObjectCtx& ctx, rgw_obj& obj,
bufferlist& bl) { return 0; }
void pick_control_oid(const string& key, string& notify_oid);
+ virtual void set_cache_enabled(bool state) {}
+
void set_atomic(void *ctx, rgw_obj& obj) {
RGWObjectCtx *rctx = static_cast<RGWObjectCtx *>(ctx);
rctx->set_atomic(obj);
public:
RGWChainedCacheImpl() : lock("RGWChainedCacheImpl::lock") {}
+ void init(RGWRados *store) {
+ store->register_chained_cache(this);
+ }
+
bool find(const string& key, T *entry) {
RWLock::RLocker rl(lock);
typename map<string, T>::iterator iter = entries.find(key);
RWLock::WLocker wl(lock);
entries.erase(key);
}
+
+ void invalidate_all() {
+ RWLock::WLocker wl(lock);
+ entries.clear();
+ }
};
class RGWPutObjProcessor
}
};
-void rgw_user_init(RGWMetadataManager *mm)
+void rgw_user_init(RGWRados *store)
{
+ uinfo_cache.init(store);
+
user_meta_handler = new RGWUserMetadataHandler;
- mm->register_handler(user_meta_handler);
+ store->meta_mgr->register_handler(user_meta_handler);
}
class RGWMetadataManager;
-extern void rgw_user_init(RGWMetadataManager *mm);
+extern void rgw_user_init(RGWRados *store);
#endif