]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-disk: allow using a regular file as a journal 11619/head
authorJayashree Candadai <jayaajay@indiana.edu>
Fri, 21 Oct 2016 17:52:05 +0000 (13:52 -0400)
committerLoic Dachary <ldachary@redhat.com>
Mon, 24 Oct 2016 13:58:31 +0000 (15:58 +0200)
Because of a missing return, ceph-disk prepare would fail if given a
regular file as a journal. If the journal file does not exist, ceph-disk
will create it but fail to ensure that the ceph user owns it. The
symlink to the journal file is not set when the journal file is
specified on the command line and the journal file does not exist at
all. The ceph-osd daemon will silently create it as a file but it will
not be the file given in argument.

Add a test case to verify using a regular file as a journal works as
expected.

Fixes: http://tracker.ceph.com/issues/17662
Signed-off-by: Jayashree Candadai <jayaajay@indiana.edu>
Signed-off-by: Loic Dachary <ldachary@redhat.com>
qa/workunits/ceph-disk/ceph-disk-test.py
src/ceph-disk/ceph_disk/main.py

index c0e3b5936d4949e4c74b4e6e35b0b83bfafdff56..473c5349026cefb71f56c505848c3b28c6102ec6 100644 (file)
@@ -570,6 +570,35 @@ class TestCephDisk(object):
         os.unlink(symlink)
         os.rmdir(tempdir)
 
+    def test_activate_journal_file(self):
+        c = CephDisk()
+        disks = c.unused_disks()
+        data_disk = disks[0]
+        #
+        # /var/lib/ceph/osd is required otherwise it may violate
+        # restrictions enforced by systemd regarding the directories
+        # which ceph-osd is allowed to read/write
+        #
+        tempdir = tempfile.mkdtemp(dir='/var/lib/ceph/osd')
+        c.sh("chown ceph:ceph " + tempdir + " || true")
+        journal_file = os.path.join(tempdir, 'journal')
+        osd_uuid = str(uuid.uuid1())
+        c.sh("ceph-disk --verbose prepare --osd-uuid " + osd_uuid +
+             " " + data_disk + " " + journal_file)
+        c.wait_for_osd_up(osd_uuid)
+        device = json.loads(
+            c.sh("ceph-disk list --format json " + data_disk))[0]
+        assert len(device['partitions']) == 1
+        partition = device['partitions'][0]
+        assert journal_file == os.readlink(
+            os.path.join(partition['mount'], 'journal'))
+        c.check_osd_status(osd_uuid)
+        c.helper("pool_read_write 1")  # 1 == pool size
+        c.destroy_osd(osd_uuid)
+        c.sh("ceph-disk --verbose zap " + data_disk)
+        os.unlink(journal_file)
+        os.rmdir(tempdir)
+
     def test_activate_separated_journal(self):
         c = CephDisk()
         disks = c.unused_disks()
index 2328c969850ad00ca4a218d5707ad09526e8bb87..af86472284e793f935fea8b42b042bf79d3411b4 100755 (executable)
@@ -1927,6 +1927,7 @@ class PrepareSpace(object):
                 raise Error('%s is not a block device' % name.capitalize,
                             getattr(args, name))
             self.type = self.FILE
+            return
 
         raise Error('%s %s is neither a block device nor regular file' %
                     (name.capitalize, getattr(args, name)))
@@ -1987,13 +1988,13 @@ class PrepareSpace(object):
         if getattr(self.args, space_uuid) is not None:
             write_one_line(path, space_uuid,
                            getattr(self.args, space_uuid))
-
-    def populate_data_path_device(self, path):
-        self.populate_data_path_file(path)
         if self.space_symlink is not None:
             adjust_symlink(self.space_symlink,
                            os.path.join(path, self.name))
 
+    def populate_data_path_device(self, path):
+        self.populate_data_path_file(path)
+
         if self.space_dmcrypt is not None:
             adjust_symlink(self.space_dmcrypt,
                            os.path.join(path, self.name + '_dmcrypt'))
@@ -2022,6 +2023,7 @@ class PrepareSpace(object):
                       space_filename)
             space_file = open(space_filename, 'wb')
             space_file.close()
+            path_set_context(space_filename)
 
         LOG.debug('%s is file %s',
                   self.name.capitalize(),