@@ -462,6 +462,7 @@ func TestQuotaCenter(t *testing.T) {
462462 qc := mocks .NewMockQueryCoordClient (t )
463463 meta := mockrootcoord .NewIMetaTable (t )
464464 meta .EXPECT ().GetCollectionByIDWithMaxTs (mock .Anything , mock .Anything ).Return (nil , merr .ErrCollectionNotFound ).Maybe ()
465+ meta .EXPECT ().ListDatabases (mock .Anything , mock .Anything ).Return ([]* model.Database {}, nil ).Maybe ()
465466 quotaCenter := NewQuotaCenter (pcm , qc , dc , core .tsoAllocator , meta )
466467 quotaCenter .clearMetrics ()
467468 err = quotaCenter .calculateRates ()
@@ -1798,3 +1799,146 @@ func TestTORequestLimiter(t *testing.T) {
17981799 assert .Equal (t , 1 , len (proxyLimit .Codes ))
17991800 assert .Equal (t , commonpb .ErrorCode_ForceDeny , proxyLimit .Codes [0 ])
18001801}
1802+
1803+ func TestDatabaseForceDenyDDL (t * testing.T ) {
1804+ getQuotaCenter := func () (* QuotaCenter , * mockrootcoord.IMetaTable ) {
1805+ ctx := context .Background ()
1806+ qc := mocks .NewMockQueryCoordClient (t )
1807+ meta := mockrootcoord .NewIMetaTable (t )
1808+ pcm := proxyutil .NewMockProxyClientManager (t )
1809+ dc := mocks .NewMockDataCoordClient (t )
1810+ core , _ := NewCore (ctx , nil )
1811+ core .tsoAllocator = newMockTsoAllocator ()
1812+
1813+ quotaCenter := NewQuotaCenter (pcm , qc , dc , core .tsoAllocator , meta )
1814+ return quotaCenter , meta
1815+ }
1816+
1817+ t .Run ("fail to list database" , func (t * testing.T ) {
1818+ quotaCenter , meta := getQuotaCenter ()
1819+ meta .EXPECT ().ListDatabases (mock .Anything , mock .Anything ).Return (nil , errors .New ("mock error" )).Once ()
1820+ quotaCenter .calculateDBDDLRates ()
1821+ })
1822+
1823+ t .Run ("force deny ddl for database" , func (t * testing.T ) {
1824+ quotaCenter , meta := getQuotaCenter ()
1825+ meta .EXPECT ().ListDatabases (mock .Anything , mock .Anything ).Return ([]* model.Database {
1826+ {
1827+ ID : 1 , Name : "db1" , Properties : []* commonpb.KeyValuePair {
1828+ {
1829+ Key : common .DatabaseForceDenyDDLKey ,
1830+ Value : "true" ,
1831+ },
1832+ },
1833+ },
1834+ {
1835+ ID : 2 , Name : "db2" , Properties : []* commonpb.KeyValuePair {
1836+ {
1837+ Key : "aaa" ,
1838+ Value : "true" ,
1839+ },
1840+ },
1841+ },
1842+ {
1843+ ID : 3 , Name : "db3" , Properties : []* commonpb.KeyValuePair {
1844+ {
1845+ Key : common .DatabaseForceDenyDDLKey ,
1846+ Value : "100" ,
1847+ },
1848+ },
1849+ },
1850+ }, nil ).Once ()
1851+ quotaCenter .calculateDBDDLRates ()
1852+
1853+ limiters := quotaCenter .rateLimiter .GetDatabaseLimiters (1 )
1854+ assert .Equal (t , 1 , limiters .GetQuotaStates ().Len ())
1855+ assert .True (t , limiters .GetQuotaStates ().Contain (milvuspb .QuotaState_DenyToDDL ))
1856+
1857+ {
1858+ limiter , ok := limiters .GetLimiters ().Get (internalpb .RateType_DDLCollection )
1859+ assert .Equal (t , true , ok )
1860+ assert .EqualValues (t , 0.0 , limiter .Limit ())
1861+ }
1862+ {
1863+ limiter , ok := limiters .GetLimiters ().Get (internalpb .RateType_DDLPartition )
1864+ assert .Equal (t , true , ok )
1865+ assert .EqualValues (t , 0.0 , limiter .Limit ())
1866+ }
1867+ {
1868+ limiter , ok := limiters .GetLimiters ().Get (internalpb .RateType_DDLIndex )
1869+ assert .Equal (t , true , ok )
1870+ assert .EqualValues (t , 0.0 , limiter .Limit ())
1871+ }
1872+ {
1873+ limiter , ok := limiters .GetLimiters ().Get (internalpb .RateType_DDLCompaction )
1874+ assert .Equal (t , true , ok )
1875+ assert .EqualValues (t , 0.0 , limiter .Limit ())
1876+ }
1877+ {
1878+ limiter , ok := limiters .GetLimiters ().Get (internalpb .RateType_DDLFlush )
1879+ assert .Equal (t , true , ok )
1880+ assert .EqualValues (t , 0.0 , limiter .Limit ())
1881+ }
1882+ })
1883+
1884+ t .Run ("force deny detail ddl for database" , func (t * testing.T ) {
1885+ quotaCenter , meta := getQuotaCenter ()
1886+ meta .EXPECT ().ListDatabases (mock .Anything , mock .Anything ).Return ([]* model.Database {
1887+ {
1888+ ID : 1 , Name : "foo123" , Properties : []* commonpb.KeyValuePair {
1889+ {
1890+ Key : common .DatabaseForceDenyCollectionDDLKey ,
1891+ Value : "true" ,
1892+ },
1893+ {
1894+ Key : common .DatabaseForceDenyPartitionDDLKey ,
1895+ Value : "true" ,
1896+ },
1897+ {
1898+ Key : common .DatabaseForceDenyFlushDDLKey ,
1899+ Value : "true" ,
1900+ },
1901+ {
1902+ Key : common .DatabaseForceDenyCompactionDDLKey ,
1903+ Value : "true" ,
1904+ },
1905+ {
1906+ Key : common .DatabaseForceDenyIndexDDLKey ,
1907+ Value : "true" ,
1908+ },
1909+ },
1910+ },
1911+ }, nil ).Once ()
1912+ quotaCenter .calculateDBDDLRates ()
1913+
1914+ limiters := quotaCenter .rateLimiter .GetDatabaseLimiters (1 )
1915+ assert .Equal (t , 1 , limiters .GetQuotaStates ().Len ())
1916+ assert .True (t , limiters .GetQuotaStates ().Contain (milvuspb .QuotaState_DenyToDDL ))
1917+
1918+ {
1919+ limiter , ok := limiters .GetLimiters ().Get (internalpb .RateType_DDLCollection )
1920+ assert .Equal (t , true , ok )
1921+ assert .EqualValues (t , 0.0 , limiter .Limit ())
1922+ }
1923+ {
1924+ limiter , ok := limiters .GetLimiters ().Get (internalpb .RateType_DDLPartition )
1925+ assert .Equal (t , true , ok )
1926+ assert .EqualValues (t , 0.0 , limiter .Limit ())
1927+ }
1928+ {
1929+ limiter , ok := limiters .GetLimiters ().Get (internalpb .RateType_DDLIndex )
1930+ assert .Equal (t , true , ok )
1931+ assert .EqualValues (t , 0.0 , limiter .Limit ())
1932+ }
1933+ {
1934+ limiter , ok := limiters .GetLimiters ().Get (internalpb .RateType_DDLCompaction )
1935+ assert .Equal (t , true , ok )
1936+ assert .EqualValues (t , 0.0 , limiter .Limit ())
1937+ }
1938+ {
1939+ limiter , ok := limiters .GetLimiters ().Get (internalpb .RateType_DDLFlush )
1940+ assert .Equal (t , true , ok )
1941+ assert .EqualValues (t , 0.0 , limiter .Limit ())
1942+ }
1943+ })
1944+ }
0 commit comments