+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ */
+
+#ifndef RGW_REPLICA_LOG_H_
+#define RGW_REPLICA_LOG_H_
+
+#include <string>
+#include "cls/replica_log/cls_replica_log_types.h"
+#include "include/types.h"
+#include "include/utime.h"
+#include "include/rados/librados.hpp"
+#include "rgw_common.h"
+
+class RGWRados;
+class CephContext;
+
+#define META_REPLICA_LOG_OBJ_PREFIX "meta.replicalog."
+#define DATA_REPLICA_LOG_OBJ_PREFIX "data.replicalog."
+
+typedef cls_replica_log_item_marker RGWReplicaItemMarker;
+typedef cls_replica_log_progress_marker RGWReplicaProgressMarker;
+
+struct RGWReplicaBounds {
+ string marker;
+ utime_t oldest_time;
+ list<RGWReplicaProgressMarker> markers;
+
+ void dump(Formatter *f) const;
+ void decode_json(JSONObj *obj);
+};
+
+class RGWReplicaLogger {
+protected:
+ CephContext *cct;
+ RGWRados *store;
+ int open_ioctx(librados::IoCtx& ctx, const rgw_pool& pool);
+
+ explicit RGWReplicaLogger(RGWRados *_store);
+
+ int update_bound(const string& oid, const rgw_pool& pool,
+ const string& daemon_id, const string& marker,
+ const utime_t& time,
+ const list<RGWReplicaItemMarker> *entries,
+ bool need_to_exist);
+ int write_bounds(const string& oid, const rgw_pool& pool,
+ RGWReplicaBounds& bounds);
+ int delete_bound(const string& oid, const rgw_pool& pool,
+ const string& daemon_id, bool purge_all,
+ bool need_to_exist);
+ int get_bounds(const string& oid, const rgw_pool& pool,
+ RGWReplicaBounds& bounds);
+};
+
+class RGWReplicaObjectLogger : private RGWReplicaLogger {
+ rgw_pool pool;
+ string prefix;
+
+ void get_shard_oid(int id, string& oid) {
+ char buf[16];
+ snprintf(buf, sizeof(buf), "%d", id);
+ oid = prefix + buf;
+ }
+
+public:
+ RGWReplicaObjectLogger(RGWRados *_store,
+ const rgw_pool& _pool,
+ const string& _prefix);
+
+ int create_log_objects(int shards);
+ int update_bound(int shard, const string& daemon_id, const string& marker,
+ const utime_t& time,
+ const list<RGWReplicaItemMarker> *entries) {
+ string oid;
+ get_shard_oid(shard, oid);
+ return RGWReplicaLogger::update_bound(oid, pool,
+ daemon_id, marker, time, entries, false);
+ }
+ int delete_bound(int shard, const string& daemon_id, bool purge_all) {
+ string oid;
+ get_shard_oid(shard, oid);
+ return RGWReplicaLogger::delete_bound(oid, pool,
+ daemon_id, purge_all, false);
+ }
+ int get_bounds(int shard, RGWReplicaBounds& bounds) {
+ string oid;
+ get_shard_oid(shard, oid);
+ return RGWReplicaLogger::get_bounds(oid, pool, bounds);
+ }
+};
+
+class RGWReplicaBucketLogger : private RGWReplicaLogger {
+ rgw_pool pool;
+ string prefix;
+
+ string obj_name(const rgw_bucket& bucket, int shard_id, bool index_by_instance);
+
+public:
+ explicit RGWReplicaBucketLogger(RGWRados *_store);
+ int update_bound(const rgw_bucket& bucket, int shard_id, const string& daemon_id,
+ const string& marker, const utime_t& time,
+ const list<RGWReplicaItemMarker> *entries);
+ int delete_bound(const rgw_bucket& bucket, int shard_id, const string& daemon_id, bool purge_all);
+ int get_bounds(const rgw_bucket& bucket, int shard_id, RGWReplicaBounds& bounds);
+ int convert_old_bounds(const rgw_bucket& bucket, int shard_id, RGWReplicaBounds& bounds);
+};
+
+#endif /* RGW_REPLICA_LOG_H_ */