summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-06-14 21:05:18 -0700
committerSage Weil <sage@inktank.com>2013-06-14 21:05:18 -0700
commit08c915c87cc95acd663c7cadc0d64dc92806ecea (patch)
treea1bcacb4952608bae0ca889fcf7f50a13c308b2b
parent0d3517b2eddefb74bc98eae2b2d90890c18be2ad (diff)
parent9253cd8174ca7690414923259b01c0a484323f19 (diff)
downloadceph-08c915c87cc95acd663c7cadc0d64dc92806ecea.tar.gz
Merge remote-tracking branch 'gh/next'
-rw-r--r--ceph.spec.in3
-rwxr-xr-xsrc/ceph-disk26
-rwxr-xr-xsrc/ceph-disk-udev6
-rwxr-xr-xsrc/ceph.in48
-rw-r--r--src/mon/OSDMonitor.cc3
-rw-r--r--src/upstart/ceph-all.conf2
-rw-r--r--udev/95-ceph-osd.rules4
7 files changed, 69 insertions, 23 deletions
diff --git a/ceph.spec.in b/ceph.spec.in
index 385fbafb18c..3c9ac20902a 100644
--- a/ceph.spec.in
+++ b/ceph.spec.in
@@ -294,6 +294,8 @@ chmod 0644 $RPM_BUILD_ROOT%{_docdir}/ceph/sample.fetch_config
# udev rules
install -m 0644 -D udev/50-rbd.rules $RPM_BUILD_ROOT/lib/udev/rules.d/50-rbd.rules
+install -m 0644 -D udev/60-ceph-partuuid-workaround.rules $RPM_BUILD_ROOT/lib/udev/rules.d/60-ceph-partuuid-workaround.rules
+
%if 0%{?centos}
install -m 0644 -D udev/95-ceph-osd-alt.rules $RPM_BUILD_ROOT/lib/udev/rules.d/95-ceph-osd.rules
%else
@@ -598,6 +600,7 @@ fi
%{_bindir}/ceph_test_objectcacher_stress
%{_bindir}/ceph_test_rados_api_aio
%{_bindir}/ceph_test_rados_api_cls
+%{_bindir}/ceph_test_rados_api_cmd
%{_bindir}/ceph_test_rados_api_io
%{_bindir}/ceph_test_rados_api_list
%{_bindir}/ceph_test_rados_api_lock
diff --git a/src/ceph-disk b/src/ceph-disk
index 13d9f8203ce..127d809902d 100755
--- a/src/ceph-disk
+++ b/src/ceph-disk
@@ -637,6 +637,11 @@ def get_free_partition_index(dev):
raise Error('parted failed to output anything')
lines = str(lines).splitlines(True)
+ # work around buggy libreadline(?) library in rhel/centos.
+ idiot_prefix = '\x1b\x5b\x3f\x31\x30\x33\x34\x68';
+ if lines[0].startswith(idiot_prefix):
+ lines[0] = lines[0][8:]
+
if lines[0] not in ['CHS;\n', 'CYL;\n', 'BYT;\n']:
raise Error('weird parted units', lines[0])
del lines[0]
@@ -1243,6 +1248,7 @@ def auth_key(
def move_mount(
+ dev,
path,
cluster,
osd_id,
@@ -1254,15 +1260,30 @@ def move_mount(
'{cluster}-{osd_id}'.format(cluster=cluster, osd_id=osd_id),
)
maybe_mkdir(osd_data)
+
+ # we really want to mount --move, but that is not supported when
+ # the parent mount is shared, as it is by default on RH, Fedora,
+ # and probably others. Also, --bind doesn't properly manipulate
+ # /etc/mtab, which *still* isn't a symlink to /proc/mounts despite
+ # this being 2013. Instead, mount the original device at the final
+ # location.
subprocess.check_call(
args=[
'/bin/mount',
- '--move',
'--',
- path,
+ dev,
osd_data,
],
)
+ subprocess.check_call(
+ args=[
+ '/bin/umount',
+ '-l', # lazy, in case someone else is peeking at the
+ # wrong moment
+ '--',
+ path,
+ ],
+ )
def start_daemon(
@@ -1400,6 +1421,7 @@ def mount_activate(
raise Error('another %s osd.%s already mounted in position (old/different cluster instance?); unmounting ours.' % (cluster, osd_id))
else:
move_mount(
+ dev=dev,
path=path,
cluster=cluster,
osd_id=osd_id,
diff --git a/src/ceph-disk-udev b/src/ceph-disk-udev
index a96c21652aa..885f638a1e0 100755
--- a/src/ceph-disk-udev
+++ b/src/ceph-disk-udev
@@ -14,6 +14,8 @@ case $ID_PART_ENTRY_TYPE in
45b0969e-9b03-4f30-b4c6-b4b80ceff106)
# JOURNAL_UUID
+ # activate ceph-tagged journal partitions.
+ /usr/sbin/ceph-disk -v activate-journal /dev/${NAME}
;;
45b0969e-9b03-4f30-b4c6-5ec00ceff106)
@@ -26,7 +28,7 @@ case $ID_PART_ENTRY_TYPE in
4fbd7e29-9d25-41b8-afd0-062c0ceff05d)
# OSD_UUID
# activate ceph-tagged partitions.
- /usr/sbin/ceph-disk -v activate --mount /dev/${NAME}
+ /usr/sbin/ceph-disk -v activate /dev/${NAME}
;;
4fbd7e29-9d25-41b8-afd0-5ec00ceff05d)
@@ -36,7 +38,7 @@ case $ID_PART_ENTRY_TYPE in
ID_PART_ENTRY_UUID=$(/usr/sbin/sgdisk --info=${PARTNO} /dev/${PARENT_NAME} | grep "Partition unique GUID" | awk '{print $4}' | tr '[:upper:]' '[:lower:]')
/sbin/cryptsetup --key-file /etc/ceph/dmcrypt-keys/${ID_PART_ENTRY_UUID} --key-size 256 create ${ID_PART_ENTRY_UUID} /dev/${NAME}
bash -c 'while [ ! -e /dev/mapper/${ID_PART_ENTRY_UUID} ];do sleep 1; done'
- /usr/sbin/ceph-disk-activate --mount /dev/mapper/${ID_PART_ENTRY_UUID}
+ /usr/sbin/ceph-disk-activate /dev/mapper/${ID_PART_ENTRY_UUID}
;;
89c57f98-2fe5-4dc0-89c1-f3ad0ceff2be)
diff --git a/src/ceph.in b/src/ceph.in
index baaed80cd6c..196d6be7b54 100755
--- a/src/ceph.in
+++ b/src/ceph.in
@@ -1,4 +1,4 @@
-#&
+#
# Processed in Makefile to add python #! line and version variable
#
#
@@ -1547,7 +1547,7 @@ def main():
# Repulsive hack to handle tell: lop off 'tell' and target
# and validate the rest of the command. 'target' is already
# determined in our callers, so it's ok to remove it here.
- if childargs[0] == 'tell':
+ if len(childargs) and childargs[0] == 'tell':
childargs = childargs[2:]
# fetch JSON sigs from command
@@ -1558,26 +1558,43 @@ def main():
targets = [target]
if target[1] == '*':
- targets = [(target[0], o) for o in osdids()]
+ if target[0] == 'osd':
+ targets = [(target[0], o) for o in osdids()]
+ elif target[0] == 'mon':
+ targets = [(target[0], m) for m in monids()]
final_ret = 0
for target in targets:
+ # prettify? prefix output with target, if there was a wildcard used
+ prefix = ''
+ suffix = ''
+ if not parsed_args.output_file and len(targets) > 1:
+ prefix='{0}.{1}:'.format(*target)
+ suffix='\n'
+
ret, outbuf, outs = json_command(target=target,
prefix='get_command_descriptions')
+ compat = False
if ret == -errno.EINVAL:
# send command to old monitor or OSD
if verbose:
- print '{0} to old {1}'.format(' '.join(childargs), target[0])
+ print prefix, '{0} to old {1}'.format(' '.join(childargs), target[0])
+ compat = True
+ if parsed_args.output_format:
+ childargs.extend(['--format', parsed_args.output_format])
+ if parsed_args.threshold:
+ childargs.extend(['--threshold', parsed_args.threshold])
ret, outbuf, outs = send_command(target, childargs, inbuf)
# combine nonerror outbuf and outs; either may have cmd output
if ret == 0:
- outbuf += outs
+ # old tool always added a newline
+ outbuf = outs + '\n' + outbuf
# clear outs so generic code below doesn't print it to stderr
outs = ''
elif ret:
if ret < 0:
ret = -ret
- print >> sys.stderr, \
+ print >> sys.stderr, prefix, \
'Problem getting command descriptions from {0}, {1}'.\
format(target, errno.errorcode[ret])
else:
@@ -1591,9 +1608,7 @@ def main():
if ret < 0:
ret = -ret
- if len(targets) > 1:
- sys.stderr.write('{0}.{1}: '.format(*target))
- print >> sys.stderr, 'Error {0}: {1}'.format(errno.errorcode[ret], outs)
+ print >> sys.stderr, prefix, 'Error {0}: {1}'.format(errno.errorcode[ret], outs)
if len(targets) > 1:
final_ret = ret
else:
@@ -1601,7 +1616,7 @@ def main():
# this assumes outs never has useful command output, only status
if outs:
- print >> sys.stderr, outs
+ print >> sys.stderr, prefix, outs
if (parsed_args.output_file):
outf.write(outbuf)
@@ -1611,14 +1626,17 @@ def main():
# to satisfy consumers that skip the first line, but not annoy
# consumers that don't.
if parsed_args.output_format and \
- parsed_args.output_format.startswith('json'):
+ parsed_args.output_format.startswith('json') and \
+ not compat:
sys.stdout.write('\n');
- # prefix output with target, if there was a wildcard used
- if len(targets) > 1:
- sys.stdout.write('{0}.{1}: '.format(*target))
+ # if we are prettifying things, normalize newlines. sigh.
+ if suffix != '':
+ outbuf = outbuf.rstrip()
+ if outbuf != '':
+ sys.stdout.write(prefix + outbuf + suffix)
- sys.stdout.write(outbuf)
+ sys.stdout.flush()
if (parsed_args.output_file):
outf.close()
diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc
index d785cf626c3..7625a500448 100644
--- a/src/mon/OSDMonitor.cc
+++ b/src/mon/OSDMonitor.cc
@@ -147,7 +147,8 @@ void OSDMonitor::update_from_paxos()
dout(7) << "update_from_paxos applying incremental " << osdmap.epoch+1 << dendl;
OSDMap::Incremental inc(inc_bl);
- osdmap.apply_incremental(inc);
+ err = osdmap.apply_incremental(inc);
+ assert(err == 0);
// write out the full map for all past epochs
bufferlist full_bl;
diff --git a/src/upstart/ceph-all.conf b/src/upstart/ceph-all.conf
index d129defad7a..c0b0edd3871 100644
--- a/src/upstart/ceph-all.conf
+++ b/src/upstart/ceph-all.conf
@@ -1,4 +1,4 @@
description "Ceph"
-start on (local-filesystems and net-device-up IFACE!=lo)
+start on runlevel [2345]
stop on runlevel [!2345]
diff --git a/udev/95-ceph-osd.rules b/udev/95-ceph-osd.rules
index 9798e648483..ec2c4a463aa 100644
--- a/udev/95-ceph-osd.rules
+++ b/udev/95-ceph-osd.rules
@@ -2,7 +2,7 @@
ACTION=="add", SUBSYSTEM=="block", \
ENV{DEVTYPE}=="partition", \
ENV{ID_PART_ENTRY_TYPE}=="4fbd7e29-9d25-41b8-afd0-062c0ceff05d", \
- RUN+="/usr/sbin/ceph-disk-activate --mount /dev/$name"
+ RUN+="/usr/sbin/ceph-disk-activate /dev/$name"
# activate ceph-tagged partitions
ACTION=="add", SUBSYSTEM=="block", \
@@ -24,4 +24,4 @@ ACTION=="add" SUBSYSTEM=="block", \
ENV{ID_PART_ENTRY_TYPE}=="4fbd7e29-9d25-41b8-afd0-5ec00ceff05d", \
RUN+="/sbin/cryptsetup --key-file /etc/ceph/dmcrypt-keys/$env{ID_PART_ENTRY_UUID} --key-size 256 create $env{ID_PART_ENTRY_UUID} /dev/$name", \
RUN+="/bin/bash -c 'while [ ! -e /dev/mapper/$env{ID_PART_ENTRY_UUID} ];do sleep 1; done'", \
- RUN+="/usr/sbin/ceph-disk-activate --mount /dev/mapper/$env{ID_PART_ENTRY_UUID}"
+ RUN+="/usr/sbin/ceph-disk-activate /dev/mapper/$env{ID_PART_ENTRY_UUID}"