From 579d12806b2ffc693a4e70ba3eaf663fa281d35e Mon Sep 17 00:00:00 2001 From: Alfredo Deza Date: Tue, 5 Dec 2017 10:11:03 -0500 Subject: [PATCH] ceph-volume lvm.prepare rollback osd when prepare fails and an osd id was generated Signed-off-by: Alfredo Deza --- .../ceph_volume/devices/lvm/prepare.py | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/ceph-volume/ceph_volume/devices/lvm/prepare.py b/src/ceph-volume/ceph_volume/devices/lvm/prepare.py index eb79b7d252ffb..79dca2766e1b7 100644 --- a/src/ceph-volume/ceph_volume/devices/lvm/prepare.py +++ b/src/ceph-volume/ceph_volume/devices/lvm/prepare.py @@ -1,12 +1,16 @@ from __future__ import print_function import json +import logging import uuid from textwrap import dedent from ceph_volume.util import prepare as prepare_utils from ceph_volume.util import system, disk from ceph_volume import conf, decorators, terminal from ceph_volume.api import lvm as api -from .common import prepare_parser +from .common import prepare_parser, rollback_osd + + +logger = logging.getLogger(__name__) def prepare_filestore(device, journal, secrets, id_=None, fsid=None): @@ -79,6 +83,7 @@ class Prepare(object): def __init__(self, argv): self.argv = argv + self.osd_id = None def get_ptuuid(self, argument): uuid = disk.get_partuuid(argument) @@ -161,6 +166,19 @@ class Prepare(object): raise RuntimeError('no data logical volume found with: %s' % arg) + def safe_prepare(self, args): + """ + An intermediate step between `main()` and `prepare()` so that we can + capture the `self.osd_id` in case we need to rollback + """ + try: + self.prepare(args) + except Exception: + logger.error('lvm prepare was unable to complete') + logger.info('will rollback OSD ID creation') + rollback_osd(args, self.osd_id) + raise + @decorators.needs_root def prepare(self, args): # FIXME we don't allow re-using a keyring, we always generate one for the @@ -172,7 +190,7 @@ class Prepare(object): cluster_fsid = conf.ceph.get('global', 'fsid') osd_fsid = args.osd_fsid or system.generate_uuid() # allow re-using an id, in case a prepare failed - osd_id = args.osd_id or prepare_utils.create_id(osd_fsid, json.dumps(secrets)) + self.osd_id = args.osd_id or prepare_utils.create_id(osd_fsid, json.dumps(secrets)) if args.filestore: if not args.journal: raise RuntimeError('--journal is required when using --filestore') @@ -183,7 +201,7 @@ class Prepare(object): tags = { 'ceph.osd_fsid': osd_fsid, - 'ceph.osd_id': osd_id, + 'ceph.osd_id': self.osd_id, 'ceph.cluster_fsid': cluster_fsid, 'ceph.cluster_name': conf.cluster, 'ceph.data_device': data_lv.lv_path, @@ -199,7 +217,7 @@ class Prepare(object): data_lv.lv_path, journal_device, secrets, - id_=osd_id, + id_=self.osd_id, fsid=osd_fsid, ) elif args.bluestore: @@ -209,7 +227,7 @@ class Prepare(object): tags = { 'ceph.osd_fsid': osd_fsid, - 'ceph.osd_id': osd_id, + 'ceph.osd_id': self.osd_id, 'ceph.cluster_fsid': cluster_fsid, 'ceph.cluster_name': conf.cluster, 'ceph.block_device': block_lv.lv_path, @@ -227,7 +245,7 @@ class Prepare(object): wal_device, db_device, secrets, - id_=osd_id, + id_=self.osd_id, fsid=osd_fsid, ) @@ -285,4 +303,4 @@ class Prepare(object): # cause both to be True if args.bluestore is None and args.filestore is None: args.bluestore = True - self.prepare(args) + self.safe_prepare(args) -- 2.39.5