]>
git.proxmox.com Git - ceph.git/blob - ceph/qa/tasks/cephfs/test_journal_migration.py
2 from tasks
.cephfs
.cephfs_test_case
import CephFSTestCase
3 from tasks
.workunit
import task
as workunit
5 JOURNAL_FORMAT_LEGACY
= 0
6 JOURNAL_FORMAT_RESILIENT
= 1
9 class TestJournalMigration(CephFSTestCase
):
13 def test_journal_migration(self
):
14 old_journal_version
= JOURNAL_FORMAT_LEGACY
15 new_journal_version
= JOURNAL_FORMAT_RESILIENT
17 self
.mount_a
.umount_wait()
20 # Create a filesystem using the older journal format.
21 self
.fs
.set_ceph_conf('mds', 'mds journal format', old_journal_version
)
25 # Enable standby replay, to cover the bug case #8811 where
26 # a standby replay might mistakenly end up trying to rewrite
27 # the journal at the same time as an active daemon.
28 self
.fs
.set_allow_standby_replay(True)
30 status
= self
.fs
.wait_for_daemons()
32 self
.assertTrue(self
.fs
.get_replay(status
=status
) is not None)
34 # Do some client work so that the log is populated with something.
35 with self
.mount_a
.mounted_wait():
36 self
.mount_a
.create_files()
37 self
.mount_a
.check_files() # sanity, this should always pass
39 # Run a more substantial workunit so that the length of the log to be
40 # coverted is going span at least a few segments
43 "client.{0}".format(self
.mount_a
.client_id
): ["suites/fsstress.sh"],
48 # Modify the ceph.conf to ask the MDS to use the new journal format.
49 self
.fs
.set_ceph_conf('mds', 'mds journal format', new_journal_version
)
52 self
.fs
.mds_fail_restart()
54 # This ensures that all daemons come up into a valid state
55 status
= self
.fs
.wait_for_daemons()
57 # Check that files created in the initial client workload are still visible
59 with self
.mount_a
.mounted_wait():
60 self
.mount_a
.check_files()
62 # Verify that the journal really has been rewritten.
63 journal_version
= self
.fs
.get_journal_version()
64 if journal_version
!= new_journal_version
:
65 raise RuntimeError("Journal was not upgraded, version should be {0} but is {1}".format(
66 new_journal_version
, journal_version()
69 # Verify that cephfs-journal-tool can now read the rewritten journal
70 inspect_out
= self
.fs
.journal_tool(["journal", "inspect"], 0)
71 if not inspect_out
.endswith(": OK"):
72 raise RuntimeError("Unexpected journal-tool result: '{0}'".format(
76 self
.fs
.journal_tool(["event", "get", "json",
77 "--path", "/tmp/journal.json"], 0)
78 p
= self
.fs
.tool_remote
.sh([
81 "import json; print(len(json.load(open('/tmp/journal.json'))))"
83 event_count
= int(p
.strip())
84 if event_count
< 1000:
85 # Approximate value of "lots", expected from having run fsstress
86 raise RuntimeError("Unexpectedly few journal events: {0}".format(event_count
))
88 # Do some client work to check that writing the log is still working
89 with self
.mount_a
.mounted_wait():
92 "client.{0}".format(self
.mount_a
.client_id
): ["fs/misc/trivial_sync.sh"],
97 # Check that both an active and a standby replay are still up
98 status
= self
.fs
.status()
99 self
.assertEqual(len(list(self
.fs
.get_replays(status
=status
))), 1)
100 self
.assertEqual(len(list(self
.fs
.get_ranks(status
=status
))), 1)