diff options
author | Sage Weil <sage@inktank.com> | 2013-01-26 14:44:26 -0800 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-02-13 12:35:42 -0800 |
commit | 07655288281c9c6f691f87352dc26b7c11ae07e8 (patch) | |
tree | e3b858e0fe871f884defbe9f6f75ebb2fb6b4152 | |
parent | 23ad3a46a0099e263f43e0f0c1df1d21cfe58b3f (diff) | |
download | ceph-07655288281c9c6f691f87352dc26b7c11ae07e8.tar.gz |
ceph-disk-activate: factor mounting out of activate
The activate stuff is generic for any OSD, regardless of whether we want
to mount it or not. Pull that part out.
Signed-off-by: Sage Weil <sage@inktank.com>
-rwxr-xr-x | src/ceph-disk-activate | 135 |
1 files changed, 76 insertions, 59 deletions
diff --git a/src/ceph-disk-activate b/src/ceph-disk-activate index f78ae17ce88..981f4fac70e 100755 --- a/src/ceph-disk-activate +++ b/src/ceph-disk-activate @@ -278,7 +278,7 @@ def upstart_start( cluster, osd_id, ): - log.debug('Starting service...') + log.debug('Starting %s osd.%s...', cluster, osd_id) subprocess.check_call( args=[ 'initctl', @@ -405,35 +405,80 @@ def unmount( except subprocess.CalledProcessError as e: raise UnmountError(e) - -def activate( - path, +def mount_activate( + dev, activate_key_template, - do_mount, ): - if do_mount: + try: + fstype = detect_fstype(dev=dev) + except (subprocess.CalledProcessError, + TruncatedLineError, + TooManyLinesError) as e: + raise FilesystemTypeError( + 'device {dev}'.format(dev=dev), + e, + ) + + mount_options = get_conf( + # TODO always using mount options from cluster=ceph for + # now; see http://tracker.newdream.net/issues/3253 + cluster='ceph', + variable='osd_fs_mount_options_{fstype}'.format( + fstype=fstype, + ), + ) + + path = mount(dev=dev, fstype=fstype, options=mount_options) + + osd_id = None + cluster = None + try: + (osd_id, cluster) = activate(path, activate_key_template) + + # check if the disk is already active + active = False + src_dev = os.stat(path).st_dev try: - fstype = detect_fstype(dev=path) - except (subprocess.CalledProcessError, - TruncatedLineError, - TooManyLinesError) as e: - raise FilesystemTypeError( - 'device {dev}'.format(dev=path), - e, + dst_dev = os.stat('/var/lib/ceph/osd/{cluster}-{osd_id}'.format( + cluster=cluster, + osd_id=osd_id)).st_dev + if src_dev == dst_dev: + active = True + except: + pass + if active: + log.info('%s osd.%s already mounted in position; unmounting ours.' % (cluster, osd_id)) + unmount(path) + else: + move_mount( + path=path, + cluster=cluster, + osd_id=osd_id, ) - mount_options = get_conf( - # TODO always using mount options from cluster=ceph for - # now; see http://tracker.newdream.net/issues/3253 - cluster='ceph', - variable='osd_fs_mount_options_{fstype}'.format( - fstype=fstype, - ), + upstart_start( + cluster=cluster, + osd_id=osd_id, + ) + + except: + log.error('Failed to activate') + unmount(path) + raise + finally: + # if we created a temp dir to mount it, remove it + os.rmdir(path) + ) path = mount(dev=path, fstype=fstype, options=mount_options) +def activate( + path, + activate_key_template, + ): + try: check_osd_magic(path) @@ -476,6 +521,7 @@ def activate( # indicate this daemon is managed by upstart if not os.path.exists(os.path.join(path, 'upstart')): + log.debug('Marking osd as managed by upstart...') with file(os.path.join(path, 'upstart'), 'w'): pass @@ -488,39 +534,10 @@ def activate( keyring=keyring, ) write_one_line(path, 'active', 'ok') - - # check if the disk is already active - active = False - src_dev = os.stat(path).st_dev - try: - dst_dev = os.stat('/var/lib/ceph/osd/{cluster}-{osd_id}'.format( - cluster=cluster, - osd_id=osd_id)).st_dev - if src_dev == dst_dev: - active = True - except: - pass - if active: - log.debug('OSD already mounted') - unmount(path) - else: - move_mount( - path=path, - cluster=cluster, - osd_id=osd_id, - ) + log.debug('%s osd.%s data dir is ready at %s', cluster, osd_id, path) + return (osd_id, cluster) except: - unmount(path) - finally: - if do_mount: - # if we created a temp dir to mount it, remove it - os.rmdir(path) - - upstart_start( - cluster=cluster, - osd_id=osd_id, - ) - + raise def parse_args(): parser = argparse.ArgumentParser( @@ -534,7 +551,7 @@ def parse_args(): parser.add_argument( '--mount', action='store_true', default=None, - help='mount the device first', + help='mount a block device; path must follow', ) parser.add_argument( '--activate-key', @@ -545,7 +562,7 @@ def parse_args(): parser.add_argument( 'path', metavar='PATH', - help='path to OSD data directory, or block device if using --mount', + help='path to block device when using --mount', ) parser.set_defaults( activate_key_template='/var/lib/ceph/bootstrap-osd/{cluster}.keyring', @@ -568,11 +585,11 @@ def main(): ) try: - activate( - path=args.path, - activate_key_template=args.activate_key_template, - do_mount=args.mount, - ) + if args.mount: + mount_activate( + dev=args.path, + activate_key_template=args.activate_key_template, + ) except ActivateError as e: print >>sys.stderr, '{prog}: {msg}'.format( prog=args.prog, |