]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-disk: set guid if reusing a journal partition
authorDan van der Ster <daniel.vanderster@cern.ch>
Mon, 29 Sep 2014 11:20:10 +0000 (13:20 +0200)
committerLoic Dachary <ldachary@redhat.com>
Tue, 11 Aug 2015 08:19:38 +0000 (10:19 +0200)
When reusing a journal partition (e.g. /dev/sda2) we should set a
new partition guid and link it correctly with the OSD. This way
the journal is symlinked by its persistent name and ceph-disk list
works correctly.

Signed-off-by: Dan van der Ster <daniel.vanderster@cern.ch>
(cherry picked from commit beff616f506b96eb52285f0d2e268e10f8edaa2c)

src/ceph-disk

index 085215d8d406fadae9b4716a759f32bd17c43f30..c222ec49d8c33b115faa9815420122797de56d42 100755 (executable)
@@ -1037,10 +1037,20 @@ def prepare_journal_dev(
     journal_dm_keypath,
     ):
 
+    reusing_partition = False
+
     if is_partition(journal):
         LOG.debug('Journal %s is a partition', journal)
         LOG.warning('OSD will not be hot-swappable if journal is not the same device as the osd data')
-        return (journal, None, None)
+        if get_partition_type(journal) == JOURNAL_UUID:
+            LOG.debug('Journal %s was previously prepared with ceph-disk. Reusing it.', journal)
+            reusing_partition = True
+            base = get_partition_base(journal)
+            part = journal.replace(base,'')
+            journal = base # needed for later
+        else:
+            LOG.warning('Journal %s was not prepared with ceph-disk. Symlinking directly.', journal)
+            return (journal, None, None)
 
     ptype = JOURNAL_UUID
     if journal_dm_keypath:
@@ -1048,7 +1058,7 @@ def prepare_journal_dev(
 
     # it is a whole disk.  create a partition!
     num = None
-    if journal == data:
+    if journal == data and not reusing_partition:
         # we're sharing the disk between osd data and journal;
         # make journal be partition number 2, so it's pretty
         num = 2
@@ -1056,6 +1066,9 @@ def prepare_journal_dev(
             num=num,
             size=journal_size,
             )
+    elif reusing_partition:
+        num = int(part)
+        journal_part = '' # not used in this case
     else:
         # sgdisk has no way for me to say "whatever is the next
         # free index number" when setting type guids etc, so we
@@ -1070,7 +1083,10 @@ def prepare_journal_dev(
             )
         LOG.warning('OSD will not be hot-swappable if journal is not the same device as the osd data')
 
-    dev_size = get_dev_size(journal)
+    if reusing_partition:
+        dev_size = get_dev_size(base+part)
+    else:
+        dev_size = get_dev_size(journal)
 
     if journal_size > dev_size:
         LOG.error('refusing to create journal on %s' % journal)
@@ -1080,9 +1096,7 @@ def prepare_journal_dev(
         )
 
     try:
-        LOG.debug('Creating journal partition num %d size %d on %s', num, journal_size, journal)
-        command_check_call(
-            [
+        sgdisk_call = [
                 'sgdisk',
                 '--new={part}'.format(part=journal_part),
                 '--change-name={num}:ceph journal'.format(num=num),
@@ -1097,8 +1111,14 @@ def prepare_journal_dev(
                 '--mbrtogpt',
                 '--',
                 journal,
-            ],
-        )
+            ]
+        if reusing_partition:
+            action= 'Reusing'
+            del sgdisk_call[1] # don't add --new when reusing
+        else:
+            action = 'Creating'
+        LOG.debug('%s journal partition num %d size %d on %s', action, num, journal_size, journal)
+        command_check_call(sgdisk_call)
 
         update_partition('-a', journal, 'prepared')