summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Farnum <greg@inktank.com>2013-08-29 13:57:10 -0700
committerGreg Farnum <greg@inktank.com>2013-08-30 14:06:33 -0700
commite3fb912131b1e0f192ffadf48d40107184117382 (patch)
tree5494bb8dd2c1bbb0133112bc1416785b0fff0696
parentb76953c6269a8d5af854908cf9db66b1b77fd86a (diff)
downloadceph-e3fb912131b1e0f192ffadf48d40107184117382.tar.gz
Objecter: respect read_tier & write_tier for initial op submission
We overwrite target_oloc.pool with the appropriate [read|write]_tier. write_tier wins if it matches both. We don't handle any sort of redirect yet. Signed-off-by: Greg Farnum <greg@inktank.com>
-rw-r--r--src/osdc/Objecter.cc11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc
index 26741a94a08..39378521b09 100644
--- a/src/osdc/Objecter.cc
+++ b/src/osdc/Objecter.cc
@@ -1297,7 +1297,16 @@ int Objecter::recalc_op_target(Op *op)
{
vector<int> acting;
pg_t pgid = op->pgid;
+
+ bool is_read = op->flags & CEPH_OSD_FLAG_READ;
+ bool is_write = op->flags & CEPH_OSD_FLAG_WRITE;
+
op->target_oloc = op->base_oloc;
+ if (is_read && osdmap->get_pg_pool(op->base_oloc.pool)->has_read_tier())
+ op->target_oloc.pool = osdmap->get_pg_pool(op->base_oloc.pool)->read_tier;
+ if (is_write && osdmap->get_pg_pool(op->base_oloc.pool)->has_write_tier())
+ op->target_oloc.pool = osdmap->get_pg_pool(op->base_oloc.pool)->write_tier;
+
if (op->precalc_pgid) {
assert(op->oid.name.empty()); // make sure this is a listing op
ldout(cct, 10) << "recalc_op_target have " << pgid << " pool " << osdmap->have_pg_pool(pgid.pool()) << dendl;
@@ -1320,7 +1329,7 @@ int Objecter::recalc_op_target(Op *op)
op->used_replica = false;
if (!acting.empty()) {
int osd;
- bool read = (op->flags & CEPH_OSD_FLAG_READ) && (op->flags & CEPH_OSD_FLAG_WRITE) == 0;
+ bool read = is_read && !is_write;
if (read && (op->flags & CEPH_OSD_FLAG_BALANCE_READS)) {
int p = rand() % acting.size();
if (p)