Skip to content

Commit 8513caa

Browse files
authored
Merge pull request ClickHouse#79148 from ClickHouse/fs-cache-add-setting-to-allow-background-download
Add a setting to enable/disable dynamic fs cache resize
2 parents 34d102a + a1735bc commit 8513caa

File tree

8 files changed

+178
-44
lines changed

8 files changed

+178
-44
lines changed

src/Interpreters/Cache/FileCache.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ namespace FileCacheSetting
7575
extern const FileCacheSettingsBool write_cache_per_user_id_directory;
7676
extern const FileCacheSettingsUInt64 cache_hits_threshold;
7777
extern const FileCacheSettingsBool enable_filesystem_query_cache_limit;
78+
extern const FileCacheSettingsBool allow_dynamic_cache_resize;
7879
}
7980

8081
namespace
@@ -116,6 +117,7 @@ FileCache::FileCache(const std::string & cache_name, const FileCacheSettings & s
116117
, load_metadata_threads(settings[FileCacheSetting::load_metadata_threads])
117118
, load_metadata_asynchronously(settings[FileCacheSetting::load_metadata_asynchronously])
118119
, write_cache_per_user_directory(settings[FileCacheSetting::write_cache_per_user_id_directory])
120+
, allow_dynamic_cache_resize(settings[FileCacheSetting::allow_dynamic_cache_resize])
119121
, keep_current_size_to_max_ratio(1 - settings[FileCacheSetting::keep_free_space_size_ratio])
120122
, keep_current_elements_to_max_ratio(1 - settings[FileCacheSetting::keep_free_space_elements_ratio])
121123
, keep_up_free_space_remove_batch(settings[FileCacheSetting::keep_free_space_remove_batch])
@@ -1679,8 +1681,10 @@ void FileCache::applySettingsIfPossible(const FileCacheSettings & new_settings,
16791681
actual_settings[FileCacheSetting::background_download_max_file_segment_size] = new_settings[FileCacheSetting::background_download_max_file_segment_size];
16801682
}
16811683

1682-
if (new_settings[FileCacheSetting::max_size] != actual_settings[FileCacheSetting::max_size]
1683-
|| new_settings[FileCacheSetting::max_elements] != actual_settings[FileCacheSetting::max_elements])
1684+
const bool cache_size_changed = new_settings[FileCacheSetting::max_size] != actual_settings[FileCacheSetting::max_size]
1685+
|| new_settings[FileCacheSetting::max_elements] != actual_settings[FileCacheSetting::max_elements];
1686+
1687+
if (allow_dynamic_cache_resize && cache_size_changed)
16841688
{
16851689
EvictionCandidates eviction_candidates;
16861690
bool modified_size_limit = false;
@@ -1845,6 +1849,13 @@ void FileCache::applySettingsIfPossible(const FileCacheSettings & new_settings,
18451849
chassert(main_priority->getSizeLimit(lockCache()) == actual_settings[FileCacheSetting::max_size]);
18461850
chassert(main_priority->getElementsLimit(lockCache()) == actual_settings[FileCacheSetting::max_elements]);
18471851
}
1852+
else if (cache_size_changed)
1853+
{
1854+
LOG_WARNING(
1855+
log, "Filesystem cache size was modified, "
1856+
"but dynamic cache resize is disabled, therefore cache size will not be changed without server restart. "
1857+
"To enable dynamic cache resize, add `allow_dynamic_cache_resize` to cache configuration");
1858+
}
18481859

18491860
if (new_settings[FileCacheSetting::max_file_segment_size] != actual_settings[FileCacheSetting::max_file_segment_size])
18501861
{

src/Interpreters/Cache/FileCache.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ class FileCache : private boost::noncopyable
210210
std::atomic<bool> stop_loading_metadata = false;
211211
ThreadFromGlobalPool load_metadata_main_thread;
212212
const bool write_cache_per_user_directory;
213+
const bool allow_dynamic_cache_resize;
213214

214215
BackgroundSchedulePoolTaskHolder keep_up_free_space_ratio_task;
215216
const double keep_current_size_to_max_ratio;

src/Interpreters/Cache/FileCacheSettings.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ namespace ErrorCodes
4545
DECLARE(UInt64, cache_hits_threshold, FILECACHE_DEFAULT_HITS_THRESHOLD, "Number of cache hits required to cache corresponding file segment", 0) \
4646
DECLARE(Bool, enable_bypass_cache_with_threshold, false, "Undocumented. Not recommended for use", 0) \
4747
DECLARE(UInt64, bypass_cache_threshold, FILECACHE_BYPASS_THRESHOLD, "Undocumented. Not recommended for use", 0) \
48-
DECLARE(Bool, write_cache_per_user_id_directory, false, "Private setting", 0)
48+
DECLARE(Bool, write_cache_per_user_id_directory, false, "Internal ClickHouse Cloud setting", 0) \
49+
DECLARE(Bool, allow_dynamic_cache_resize, false, "Allow dynamic resize of filesystem cache", 0)
4950

5051
DECLARE_SETTINGS_TRAITS(FileCacheSettingsTraits, LIST_OF_FILE_CACHE_SETTINGS)
5152
IMPLEMENT_SETTINGS_TRAITS(FileCacheSettingsTraits, LIST_OF_FILE_CACHE_SETTINGS)

tests/config/config.d/storage_conf.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
<cache_on_write_operations>1</cache_on_write_operations>
2525
<cache_policy>LRU</cache_policy>
2626
<slru_size_ratio>0.3</slru_size_ratio>
27+
<allow_dynamic_cache_resize>1</allow_dynamic_cache_resize>
2728
<keep_free_space_size_ratio>0.15</keep_free_space_size_ratio>
2829
<keep_free_space_elements_ratio>0.15</keep_free_space_elements_ratio>
2930
<background_download_queue_size_limit>50</background_download_queue_size_limit>

tests/config/config.d/storage_conf_02944.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<boundary_alignment>10</boundary_alignment>
2020
<cache_on_write_operations>0</cache_on_write_operations>
2121
<load_metadata_asynchronously>0</load_metadata_asynchronously>
22+
<allow_dynamic_cache_resize>1</allow_dynamic_cache_resize>
2223
</s3_cache_02944>
2324
</disks>
2425
</storage_configuration>

tests/integration/test_filesystem_cache/config.d/cache_dynamic_resize.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,19 @@
1212
<max_elements>100</max_elements>
1313
<max_file_segment_size>10</max_file_segment_size>
1414
<boundary_alignment>10</boundary_alignment>
15+
<allow_dynamic_cache_resize>1</allow_dynamic_cache_resize>
1516
<path>./cache_dynamic_reload/</path>
1617
</cache_dynamic_resize>
18+
<cache_dynamic_resize_disabled>
19+
<type>cache</type>
20+
<disk>hdd_blob</disk>
21+
<max_size>100000</max_size>
22+
<max_elements>100</max_elements>
23+
<max_file_segment_size>10</max_file_segment_size>
24+
<boundary_alignment>10</boundary_alignment>
25+
<allow_dynamic_cache_resize>0</allow_dynamic_cache_resize>
26+
<path>./cache_dynamic_reload_disabled/</path>
27+
</cache_dynamic_resize_disabled>
1728
</disks>
1829
</storage_configuration>
1930
<filesystem_cache_log>

tests/integration/test_filesystem_cache/test.py

Lines changed: 148 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,9 @@ def to_int(value):
479479
)
480480
assert r_cache_count_2 == r_cache_count
481481

482-
assert node.query("select current_size from system.filesystem_cache_settings where cache_name = 'force_cache_on_merges'") == node.query("select sum(downloaded_size) from system.filesystem_cache")
482+
assert node.query(
483+
"select current_size from system.filesystem_cache_settings where cache_name = 'force_cache_on_merges'"
484+
) == node.query("select sum(downloaded_size) from system.filesystem_cache")
483485

484486
node.query("SYSTEM DROP FILESYSTEM CACHE")
485487
node.query("OPTIMIZE TABLE test FINAL")
@@ -644,6 +646,7 @@ def test_keep_up_size_ratio(cluster):
644646
time.sleep(1)
645647
assert elements <= expected
646648

649+
647650
cache_dynamic_resize_config = """
648651
<clickhouse>
649652
<storage_configuration>
@@ -661,6 +664,16 @@ def test_keep_up_size_ratio(cluster):
661664
<boundary_alignment>10</boundary_alignment>
662665
<path>./cache_dynamic_reload/</path>
663666
</cache_dynamic_resize>
667+
<cache_dynamic_resize_disabled>
668+
<type>cache</type>
669+
<disk>hdd_blob</disk>
670+
<max_size>{}</max_size>
671+
<max_elements>{}</max_elements>
672+
<max_file_segment_size>10</max_file_segment_size>
673+
<boundary_alignment>10</boundary_alignment>
674+
<allow_dynamic_cache_resize>0</allow_dynamic_cache_resize>
675+
<path>./cache_dynamic_reload_disabled/</path>
676+
</cache_dynamic_resize_disabled>
664677
</disks>
665678
</storage_configuration>
666679
<filesystem_cache_log>
@@ -670,6 +683,7 @@ def test_keep_up_size_ratio(cluster):
670683
</clickhouse>
671684
"""
672685

686+
673687
def test_dynamic_resize(cluster):
674688
node = cluster.instances["cache_dynamic_resize"]
675689
max_elements = 20
@@ -692,25 +706,32 @@ def test_dynamic_resize(cluster):
692706
)
693707

694708
def get_downloaded_size():
695-
return int(node.query(
696-
f"SELECT sum(downloaded_size) FROM system.filesystem_cache WHERE cache_name = '{cache_name}'"
697-
))
709+
return int(
710+
node.query(
711+
f"SELECT sum(downloaded_size) FROM system.filesystem_cache WHERE cache_name = '{cache_name}'"
712+
)
713+
)
698714

699715
def get_queue_size():
700-
return int(node.query(
701-
f"SELECT current_size FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
702-
))
716+
return int(
717+
node.query(
718+
f"SELECT current_size FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
719+
)
720+
)
703721

704722
def get_downloaded_elements():
705-
return int(node.query(
706-
f"SELECT count() FROM system.filesystem_cache WHERE cache_name = '{cache_name}'"
707-
))
723+
return int(
724+
node.query(
725+
f"SELECT count() FROM system.filesystem_cache WHERE cache_name = '{cache_name}'"
726+
)
727+
)
708728

709729
def get_queue_elements():
710-
return int(node.query(
711-
f"SELECT current_elements_num FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
712-
))
713-
730+
return int(
731+
node.query(
732+
f"SELECT current_elements_num FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
733+
)
734+
)
714735

715736
size = get_downloaded_size()
716737
assert size > 100
@@ -720,9 +741,11 @@ def get_queue_elements():
720741
assert elements > 10
721742
assert elements == get_queue_elements()
722743

723-
default_config = cache_dynamic_resize_config.format(100000, 100)
724-
new_config = cache_dynamic_resize_config.format(100000, 10)
725-
node.replace_config("/etc/clickhouse-server/config.d/cache_dynamic_resize.xml", new_config)
744+
default_config = cache_dynamic_resize_config.format(100000, 100, 100000, 100)
745+
new_config = cache_dynamic_resize_config.format(100000, 10, 100000, 100)
746+
node.replace_config(
747+
"/etc/clickhouse-server/config.d/cache_dynamic_resize.xml", new_config
748+
)
726749

727750
node.query("SYSTEM RELOAD CONFIG")
728751

@@ -731,43 +754,59 @@ def get_queue_elements():
731754

732755
node.query(f"SYSTEM ENABLE FAILPOINT file_cache_dynamic_resize_fail_to_evict")
733756

734-
new_config = cache_dynamic_resize_config.format(100000, 5)
735-
node.replace_config("/etc/clickhouse-server/config.d/cache_dynamic_resize.xml", new_config)
757+
new_config = cache_dynamic_resize_config.format(100000, 5, 100000, 100)
758+
node.replace_config(
759+
"/etc/clickhouse-server/config.d/cache_dynamic_resize.xml", new_config
760+
)
736761

737762
node.query("SYSTEM RELOAD CONFIG")
738763

739764
assert 10 == get_queue_elements()
740765
assert 10 == get_downloaded_elements()
741766

742-
assert 100000 == int(node.query(
743-
f"SELECT max_size FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
744-
))
745-
assert 10 == int(node.query(
746-
f"SELECT max_elements FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
747-
))
767+
assert 100000 == int(
768+
node.query(
769+
f"SELECT max_size FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
770+
)
771+
)
772+
assert 10 == int(
773+
node.query(
774+
f"SELECT max_elements FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
775+
)
776+
)
748777

749778
node.query(f"SYSTEM DISABLE FAILPOINT file_cache_dynamic_resize_fail_to_evict")
750779
node.query("SYSTEM RELOAD CONFIG")
751780

752781
assert 5 == get_downloaded_elements()
753782
assert 5 == get_queue_elements()
754783

755-
assert 100000 == int(node.query(
756-
f"SELECT max_size FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
757-
))
758-
assert 5 == int(node.query(
759-
f"SELECT max_elements FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
760-
))
784+
assert 100000 == int(
785+
node.query(
786+
f"SELECT max_size FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
787+
)
788+
)
789+
assert 5 == int(
790+
node.query(
791+
f"SELECT max_elements FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
792+
)
793+
)
761794

762-
node.replace_config("/etc/clickhouse-server/config.d/cache_dynamic_resize.xml", default_config)
795+
node.replace_config(
796+
"/etc/clickhouse-server/config.d/cache_dynamic_resize.xml", default_config
797+
)
763798
node.query("SYSTEM RELOAD CONFIG")
764799

765-
assert 100000 == int(node.query(
766-
f"SELECT max_size FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
767-
))
768-
assert 100 == int(node.query(
769-
f"SELECT max_elements FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
770-
))
800+
assert 100000 == int(
801+
node.query(
802+
f"SELECT max_size FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
803+
)
804+
)
805+
assert 100 == int(
806+
node.query(
807+
f"SELECT max_elements FROM system.filesystem_cache_settings WHERE cache_name = '{cache_name}'"
808+
)
809+
)
771810

772811

773812
def test_filesystem_cache_log(cluster):
@@ -799,7 +838,11 @@ def test_filesystem_cache_log(cluster):
799838
)
800839

801840
node.query("SYSTEM FLUSH LOGS")
802-
assert 0 == int(node.query(f"SELECT count() FROM system.filesystem_cache_log WHERE query_id = '{query_id}'"))
841+
assert 0 == int(
842+
node.query(
843+
f"SELECT count() FROM system.filesystem_cache_log WHERE query_id = '{query_id}'"
844+
)
845+
)
803846

804847
query_id = "system_filesystem_cache_log_2"
805848
node.query(
@@ -808,4 +851,69 @@ def test_filesystem_cache_log(cluster):
808851
)
809852

810853
node.query("SYSTEM FLUSH LOGS")
811-
assert 0 < int(node.query(f"SELECT count() FROM system.filesystem_cache_log WHERE query_id = '{query_id}'"))
854+
assert 0 < int(
855+
node.query(
856+
f"SELECT count() FROM system.filesystem_cache_log WHERE query_id = '{query_id}'"
857+
)
858+
)
859+
860+
861+
def test_dynamic_resize_disabled(cluster):
862+
node = cluster.instances["cache_dynamic_resize"]
863+
max_elements = 20
864+
cache_name = "cache_dynamic_resize_disabled"
865+
node.query(
866+
f"""
867+
DROP TABLE IF EXISTS test;
868+
SYSTEM DROP FILESYSTEM CACHE;
869+
CREATE TABLE test (a String)
870+
ENGINE = MergeTree() ORDER BY tuple()
871+
SETTINGS disk = '{cache_name}', min_bytes_for_wide_part = 10485760;
872+
"""
873+
)
874+
875+
node.query(
876+
"""
877+
INSERT INTO test SELECT randomString(200);
878+
SELECT * FROM test;
879+
"""
880+
)
881+
882+
def get_downloaded_size():
883+
return int(
884+
node.query(
885+
f"SELECT sum(downloaded_size) FROM system.filesystem_cache WHERE cache_name = '{cache_name}'"
886+
)
887+
)
888+
889+
def get_downloaded_elements():
890+
return int(
891+
node.query(
892+
f"SELECT count() FROM system.filesystem_cache WHERE cache_name = '{cache_name}'"
893+
)
894+
)
895+
896+
size = get_downloaded_size()
897+
assert size > 100
898+
899+
elements = get_downloaded_elements()
900+
assert elements > 10
901+
902+
default_config = cache_dynamic_resize_config.format(100000, 100, 100000, 100)
903+
new_config = cache_dynamic_resize_config.format(100000, 100, 100000, 10)
904+
node.replace_config(
905+
"/etc/clickhouse-server/config.d/cache_dynamic_resize.xml", new_config
906+
)
907+
908+
node.query("SYSTEM RELOAD CONFIG")
909+
910+
assert size == get_downloaded_size()
911+
assert elements == get_downloaded_elements()
912+
913+
assert node.contains_in_log(
914+
f"FileCache({cache_name}): Filesystem cache size was modified, but dynamic cache resize is disabled"
915+
)
916+
# Return config back to initial state.
917+
node.replace_config(
918+
"/etc/clickhouse-server/config.d/cache_dynamic_resize.xml", default_config
919+
)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
1
2-
02344_describe_cache_test /var/lib/clickhouse/filesystem_caches/02344_describe_cache_test 102400 10000000 33554432 4194304 0 LRU 0.6 5 5000 4194304 16 0 0 0 10 0 0 0 268435456 0 1 0 0
2+
02344_describe_cache_test /var/lib/clickhouse/filesystem_caches/02344_describe_cache_test 102400 10000000 33554432 4194304 0 LRU 0.6 5 5000 4194304 16 0 0 0 10 0 0 0 268435456 0 0 1 0 0

0 commit comments

Comments
 (0)