From db917d50eb5f86a07a5487e130f46a6b1d27672a Mon Sep 17 00:00:00 2001 From: Jayashree Candadai Date: Fri, 21 Oct 2016 13:52:05 -0400 Subject: [PATCH] ceph-disk: allow using a regular file as a journal 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 Signed-off-by: Loic Dachary --- qa/workunits/ceph-disk/ceph-disk-test.py | 29 ++++++++++++++++++++++++ src/ceph-disk/ceph_disk/main.py | 8 ++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/qa/workunits/ceph-disk/ceph-disk-test.py b/qa/workunits/ceph-disk/ceph-disk-test.py index c0e3b5936d49..473c5349026c 100644 --- a/qa/workunits/ceph-disk/ceph-disk-test.py +++ b/qa/workunits/ceph-disk/ceph-disk-test.py @@ -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() diff --git a/src/ceph-disk/ceph_disk/main.py b/src/ceph-disk/ceph_disk/main.py index 2328c969850a..af86472284e7 100755 --- a/src/ceph-disk/ceph_disk/main.py +++ b/src/ceph-disk/ceph_disk/main.py @@ -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(), -- 2.47.3