Revision 24d16f76 test/ganeti.locking_unittest.py
b/test/ganeti.locking_unittest.py | ||
---|---|---|
30 | 30 |
import random |
31 | 31 |
import itertools |
32 | 32 |
|
33 |
from ganeti import constants |
|
33 | 34 |
from ganeti import locking |
34 | 35 |
from ganeti import errors |
35 | 36 |
from ganeti import utils |
36 | 37 |
from ganeti import compat |
38 |
from ganeti import objects |
|
39 |
from ganeti import query |
|
37 | 40 |
|
38 | 41 |
import testutils |
39 | 42 |
|
... | ... | |
773 | 776 |
prev.wait() |
774 | 777 |
|
775 | 778 |
# Check lock information |
776 |
self.assertEqual(self.sl.GetInfo(["name"]), [self.sl.name]) |
|
777 |
self.assertEqual(self.sl.GetInfo(["mode", "owner"]), |
|
778 |
["exclusive", [threading.currentThread().getName()]]) |
|
779 |
self.assertEqual(self.sl.GetInfo(["name", "pending"]), |
|
780 |
[self.sl.name, |
|
781 |
[(["exclusive", "shared"][int(bool(shared))], |
|
782 |
sorted([t.getName() for t in threads])) |
|
783 |
for acquires in [perprio[i] |
|
784 |
for i in sorted(perprio.keys())] |
|
785 |
for (shared, _, threads) in acquires]]) |
|
779 |
self.assertEqual(self.sl.GetInfo(set()), (self.sl.name, None, None, None)) |
|
780 |
self.assertEqual(self.sl.GetInfo(set([query.LQ_MODE, query.LQ_OWNER])), |
|
781 |
(self.sl.name, "exclusive", |
|
782 |
[threading.currentThread().getName()], None)) |
|
783 |
|
|
784 |
self._VerifyPrioPending(self.sl.GetInfo(set([query.LQ_PENDING])), perprio) |
|
786 | 785 |
|
787 | 786 |
# Let threads acquire the lock |
788 | 787 |
self.sl.release() |
... | ... | |
803 | 802 |
|
804 | 803 |
self.assertRaises(Queue.Empty, self.done.get_nowait) |
805 | 804 |
|
805 |
def _VerifyPrioPending(self, (name, mode, owner, pending), perprio): |
|
806 |
self.assertEqual(name, self.sl.name) |
|
807 |
self.assert_(mode is None) |
|
808 |
self.assert_(owner is None) |
|
809 |
|
|
810 |
self.assertEqual([(pendmode, sorted(waiting)) |
|
811 |
for (pendmode, waiting) in pending], |
|
812 |
[(["exclusive", "shared"][int(bool(shared))], |
|
813 |
sorted(t.getName() for t in threads)) |
|
814 |
for acquires in [perprio[i] |
|
815 |
for i in sorted(perprio.keys())] |
|
816 |
for (shared, _, threads) in acquires]) |
|
817 |
|
|
806 | 818 |
|
807 | 819 |
class TestSharedLockInCondition(_ThreadedTestCase): |
808 | 820 |
"""SharedLock as a condition lock tests""" |
... | ... | |
1638 | 1650 |
locks.append(locking.SharedLock(name, monitor=self.lm)) |
1639 | 1651 |
|
1640 | 1652 |
self.assertEqual(len(self.lm._locks), len(locks)) |
1641 |
|
|
1642 |
self.assertEqual(len(self.lm.QueryLocks(["name"], False)),
|
|
1643 |
100)
|
|
1653 |
result = objects.QueryResponse.FromDict(self.lm.QueryLocks(["name"])) |
|
1654 |
self.assertEqual(len(result.fields), 1)
|
|
1655 |
self.assertEqual(len(result.data), 100)
|
|
1644 | 1656 |
|
1645 | 1657 |
# Delete all locks |
1646 | 1658 |
del locks[:] |
... | ... | |
1684 | 1696 |
# Check order in which locks were added |
1685 | 1697 |
self.assertEqual([i.name for i in locks], expnames) |
1686 | 1698 |
|
1687 |
# Sync queries are not supported |
|
1688 |
self.assertRaises(NotImplementedError, self.lm.QueryLocks, ["name"], True) |
|
1689 |
|
|
1690 | 1699 |
# Check query result |
1691 |
self.assertEqual(self.lm.QueryLocks(["name", "mode", "owner", "pending"], |
|
1692 |
False), |
|
1693 |
[[name, None, None, []] |
|
1700 |
result = self.lm.QueryLocks(["name", "mode", "owner", "pending"]) |
|
1701 |
self.assert_(isinstance(result, dict)) |
|
1702 |
response = objects.QueryResponse.FromDict(result) |
|
1703 |
self.assertEqual(response.data, |
|
1704 |
[[(constants.QRFS_NORMAL, name), |
|
1705 |
(constants.QRFS_NORMAL, None), |
|
1706 |
(constants.QRFS_NORMAL, None), |
|
1707 |
(constants.QRFS_NORMAL, [])] |
|
1694 | 1708 |
for name in utils.NiceSort(expnames)]) |
1709 |
self.assertEqual(len(response.fields), 4) |
|
1710 |
self.assertEqual(["name", "mode", "owner", "pending"], |
|
1711 |
[fdef.name for fdef in response.fields]) |
|
1695 | 1712 |
|
1696 | 1713 |
# Test exclusive acquire |
1697 | 1714 |
for tlock in locks[::4]: |
... | ... | |
1699 | 1716 |
try: |
1700 | 1717 |
def _GetExpResult(name): |
1701 | 1718 |
if tlock.name == name: |
1702 |
return [name, "exclusive", [threading.currentThread().getName()], |
|
1703 |
[]] |
|
1704 |
return [name, None, None, []] |
|
1705 |
|
|
1706 |
self.assertEqual(self.lm.QueryLocks(["name", "mode", "owner", |
|
1707 |
"pending"], False), |
|
1719 |
return [(constants.QRFS_NORMAL, name), |
|
1720 |
(constants.QRFS_NORMAL, "exclusive"), |
|
1721 |
(constants.QRFS_NORMAL, |
|
1722 |
[threading.currentThread().getName()]), |
|
1723 |
(constants.QRFS_NORMAL, [])] |
|
1724 |
return [(constants.QRFS_NORMAL, name), |
|
1725 |
(constants.QRFS_NORMAL, None), |
|
1726 |
(constants.QRFS_NORMAL, None), |
|
1727 |
(constants.QRFS_NORMAL, [])] |
|
1728 |
|
|
1729 |
result = self.lm.QueryLocks(["name", "mode", "owner", "pending"]) |
|
1730 |
self.assertEqual(objects.QueryResponse.FromDict(result).data, |
|
1708 | 1731 |
[_GetExpResult(name) |
1709 | 1732 |
for name in utils.NiceSort(expnames)]) |
1710 | 1733 |
finally: |
... | ... | |
1756 | 1779 |
i.wait() |
1757 | 1780 |
|
1758 | 1781 |
# Check query result |
1759 |
for (name, mode, owner) in self.lm.QueryLocks(["name", "mode", |
|
1760 |
"owner"], False): |
|
1761 |
if name == tlock1.name: |
|
1762 |
self.assertEqual(mode, "shared") |
|
1763 |
self.assertEqual(set(owner), set(i.getName() for i in tthreads1)) |
|
1782 |
result = self.lm.QueryLocks(["name", "mode", "owner"]) |
|
1783 |
response = objects.QueryResponse.FromDict(result) |
|
1784 |
for (name, mode, owner) in response.data: |
|
1785 |
(name_status, name_value) = name |
|
1786 |
(owner_status, owner_value) = owner |
|
1787 |
|
|
1788 |
self.assertEqual(name_status, constants.QRFS_NORMAL) |
|
1789 |
self.assertEqual(owner_status, constants.QRFS_NORMAL) |
|
1790 |
|
|
1791 |
if name_value == tlock1.name: |
|
1792 |
self.assertEqual(mode, (constants.QRFS_NORMAL, "shared")) |
|
1793 |
self.assertEqual(set(owner_value), |
|
1794 |
set(i.getName() for i in tthreads1)) |
|
1764 | 1795 |
continue |
1765 | 1796 |
|
1766 |
if name == tlock2.name: |
|
1767 |
self.assertEqual(mode, "shared")
|
|
1768 |
self.assertEqual(owner, [tthread2.getName()]) |
|
1797 |
if name_value == tlock2.name:
|
|
1798 |
self.assertEqual(mode, (constants.QRFS_NORMAL, "shared"))
|
|
1799 |
self.assertEqual(owner_value, [tthread2.getName()])
|
|
1769 | 1800 |
continue |
1770 | 1801 |
|
1771 |
if name == tlock3.name: |
|
1772 |
self.assertEqual(mode, "exclusive")
|
|
1773 |
self.assertEqual(owner, [tthread3.getName()]) |
|
1802 |
if name_value == tlock3.name:
|
|
1803 |
self.assertEqual(mode, (constants.QRFS_NORMAL, "exclusive"))
|
|
1804 |
self.assertEqual(owner_value, [tthread3.getName()])
|
|
1774 | 1805 |
continue |
1775 | 1806 |
|
1776 |
self.assert_(name in expnames) |
|
1777 |
self.assert_(mode is None)
|
|
1778 |
self.assert_(owner is None) |
|
1807 |
self.assert_(name_value in expnames)
|
|
1808 |
self.assertEqual(mode, (constants.QRFS_NORMAL, None))
|
|
1809 |
self.assert_(owner_value is None)
|
|
1779 | 1810 |
|
1780 | 1811 |
# Release locks again |
1781 | 1812 |
releaseev.set() |
1782 | 1813 |
|
1783 | 1814 |
self._waitThreads() |
1784 | 1815 |
|
1785 |
self.assertEqual(self.lm.QueryLocks(["name", "mode", "owner"], False), |
|
1786 |
[[name, None, None] |
|
1816 |
result = self.lm.QueryLocks(["name", "mode", "owner"]) |
|
1817 |
self.assertEqual(objects.QueryResponse.FromDict(result).data, |
|
1818 |
[[(constants.QRFS_NORMAL, name), |
|
1819 |
(constants.QRFS_NORMAL, None), |
|
1820 |
(constants.QRFS_NORMAL, None)] |
|
1787 | 1821 |
for name in utils.NiceSort(expnames)]) |
1788 | 1822 |
|
1789 | 1823 |
def testDelete(self): |
1790 | 1824 |
lock = locking.SharedLock("TestLock", monitor=self.lm) |
1791 | 1825 |
|
1792 | 1826 |
self.assertEqual(len(self.lm._locks), 1) |
1793 |
self.assertEqual(self.lm.QueryLocks(["name", "mode", "owner"], False), |
|
1794 |
[[lock.name, None, None]]) |
|
1827 |
result = self.lm.QueryLocks(["name", "mode", "owner"]) |
|
1828 |
self.assertEqual(objects.QueryResponse.FromDict(result).data, |
|
1829 |
[[(constants.QRFS_NORMAL, lock.name), |
|
1830 |
(constants.QRFS_NORMAL, None), |
|
1831 |
(constants.QRFS_NORMAL, None)]]) |
|
1795 | 1832 |
|
1796 | 1833 |
lock.delete() |
1797 | 1834 |
|
1798 |
self.assertEqual(self.lm.QueryLocks(["name", "mode", "owner"], False), |
|
1799 |
[[lock.name, "deleted", None]]) |
|
1835 |
result = self.lm.QueryLocks(["name", "mode", "owner"]) |
|
1836 |
self.assertEqual(objects.QueryResponse.FromDict(result).data, |
|
1837 |
[[(constants.QRFS_NORMAL, lock.name), |
|
1838 |
(constants.QRFS_NORMAL, "deleted"), |
|
1839 |
(constants.QRFS_NORMAL, None)]]) |
|
1800 | 1840 |
self.assertEqual(len(self.lm._locks), 1) |
1801 | 1841 |
|
1802 | 1842 |
def testPending(self): |
... | ... | |
1815 | 1855 |
lock.acquire() |
1816 | 1856 |
try: |
1817 | 1857 |
self.assertEqual(len(self.lm._locks), 1) |
1818 |
self.assertEqual(self.lm.QueryLocks(["name", "mode", "owner"], False), |
|
1819 |
[[lock.name, "exclusive", |
|
1820 |
[threading.currentThread().getName()]]]) |
|
1858 |
result = self.lm.QueryLocks(["name", "mode", "owner"]) |
|
1859 |
self.assertEqual(objects.QueryResponse.FromDict(result).data, |
|
1860 |
[[(constants.QRFS_NORMAL, lock.name), |
|
1861 |
(constants.QRFS_NORMAL, "exclusive"), |
|
1862 |
(constants.QRFS_NORMAL, |
|
1863 |
[threading.currentThread().getName()])]]) |
|
1821 | 1864 |
|
1822 | 1865 |
threads = [] |
1823 | 1866 |
|
... | ... | |
1843 | 1886 |
|
1844 | 1887 |
# All acquires are waiting now |
1845 | 1888 |
if shared: |
1846 |
pending = [("shared", sorted([t.getName() for t in threads]))]
|
|
1889 |
pending = [("shared", utils.NiceSort(t.getName() for t in threads))]
|
|
1847 | 1890 |
else: |
1848 | 1891 |
pending = [("exclusive", [t.getName()]) for t in threads] |
1849 | 1892 |
|
1850 |
self.assertEqual(self.lm.QueryLocks(["name", "mode", "owner", |
|
1851 |
"pending"], False), |
|
1852 |
[[lock.name, "exclusive", |
|
1853 |
[threading.currentThread().getName()], |
|
1854 |
pending]]) |
|
1893 |
result = self.lm.QueryLocks(["name", "mode", "owner", "pending"]) |
|
1894 |
self.assertEqual(objects.QueryResponse.FromDict(result).data, |
|
1895 |
[[(constants.QRFS_NORMAL, lock.name), |
|
1896 |
(constants.QRFS_NORMAL, "exclusive"), |
|
1897 |
(constants.QRFS_NORMAL, |
|
1898 |
[threading.currentThread().getName()]), |
|
1899 |
(constants.QRFS_NORMAL, pending)]]) |
|
1855 | 1900 |
|
1856 | 1901 |
self.assertEqual(len(self.lm._locks), 1) |
1857 | 1902 |
finally: |
... | ... | |
1860 | 1905 |
self._waitThreads() |
1861 | 1906 |
|
1862 | 1907 |
# No pending acquires |
1863 |
self.assertEqual(self.lm.QueryLocks(["name", "mode", "owner", "pending"], |
|
1864 |
False), |
|
1865 |
[[lock.name, None, None, []]]) |
|
1908 |
result = self.lm.QueryLocks(["name", "mode", "owner", "pending"]) |
|
1909 |
self.assertEqual(objects.QueryResponse.FromDict(result).data, |
|
1910 |
[[(constants.QRFS_NORMAL, lock.name), |
|
1911 |
(constants.QRFS_NORMAL, None), |
|
1912 |
(constants.QRFS_NORMAL, None), |
|
1913 |
(constants.QRFS_NORMAL, [])]]) |
|
1866 | 1914 |
|
1867 | 1915 |
self.assertEqual(len(self.lm._locks), 1) |
1868 | 1916 |
|
Also available in: Unified diff