diff options
author | Greg Farnum <greg@inktank.com> | 2013-08-29 13:57:10 -0700 |
---|---|---|
committer | Greg Farnum <greg@inktank.com> | 2013-08-30 14:06:33 -0700 |
commit | e3fb912131b1e0f192ffadf48d40107184117382 (patch) | |
tree | 5494bb8dd2c1bbb0133112bc1416785b0fff0696 | |
parent | b76953c6269a8d5af854908cf9db66b1b77fd86a (diff) | |
download | ceph-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.cc | 11 |
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) |