summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCasey Bodley <cbodley@redhat.com>2015-10-22 15:54:19 +0200
committerYehuda Sadeh <yehuda@redhat.com>2016-02-12 01:13:21 +0100
commitd9a19c75fcbc946d08f12ae101abfdd12d1125b5 (patch)
tree3f4d6d1cda9f592168aad377a98fd9a7cefaf5b5
parentrgw: period push handler updates current period/epoch (diff)
downloadceph-d9a19c75fcbc946d08f12ae101abfdd12d1125b5.tar.xz
ceph-d9a19c75fcbc946d08f12ae101abfdd12d1125b5.zip
rgw: add RGWPeriod::commit()
Signed-off-by: Casey Bodley <cbodley@redhat.com>
-rw-r--r--src/rgw/rgw_rados.cc63
-rw-r--r--src/rgw/rgw_rados.h3
2 files changed, 66 insertions, 0 deletions
diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc
index 30afd2d66c9..0567c6a0d5b 100644
--- a/src/rgw/rgw_rados.cc
+++ b/src/rgw/rgw_rados.cc
@@ -1072,6 +1072,69 @@ void RGWPeriod::update(const RGWZoneGroupMap& map)
period_map.master_zonegroup = map.master_zonegroup;
}
+int RGWPeriod::commit(RGWRealm& realm, const RGWPeriod& current_period)
+{
+ // gateway must be in the master zone to commit
+ if (master_zone != store->get_zone_params().get_id()) {
+ lderr(cct) << "period commit sent to zone " << store->get_zone_params().get_id()
+ << ", not period's master zone " << master_zone << dendl;
+ return -EINVAL;
+ }
+ // period predecessor must match current period
+ if (predecessor_uuid != current_period.get_id()) {
+ lderr(cct) << "period predecessor " << predecessor_uuid
+ << " does not match current period " << current_period.get_id()
+ << dendl;
+ return -EINVAL;
+ }
+ // did the master zone change?
+ if (master_zone != current_period.get_master_zone()) {
+ // create with a new period id
+ int r = create(true);
+ if (r < 0) {
+ lderr(cct) << "failed to create new period: " << cpp_strerror(-r) << dendl;
+ return r;
+ }
+ // set as current period
+ r = realm.set_current_period(id); // TODO: add sync status argument
+ if (r < 0) {
+ lderr(cct) << "failed to update realm's current period: "
+ << cpp_strerror(-r) << dendl;
+ return r;
+ }
+ ldout(cct, 4) << "Promoted to master zone and committed new period "
+ << id << dendl;
+ // TODO: notify zone for dynamic reconfiguration
+ return 0;
+ }
+ // period must be based on predecessor's current epoch
+ if (epoch != current_period.get_epoch()) {
+ lderr(cct) << "period epoch " << epoch << " does not match "
+ "predecessor epoch " << current_period.get_epoch() << dendl;
+ return -EINVAL;
+ }
+ // set period as next epoch
+ set_id(current_period.get_id());
+ set_epoch(current_period.get_epoch() + 1);
+ set_predecessor(current_period.get_predecessor());
+ // write the period to rados
+ int r = store_info(false);
+ if (r < 0) {
+ lderr(cct) << "failed to store period: " << cpp_strerror(-r) << dendl;
+ return r;
+ }
+ // set as latest epoch
+ r = set_latest_epoch(epoch);
+ if (r < 0) {
+ lderr(cct) << "failed to set latest epoch: " << cpp_strerror(-r) << dendl;
+ return r;
+ }
+ ldout(cct, 4) << "Committed new epoch " << epoch
+ << " for period " << id << dendl;
+ // TODO: notify zone for dynamic reconfiguration
+ return 0;
+}
+
int RGWZoneParams::create_default(bool old_format)
{
name = default_zone_name;
diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h
index e83a5e0aa89..963d6851dc2 100644
--- a/src/rgw/rgw_rados.h
+++ b/src/rgw/rgw_rados.h
@@ -1409,6 +1409,9 @@ public:
void fork();
int update();
+ // commit a staging period; only for use on master zone
+ int commit(RGWRealm& realm, const RGWPeriod &current_period);
+
void encode(bufferlist& bl) const {
ENCODE_START(1, 1, bl);
::encode(id, bl);