BBlack has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/324942 )
Change subject: VCL refactor: split cache/app backend support ...................................................................... VCL refactor: split cache/app backend support This splits the old "directors" aka "varnish_directors" into two distinct subsets "backend_caches" and "app_directors", with separate requirements, defaults, and supporting code for their simplified use-cases. Keys "type" and "dynamic" removed from all types of director definitions. Type is always random for app, always the pair of vslp+random defs for cache. Dynamic is always false for app and true for backend cache. backend_caches assumes a bunch of things: * dynamic from conftool ** (except when disabled for e.g. beta / cp1008 / varnishtest) * vslp for primary director, plus auto-generated _random director * always array-form "backends" * always probe "varnish" app_director assumes: * static config * singular "backend" host, using "random" director * no probe Other random simplifications ensued as well, including getting rid of the fake/additional conftool service "varnish-be-rand". Both vslp and random directors now use "varnish-be" as it should be. Bug: T110717 Change-Id: I8053dcf318cb31576d16b4360c8a4836ca9ef11e --- M hieradata/hosts/cp1008.yaml M hieradata/labs.yaml M modules/role/manifests/cache/instances.pp M modules/role/manifests/cache/maps.pp M modules/role/manifests/cache/misc.pp M modules/role/manifests/cache/text.pp M modules/role/manifests/cache/upload.pp M modules/varnish/manifests/common/directors.pp M modules/varnish/manifests/instance.pp M modules/varnish/manifests/wikimedia_vcl.pp M modules/varnish/templates/vcl/directors.vcl.tpl.erb M modules/varnish/templates/vcl/wikimedia-common.inc.vcl.erb 12 files changed, 145 insertions(+), 246 deletions(-) Approvals: BBlack: Verified; Looks good to me, approved diff --git a/hieradata/hosts/cp1008.yaml b/hieradata/hosts/cp1008.yaml index 13a26b6..b07ce38 100644 --- a/hieradata/hosts/cp1008.yaml +++ b/hieradata/hosts/cp1008.yaml @@ -1,7 +1,7 @@ debdeploy::grains: debdeploy-cp: value: canary -varnish::dynamic_directors: false +varnish::dynamic_backend_caches: false cache::text::nodes: eqiad: - 'cp1008.wikimedia.org' diff --git a/hieradata/labs.yaml b/hieradata/labs.yaml index cb9b193..000fa7d 100644 --- a/hieradata/labs.yaml +++ b/hieradata/labs.yaml @@ -98,7 +98,7 @@ role::cache::base::storage_parts: - vdb - vdb -varnish::dynamic_directors: false +varnish::dynamic_backend_caches: false swift::proxy::tld: 'beta.wmflabs.org' diff --git a/modules/role/manifests/cache/instances.pp b/modules/role/manifests/cache/instances.pp index a334ba9..52058ad 100644 --- a/modules/role/manifests/cache/instances.pp +++ b/modules/role/manifests/cache/instances.pp @@ -15,8 +15,6 @@ $cluster_nodes ) { - $chash_dir = 'vslp' - $cache_route_table = hiera('cache::route_table') $cache_route = $cache_route_table[$::site] @@ -30,34 +28,14 @@ $backend_caches = { 'cache_eqiad' => { - 'dynamic' => 'yes', - 'type' => $chash_dir, 'dc' => 'eqiad', 'service' => 'varnish-be', - 'backends' => $cluster_nodes['eqiad'], - 'be_opts' => $be_cache_be_opts, - }, - 'cache_eqiad_random' => { - 'dynamic' => 'yes', - 'type' => 'random', - 'dc' => 'eqiad', - 'service' => 'varnish-be-rand', 'backends' => $cluster_nodes['eqiad'], 'be_opts' => $be_cache_be_opts, }, 'cache_codfw' => { - 'dynamic' => 'yes', - 'type' => $chash_dir, 'dc' => 'codfw', 'service' => 'varnish-be', - 'backends' => $cluster_nodes['codfw'], - 'be_opts' => $be_cache_be_opts, - }, - 'cache_codfw_random' => { - 'dynamic' => 'yes', - 'type' => 'random', - 'dc' => 'codfw', - 'service' => 'varnish-be-rand', 'backends' => $cluster_nodes['codfw'], 'be_opts' => $be_cache_be_opts, }, @@ -73,7 +51,6 @@ } $our_backend_caches = hash_deselect_re("^cache_${::site}", $becaches_filtered) - $be_directors = merge($app_directors, $our_backend_caches) varnish::instance { "${title}-backend": name => '', @@ -85,7 +62,8 @@ runtime_parameters => $be_runtime_params, storage => $be_storage, vcl_config => $be_vcl_config, - directors => $be_directors, + app_directors => $app_directors, + backend_caches => $our_backend_caches, } # lint:ignore:arrow_alignment @@ -99,20 +77,10 @@ runtime_parameters => $fe_runtime_params, storage => "-s malloc,${fe_mem_gb}G", jemalloc_conf => $fe_jemalloc_conf, - directors => { + backend_caches => { 'cache_local' => { - 'dynamic' => 'yes', - 'type' => $chash_dir, 'dc' => $::site, 'service' => 'varnish-be', - 'backends' => $cluster_nodes[$::site], - 'be_opts' => $fe_cache_be_opts, - }, - 'cache_local_random' => { - 'dynamic' => 'yes', - 'type' => 'random', - 'dc' => $::site, - 'service' => 'varnish-be-rand', 'backends' => $cluster_nodes[$::site], 'be_opts' => $fe_cache_be_opts, }, diff --git a/modules/role/manifests/cache/maps.pp b/modules/role/manifests/cache/maps.pp index 2dab52b..90f40eb 100644 --- a/modules/role/manifests/cache/maps.pp +++ b/modules/role/manifests/cache/maps.pp @@ -36,9 +36,7 @@ $apps = hiera('cache::maps::apps') $app_directors = { 'kartotherian' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => $apps['kartotherian']['backends'][$apps['kartotherian']['route']], + 'backend' => $apps['kartotherian']['backends'][$apps['kartotherian']['route']], 'be_opts' => { 'port' => 6533, 'connect_timeout' => '5s', diff --git a/modules/role/manifests/cache/misc.pp b/modules/role/manifests/cache/misc.pp index a7b9229..2b7000b 100644 --- a/modules/role/manifests/cache/misc.pp +++ b/modules/role/manifests/cache/misc.pp @@ -43,16 +43,12 @@ # $app_directors = { 'analytics1027' => { # Hue (Hadoop GUI) - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['analytics1027.eqiad.wmnet'], + 'backend' => 'analytics1027.eqiad.wmnet', 'be_opts' => merge($app_def_be_opts, { 'port' => 8888 }), 'req_host' => 'hue.wikimedia.org', }, 'bromine' => { # ganeti VM for misc. static HTML sites - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['bromine.eqiad.wmnet'], + 'backend' => 'bromine.eqiad.wmnet', 'be_opts' => $app_def_be_opts, 'req_host' => [ 'static-bugzilla.wikimedia.org', @@ -64,16 +60,12 @@ ], }, 'bohrium' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['bohrium.eqiad.wmnet'], + 'backend' => 'bohrium.eqiad.wmnet', 'be_opts' => $app_def_be_opts, 'req_host' => 'piwik.wikimedia.org', }, 'californium' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['californium.wikimedia.org'], + 'backend' => 'californium.wikimedia.org', 'be_opts' => $app_def_be_opts, 'req_host' => [ 'horizon.wikimedia.org', @@ -81,44 +73,32 @@ ], }, 'darmstadtium' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['darmstadtium.eqiad.wmnet'], + 'backend' => 'darmstadtium.eqiad.wmnet', 'be_opts' => merge($app_def_be_opts, {'port' => 81, 'max_connections' => 5}), 'req_host' => 'docker-registry.wikimedia.org', }, 'labtestweb2001' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['labtestweb2001.wikimedia.org'], + 'backend' => 'labtestweb2001.wikimedia.org', 'be_opts' => $app_def_be_opts, 'req_host' => 'labtesthorizon.wikimedia.org', }, 'labtestspice' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['labtestcontrol2001.wikimedia.org'], + 'backend' => 'labtestcontrol2001.wikimedia.org', 'be_opts' => merge($app_def_be_opts, { 'port' => 6082 }), 'req_host' => 'labtestspice.wikimedia.org', }, 'labspice' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['labcontrol1001.wikimedia.org'], + 'backend' => 'labcontrol1001.wikimedia.org', 'be_opts' => merge($app_def_be_opts, { 'port' => 6082 }), 'req_host' => 'labspice.wikimedia.org', }, 'etherpad1001' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['etherpad1001.eqiad.wmnet'], + 'backend' => 'etherpad1001.eqiad.wmnet', 'be_opts' => merge($app_def_be_opts, { 'port' => 9001 }), 'req_host' => 'etherpad.wikimedia.org', }, 'contint1001' => { # CI server - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['contint1001.wikimedia.org' ], + 'backend' => 'contint1001.wikimedia.org', 'be_opts' => $app_def_be_opts, 'req_host' => [ 'doc.wikimedia.org', @@ -126,9 +106,7 @@ ], }, 'graphite1001' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['graphite1001.eqiad.wmnet'], + 'backend' => 'graphite1001.eqiad.wmnet', 'be_opts' => $app_def_be_opts, 'req_host' => [ 'performance.wikimedia.org', @@ -136,9 +114,7 @@ ], }, 'iridium' => { # main phab - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['iridium.eqiad.wmnet'], + 'backend' => 'iridium.eqiad.wmnet', 'be_opts' => $app_def_be_opts, 'req_host' => [ 'phabricator.wikimedia.org', @@ -149,9 +125,7 @@ ], }, 'krypton' => { # ganeti VM for misc. PHP apps - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['krypton.eqiad.wmnet'], + 'backend' => 'krypton.eqiad.wmnet', 'be_opts' => $app_def_be_opts, 'req_host' => [ 'scholarships.wikimedia.org', @@ -162,9 +136,7 @@ ], }, 'labmon1001' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['labmon1001.eqiad.wmnet'], + 'backend' => 'labmon1001.eqiad.wmnet', 'be_opts' => $app_def_be_opts, 'req_host' => [ 'grafana-labs.wikimedia.org', @@ -173,9 +145,7 @@ ], }, 'netmon1001' => { # servermon - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['netmon1001.wikimedia.org'], + 'backend' => 'netmon1001.wikimedia.org', 'be_opts' => $app_def_be_opts, 'req_host' => [ 'servermon.wikimedia.org', @@ -184,9 +154,7 @@ ], }, 'noc' => { # noc.wikimedia.org and dbtree.wikimedia.org - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['terbium.eqiad.wmnet'], + 'backend' => 'terbium.eqiad.wmnet', 'be_opts' => $app_def_be_opts, 'req_host' => [ 'noc.wikimedia.org', @@ -194,45 +162,33 @@ ], }, 'planet1001' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['planet1001.eqiad.wmnet'], + 'backend' => 'planet1001.eqiad.wmnet', 'be_opts' => $app_def_be_opts, 'req_host_re' => '^([^.]+\.)?planet\.wikimedia\.org$' }, 'pybal_config' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['puppetmaster1001.eqiad.wmnet'], + 'backend' => 'puppetmaster1001.eqiad.wmnet', 'be_opts' => $app_def_be_opts, 'req_host' => 'config-master.wikimedia.org', }, 'rcstream' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['rcs1001.eqiad.wmnet'], - # 'backends' => ['rcs1002.eqiad.wmnet'], # manual backup option if 1001 fails + 'backend' => 'rcs1001.eqiad.wmnet', + # 'backend' => 'rcs1002.eqiad.wmnet', # manual backup option if 1001 fails 'be_opts' => merge($app_def_be_opts, { max_connections => 1000 }), 'req_host' => 'stream.wikimedia.org', }, 'ruthenium' => { # parsoid rt test server - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['ruthenium.eqiad.wmnet'], + 'backend' => 'ruthenium.eqiad.wmnet', 'be_opts' => merge($app_def_be_opts, { 'port' => 8001 }), 'req_host' => 'parsoid-tests.wikimedia.org', }, 'rutherfordium' => { # people.wikimedia.org - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['rutherfordium.eqiad.wmnet'], + 'backend' => 'rutherfordium.eqiad.wmnet', 'be_opts' => $app_def_be_opts, 'req_host' => 'people.wikimedia.org', }, 'stat1001' => { # metrics and metrics-api - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['stat1001.eqiad.wmnet'], + 'backend' => 'stat1001.eqiad.wmnet', 'be_opts' => $app_def_be_opts, 'req_host' => [ 'metrics.wikimedia.org', @@ -244,37 +200,27 @@ ], }, 'ununpentium' => { # rt.wikimedia.org - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['ununpentium.wikimedia.org'], + 'backend' => 'ununpentium.wikimedia.org', 'be_opts' => $app_def_be_opts, 'req_host' => 'rt.wikimedia.org', }, 'mendelevium' => { # OTRS - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => ['mendelevium.eqiad.wmnet'], + 'backend' => 'mendelevium.eqiad.wmnet', 'be_opts' => $app_def_be_opts, 'req_host' => 'ticket.wikimedia.org', }, 'logstash_director' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => [ 'kibana.svc.eqiad.wmnet' ], + 'backend' => 'kibana.svc.eqiad.wmnet', 'be_opts' => $app_def_be_opts, 'req_host' => 'logstash.wikimedia.org', }, 'wdqs_director' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => [ 'wdqs.svc.eqiad.wmnet', ], + 'backend' => 'wdqs.svc.eqiad.wmnet', 'be_opts' => $app_def_be_opts, 'req_host' => 'query.wikidata.org', }, 'ores' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => [ 'ores.svc.eqiad.wmnet', ], + 'backend' => 'ores.svc.eqiad.wmnet', 'be_opts' => merge($app_def_be_opts, { 'port' => 8081 }), 'req_host' => 'ores.wikimedia.org', }, diff --git a/modules/role/manifests/cache/text.pp b/modules/role/manifests/cache/text.pp index 165f62b..249c76d 100644 --- a/modules/role/manifests/cache/text.pp +++ b/modules/role/manifests/cache/text.pp @@ -49,51 +49,35 @@ $apps = hiera('cache::text::apps') $app_directors = { 'appservers' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => $apps['appservers']['backends'][$apps['appservers']['route']], + 'backend' => $apps['appservers']['backends'][$apps['appservers']['route']], 'be_opts' => $app_def_be_opts, }, 'api' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => $apps['api']['backends'][$apps['api']['route']], + 'backend' => $apps['api']['backends'][$apps['api']['route']], 'be_opts' => $app_def_be_opts, }, 'rendering' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => $apps['rendering']['backends'][$apps['rendering']['route']], + 'backend' => $apps['rendering']['backends'][$apps['rendering']['route']], 'be_opts' => $app_def_be_opts, }, 'security_audit' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => $apps['security_audit']['backends'][$apps['security_audit']['route']], + 'backend' => $apps['security_audit']['backends'][$apps['security_audit']['route']], 'be_opts' => $app_def_be_opts, }, 'appservers_debug' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => $apps['appservers_debug']['backends'][$apps['appservers_debug']['route']], + 'backend' => $apps['appservers_debug']['backends'][$apps['appservers_debug']['route']], 'be_opts' => merge($app_def_be_opts, { 'max_connections' => 20 }), }, 'restbase_backend' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => $apps['restbase']['backends'][$apps['restbase']['route']], + 'backend' => $apps['restbase']['backends'][$apps['restbase']['route']], 'be_opts' => merge($app_def_be_opts, { 'port' => 7231, 'max_connections' => 5000 }), }, 'cxserver_backend' => { # LEGACY: should be removed eventually - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => $apps['cxserver']['backends'][$apps['cxserver']['route']], + 'backend' => $apps['cxserver']['backends'][$apps['cxserver']['route']], 'be_opts' => merge($app_def_be_opts, { 'port' => 8080 }), }, 'citoid_backend' => { # LEGACY: should be removed eventually - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => $apps['citoid']['backends'][$apps['citoid']['route']], + 'backend' => $apps['citoid']['backends'][$apps['citoid']['route']], 'be_opts' => merge($app_def_be_opts, { 'port' => 1970 }), }, } diff --git a/modules/role/manifests/cache/upload.pp b/modules/role/manifests/cache/upload.pp index 80f722b..79b07d6 100644 --- a/modules/role/manifests/cache/upload.pp +++ b/modules/role/manifests/cache/upload.pp @@ -38,9 +38,7 @@ $apps = hiera('cache::upload::apps') $app_directors = { 'swift' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => $apps['swift']['backends'][$apps['swift']['route']], + 'backend' => $apps['swift']['backends'][$apps['swift']['route']], 'be_opts' => { 'port' => 80, 'connect_timeout' => '5s', @@ -49,9 +47,7 @@ } }, 'swift_thumbs' => { - 'dynamic' => 'no', - 'type' => 'random', - 'backends' => $apps['swift_thumbs']['backends'][$apps['swift_thumbs']['route']], + 'backend' => $apps['swift_thumbs']['backends'][$apps['swift_thumbs']['route']], 'be_opts' => { 'port' => 80, 'connect_timeout' => '5s', diff --git a/modules/varnish/manifests/common/directors.pp b/modules/varnish/manifests/common/directors.pp index f832ec7..b217840 100644 --- a/modules/varnish/manifests/common/directors.pp +++ b/modules/varnish/manifests/common/directors.pp @@ -21,7 +21,7 @@ $group = hiera('cluster', $::cluster) # https://bibwild.wordpress.com/2012/04/12/ruby-hash-select-1-8-7-and-1-9-3-simultaneously-compatible/ - $keyspaces_str = inline_template("<%= Hash[ @directors.select{ |_k, v| v['dynamic'] == 'yes' } ].values.map{ |v| \"#{@conftool_namespace}/#{v['dc']}/#{@group}/#{v['service']}\" }.join('|') %>") + $keyspaces_str = inline_template("<%= @directors.values.map{ |v| \"#{@conftool_namespace}/#{v['dc']}/#{@group}/#{v['service']}\" }.join('|') %>") $keyspaces = sort(unique(split($keyspaces_str, '\|'))) confd::file { "/etc/varnish/directors.${instance}.vcl": ensure => present, diff --git a/modules/varnish/manifests/instance.pp b/modules/varnish/manifests/instance.pp index c05d6b5..a4d21ee 100644 --- a/modules/varnish/manifests/instance.pp +++ b/modules/varnish/manifests/instance.pp @@ -8,7 +8,8 @@ $storage='-s malloc,1G', $jemalloc_conf=undef, $runtime_parameters=[], - $directors={}, + $app_directors={}, + $backend_caches={}, $extra_vcl = [] ) { @@ -28,8 +29,7 @@ $netmapper_dir = '/var/netmapper' - $varnish_directors = $directors - $dynamic_directors = hiera('varnish::dynamic_directors', true) + $dynamic_backend_caches = hiera('varnish::dynamic_backend_caches', true) # Install VCL include files shared by all instances require varnish::common::vcl @@ -39,31 +39,21 @@ before => Service["varnish${instancesuffix}"] } - # Write the dynamic directors configuration, if we need it + # Write the dynamic backend caches configuration, if we need it if $name == '' { $inst = 'backend' } else { $inst = $name } - # lint:ignore:quoted_booleans lint:ignore:double_quoted_strings - if inline_template("<%= @directors.map{|k,v| v['dynamic'] }.include?('yes') %>") == "true" { - $use_dynamic_directors = true - } else { - $use_dynamic_directors = false - } - # lint:endignore - - if $use_dynamic_directors { - varnish::common::directors { $vcl: - instance => $inst, - directors => $directors, - extraopts => $extraopts, - before => [ - File["/etc/varnish/wikimedia_${vcl}.vcl"], - Service["varnish${instancesuffix}"] - ], - } + varnish::common::directors { $vcl: + instance => $inst, + directors => $backend_caches, + extraopts => $extraopts, + before => [ + File["/etc/varnish/wikimedia_${vcl}.vcl"], + Service["varnish${instancesuffix}"] + ], } # Hieradata switch to shut users out of a DC/cluster. T129424 diff --git a/modules/varnish/manifests/wikimedia_vcl.pp b/modules/varnish/manifests/wikimedia_vcl.pp index a5af94d..36a970a 100644 --- a/modules/varnish/manifests/wikimedia_vcl.pp +++ b/modules/varnish/manifests/wikimedia_vcl.pp @@ -1,7 +1,7 @@ define varnish::wikimedia_vcl($varnish_testing, $template_path) { if $varnish_testing { $varnish_include_path = '/usr/share/varnish/tests/' - $dynamic_directors = false + $dynamic_backend_caches = false $netmapper_dir = $varnish_include_path } diff --git a/modules/varnish/templates/vcl/directors.vcl.tpl.erb b/modules/varnish/templates/vcl/directors.vcl.tpl.erb index feadcdf..0a8fc4c 100644 --- a/modules/varnish/templates/vcl/directors.vcl.tpl.erb +++ b/modules/varnish/templates/vcl/directors.vcl.tpl.erb @@ -1,22 +1,12 @@ <% @directors.keys.sort.each do |director_name| -director = @directors[director_name] -if director['dynamic'] == 'yes' -%> -<% if director['type'] == 'vslp' -%> -new <%= director_name %> = vslp.<%= director['type'] %>(); -<% else -%> -new <%= director_name %> = directors.<%= director['type'] %>(); -<% end -%> +director = @directors[director_name] -%> +new <%= director_name %> = vslp.vslp(); +new <%= director_name %>_random = directors.random(); <%- keyspace = "#{@conftool_namespace}/#{director['dc']}/#{@group}/#{director['service']}" -%> {{range $node := ls "<%= keyspace %>/"}}{{ $key := printf "<%= keyspace %>/%s" $node }}{{ $data := json (getv $key) }}{{ if eq $data.pooled "yes"}} - <% if director['type'] == 'vslp' -%> <%= director_name %>.add_backend(be_{{ $parts := split $node "." }}{{ join $parts "_" }}); - <% else -%> - <%= director_name %>.add_backend(be_{{ $parts := split $node "." }}{{ join $parts "_" }}, {{ $data.weight }}); - <% end -%> + <%= director_name %>_random.add_backend(be_{{ $parts := split $node "." }}{{ join $parts "_" }}, {{ $data.weight }}); {{end}}{{end}} -<% if director['type'] == 'vslp' -%> <%= director_name %>.init_hashcircle(150); -<% end -%> -<% end # if director['dynamic'] == 'yes' %> <% end # directors loop %> diff --git a/modules/varnish/templates/vcl/wikimedia-common.inc.vcl.erb b/modules/varnish/templates/vcl/wikimedia-common.inc.vcl.erb index a61ede5..44d48cb 100644 --- a/modules/varnish/templates/vcl/wikimedia-common.inc.vcl.erb +++ b/modules/varnish/templates/vcl/wikimedia-common.inc.vcl.erb @@ -64,21 +64,31 @@ } <% -# Directors / Backends - -# Expected directors data format: -# @varnish_directors = { -# 'director name' => { -# 'dynamic' => 'yes', # or 'no', required -# 'type' => 'vslp', # required -# 'dc' => 'eqiad', # required if dynamic==yes -# 'service' => 'foo', # required if dynamic==yes -# 'backends' => [ "backend1", "backend2" ], # required: array or single value -# 'be_opts' => { # every option but 'probe' and 'between_bytes_timeout' is required! +# backend_caches and app_directors (two different kinds of backend!) +# refactoring here is a W-I-P +# +# Expected data format: +# @backend_caches = { # always defined +# 'cache_eqiad' => { +# 'dc' => 'eqiad', +# 'service' => 'foo', +# 'backends' => [ "backend1", "backend2" ], # required: array +# 'be_opts' => { # every option is required! # 'port' = 80, # 'connect_timeout' = '2s', # 'first_byte_timeout' = '4s', -# 'between_bytes_timeout' = '4s', +# 'max_connections' = 100, # per-backend! +# }, +# }, +# } +# +# @app_directors = { # not always defined (e.g. frontends, for now) +# 'foo' => { +# 'backend' => "foo.svc.eqiad.wmnet", # required service hostname +# 'be_opts' => { # every option is required! +# 'port' = 80, +# 'connect_timeout' = '2s', +# 'first_byte_timeout' = '4s', # 'max_connections' = 100, # per-backend! # }, # }, @@ -90,57 +100,69 @@ # we have no cases where this is necessary! (whereas we do have cases of # duplicate backend hosts where the options are always identical, for # vslp-vs-random cache backends) -# +%> -# Puppet-generated the Backend host definitions, regardless of 'dynamic' +<% if not @varnish_testing -%> -be_seen = {} -@varnish_directors.keys.sort.each do |director_name| - director = @varnish_directors[director_name] +# Generated list of cache backend hosts for director consumption + +<% +becache_seen = {} +@backend_caches.keys.sort.each do |director_name| + director = @backend_caches[director_name] be_opts = director['be_opts'] [*director['backends']].each do |backend| - next if be_seen.key?(backend) - be_seen[backend] = 1 + next if becache_seen.key?(backend) + becache_seen[backend] = 1 name = 'be_' + backend.gsub(/[-.]/, '_') -%> -<% if not @varnish_testing -%> backend <%= name %> { .host = "<%= backend %>"; .port = "<%= be_opts['port'] %>"; .connect_timeout = <%= be_opts['connect_timeout'] %>; .first_byte_timeout = <%= be_opts['first_byte_timeout'] %>; -<% if be_opts.key?('between_bytes_timeout') -%> - .between_bytes_timeout = <%= be_opts['between_bytes_timeout'] %>; -<% end -%> .max_connections = <%= be_opts['max_connections'] %>; -<% if be_opts.key?('probe') -%> - .probe = <%= be_opts['probe'] %>; -<% end -%> + .probe = varnish; } -<% end -%> <% end # backend loop -%> <% end # director loop -%> -sub wm_common_directors_init { -<% if @use_dynamic_directors and @dynamic_directors -%> -include "directors.<%= @inst %>.vcl"; -<% end -%> +# Generated list of applayer backend hosts for director consumption -<% @varnish_directors.keys.sort.each do |director_name| -director = @varnish_directors[director_name] -if (!@dynamic_directors or director['dynamic'] != 'yes') - backends = [*director['backends']] - if (!backends.empty?) +<% +apphost_seen = {} +@app_directors.keys.sort.each do |director_name| + director = @app_directors[director_name] + be_opts = director['be_opts'] + backend = director['backend'] + next if apphost_seen.key?(backend) + apphost_seen[backend] = 1 + name = 'be_' + backend.gsub(/[-.]/, '_') -%> -<% if director['type'] == 'vslp' -%> -// Yes, the vslp director gets instantiated with vslp.vslp() instead of -// directors.vslp(). Nobody said this would have been pretty. -new <%= director_name %> = vslp.<%= director['type'] %>(); + +backend <%= name %> { + .host = "<%= backend %>"; + .port = "<%= be_opts['port'] %>"; + .connect_timeout = <%= be_opts['connect_timeout'] %>; + .first_byte_timeout = <%= be_opts['first_byte_timeout'] %>; + .max_connections = <%= be_opts['max_connections'] %>; +} + +<% end # app_directors loop -%> + +<% end # !varnish_testing -%> + +sub wm_common_directors_init { +<% if @dynamic_backend_caches -%> +include "directors.<%= @inst %>.vcl"; <% else -%> -new <%= director_name %> = directors.<%= director['type'] %>(); -<% end %> +<% @backend_caches.keys.sort.each do |director_name| +director = @backend_caches[director_name] +backends = director['backends'] -%> + new <%= director_name %> = vslp.vslp(); + new <%= director_name %>_random = directors.random(); <% backends.each do |backend| name = 'be_' + backend.gsub(/[-.]/, '_') @@ -151,23 +173,28 @@ name = "vtc_backend"; end -%> - <% if director['type'] == 'vslp' -%> - # VSLP has no per-backend weighting. We might want to add it as a - # functionality to the vmod. - # See https://phabricator.wikimedia.org/T126206 - <%= director_name %>.add_backend(<%= name %>); - <% else -%> - <%= director_name %>.add_backend(<%= name %>, 100); - <% end -%> + <%= director_name %>.add_backend(<%= name %>); + <%= director_name %>_random.add_backend(<%= name %>, 100); <% end #backends loop -%> -<% if director['type'] == 'vslp' -%> - # We should think about this value, probably setting it in a - # backend-count-sensitive manner. <%= director_name %>.init_hashcircle(150); -<% end -%> -<% end #if !empty -%> -<% end #if !dynamic -%> <% end #director loop -%> + +<% end #dynamic_backend_caches -%> + +<% @app_directors.keys.sort.each do |director_name| +director = @app_directors[director_name] +backend = director['backend'] +if @varnish_testing + name = "vtc_backend"; +else + name = 'be_' + backend.gsub(/[-.]/, '_') +end +-%> + new <%= director_name %> = directors.random(); + + <%= director_name %>.add_backend(<%= name %>, 100); +<% end # app_directors loop -%> + } # end wm_common_directors_init # Functions -- To view, visit https://gerrit.wikimedia.org/r/324942 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I8053dcf318cb31576d16b4360c8a4836ca9ef11e Gerrit-PatchSet: 14 Gerrit-Project: operations/puppet Gerrit-Branch: production Gerrit-Owner: BBlack <bbl...@wikimedia.org> Gerrit-Reviewer: BBlack <bbl...@wikimedia.org> Gerrit-Reviewer: Ema <e...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits