Merge remote-tracking branch 'origin/giant'

This commit is contained in:
Josh Durgin 2014-09-24 15:27:02 -07:00
commit 7a39e7cbe6
3 changed files with 61 additions and 24 deletions

View File

@ -3419,27 +3419,7 @@ int OSDMonitor::prepare_pool_crush_ruleset(const unsigned pool_type,
return *crush_ruleset;
}
} else {
int ret;
ret = osdmap.crush->get_rule_id(ruleset_name);
if (ret != -ENOENT) {
// found it, use it
*crush_ruleset = ret;
} else {
CrushWrapper newcrush;
_get_pending_crush(newcrush);
ret = newcrush.get_rule_id(ruleset_name);
if (ret != -ENOENT) {
// found it, wait for it to be proposed
dout(20) << "prepare_pool_crush_ruleset: ruleset "
<< ruleset_name << " is pending, try again" << dendl;
return -EAGAIN;
} else {
//Cannot find it , return error
ss << "Specified ruleset " << ruleset_name << " doesn't exist";
return ret;
}
}
return get_crush_ruleset(ruleset_name, crush_ruleset, ss);
}
}
break;
@ -3478,6 +3458,35 @@ int OSDMonitor::prepare_pool_crush_ruleset(const unsigned pool_type,
return 0;
}
int OSDMonitor::get_crush_ruleset(const string &ruleset_name,
int *crush_ruleset,
stringstream &ss)
{
int ret;
ret = osdmap.crush->get_rule_id(ruleset_name);
if (ret != -ENOENT) {
// found it, use it
*crush_ruleset = ret;
} else {
CrushWrapper newcrush;
_get_pending_crush(newcrush);
ret = newcrush.get_rule_id(ruleset_name);
if (ret != -ENOENT) {
// found it, wait for it to be proposed
dout(20) << __func__ << ": ruleset " << ruleset_name
<< " try again" << dendl;
return -EAGAIN;
} else {
//Cannot find it , return error
ss << "specified ruleset " << ruleset_name << " doesn't exist";
return ret;
}
}
return 0;
}
/**
* @param name The name of the new pool
* @param auid The auid of the pool owner. Can be -1
@ -5266,6 +5275,7 @@ done:
goto reply;
}
bool implicit_ruleset_creation = false;
string ruleset_name;
cmd_getval(g_ceph_context, cmdmap, "ruleset", ruleset_name);
string erasure_code_profile;
@ -5294,6 +5304,7 @@ done:
}
}
if (ruleset_name == "") {
implicit_ruleset_creation = true;
if (erasure_code_profile == "default") {
ruleset_name = "erasure-code";
} else {
@ -5307,6 +5318,17 @@ done:
ruleset_name = erasure_code_profile;
}
if (!implicit_ruleset_creation && ruleset_name != "") {
int ruleset;
err = get_crush_ruleset(ruleset_name, &ruleset, ss);
if (err == -EAGAIN) {
wait_for_finished_proposal(new C_RetryMessage(this, m));
return true;
}
if (err)
goto reply;
}
int64_t expected_num_objects;
cmd_getval(g_ceph_context, cmdmap, "expected_num_objects", expected_num_objects, int64_t(0));
if (expected_num_objects < 0) {

View File

@ -265,6 +265,9 @@ private:
const string &profile,
int *ruleset,
stringstream &ss);
int get_crush_ruleset(const string &ruleset_name,
int *crush_ruleset,
stringstream &ss);
int get_erasure_code(const string &erasure_code_profile,
ErasureCodeInterfaceRef *erasure_code,
stringstream &ss) const;

View File

@ -1,6 +1,7 @@
#!/bin/bash
#
# Copyright (C) 2013,2014 Cloudwatt <libre.licensing@cloudwatt.com>
# Copyright (C) 2014 Red Hat <contact@redhat.com>
#
# Author: Loic Dachary <loic@dachary.org>
#
@ -38,6 +39,7 @@ function TEST_default_deprectated_0() {
run_mon $dir a --public-addr 127.0.0.1 \
--osd_pool_default_crush_replicated_ruleset $expected
./ceph --format json osd dump | grep '"crush_ruleset":'$expected
CEPH_ARGS='' ./ceph --admin-daemon $dir/a/ceph-mon.a.asok log flush || return 1
! grep "osd_pool_default_crush_rule is deprecated " $dir/a/log || return 1
}
@ -48,6 +50,7 @@ function TEST_default_deprectated_1() {
run_mon $dir a --public-addr 127.0.0.1 \
--osd_pool_default_crush_rule $expected
./ceph --format json osd dump | grep '"crush_ruleset":'$expected
CEPH_ARGS='' ./ceph --admin-daemon $dir/a/ceph-mon.a.asok log flush || return 1
grep "osd_pool_default_crush_rule is deprecated " $dir/a/log || return 1
}
@ -60,6 +63,7 @@ function TEST_default_deprectated_2() {
--osd_pool_default_crush_replicated_ruleset $unexpected
./ceph --format json osd dump | grep '"crush_ruleset":'$expected
! ./ceph --format json osd dump | grep '"crush_ruleset":'$unexpected || return 1
CEPH_ARGS='' ./ceph --admin-daemon $dir/a/ceph-mon.a.asok log flush || return 1
grep "osd_pool_default_crush_rule is deprecated " $dir/a/log || return 1
}
@ -95,6 +99,12 @@ function TEST_erasure_crush_rule() {
./ceph osd erasure-code-profile set myprofile
./ceph osd pool create $poolname 12 12 erasure myprofile
./ceph osd crush rule ls | grep $poolname || return 1
#
# a non existent crush ruleset given in argument is an error
# http://tracker.ceph.com/issues/9304
#
poolname=pool_erasure3
! ./ceph osd pool create $poolname 12 12 erasure myprofile INVALIDRULESET || return 1
}
function TEST_erasure_crush_rule_pending() {
@ -107,6 +117,7 @@ function TEST_erasure_crush_rule_pending() {
result=$(echo '{"prefix":"osdmonitor_prepare_command","prepare":"osd crush rule create-erasure","name":"'$crush_ruleset'"}' | nc -U $dir/a/ceph-mon.a.asok | cut --bytes=5-)
test $result = true || return 1
./ceph osd pool create pool_erasure 12 12 erasure default $crush_ruleset || return 1
CEPH_ARGS='' ./ceph --admin-daemon $dir/a/ceph-mon.a.asok log flush || return 1
grep "$crush_ruleset try again" $dir/a/log || return 1
}
@ -122,7 +133,7 @@ function TEST_simple_crush_rule_pending() {
test $result = true || return 1
./ceph osd pool create pool_simple 12 12 replicated $crush_ruleset || return 1
CEPH_ARGS='' ./ceph --admin-daemon $dir/a/ceph-mon.a.asok log flush || return 1
grep "$crush_ruleset is pending, try again" $dir/a/log || return 1
grep "$crush_ruleset try again" $dir/a/log || return 1
}
function TEST_erasure_code_profile_default() {
@ -236,10 +247,11 @@ function TEST_erasure_code_pool_lrc() {
function TEST_replicated_pool() {
local dir=$1
run_mon $dir a --public-addr 127.0.0.1
./ceph osd pool create replicated 12 12 replicated 2>&1 | \
./ceph osd pool create replicated 12 12 replicated replicated_ruleset 2>&1 | \
grep "pool 'replicated' created" || return 1
./ceph osd pool create replicated 12 12 replicated 2>&1 | \
./ceph osd pool create replicated 12 12 replicated replicated_ruleset 2>&1 | \
grep 'already exists' || return 1
! ./ceph osd pool create replicated0 12 12 replicated INVALIDRULESET
# default is replicated
./ceph osd pool create replicated1 12 12 2>&1 | \
grep "pool 'replicated1' created" || return 1