diff options
author | Sage Weil <sage@inktank.com> | 2013-06-14 21:05:18 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-06-14 21:05:18 -0700 |
commit | 08c915c87cc95acd663c7cadc0d64dc92806ecea (patch) | |
tree | a1bcacb4952608bae0ca889fcf7f50a13c308b2b | |
parent | 0d3517b2eddefb74bc98eae2b2d90890c18be2ad (diff) | |
parent | 9253cd8174ca7690414923259b01c0a484323f19 (diff) | |
download | ceph-08c915c87cc95acd663c7cadc0d64dc92806ecea.tar.gz |
Merge remote-tracking branch 'gh/next'
-rw-r--r-- | ceph.spec.in | 3 | ||||
-rwxr-xr-x | src/ceph-disk | 26 | ||||
-rwxr-xr-x | src/ceph-disk-udev | 6 | ||||
-rwxr-xr-x | src/ceph.in | 48 | ||||
-rw-r--r-- | src/mon/OSDMonitor.cc | 3 | ||||
-rw-r--r-- | src/upstart/ceph-all.conf | 2 | ||||
-rw-r--r-- | udev/95-ceph-osd.rules | 4 |
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}" |