mirror of
https://github.com/ceph/ceph
synced 2025-02-19 08:57:27 +00:00
ceph-volume lvm.prepare rollback osd when prepare fails and an osd id was generated
Signed-off-by: Alfredo Deza <adeza@redhat.com>
This commit is contained in:
parent
e533792e0d
commit
579d12806b
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user