Невозможно использовать директор Varni sh в другом режиссере - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь вложить sh директоров Varni, но он не работает в 4.1.10 или 6.4, несмотря на то, что упоминается в нескольких местах.

У меня два случайных директора, и я хочу их добавить к резервному директору, например:

vcl 4.0;

import directors;
backend alpha { .host = "192.168.0.101"; }
backend bravo { .host = "192.168.0.102"; }

sub vcl_init {
    new primary_director = directors.random();
    primary_director.add_backend(alpha, 1.0);

    new secondary_director = directors.random();
    secondary_director.add_backend(bravo, 1.0);

    new fallback_director = directors.fallback();
    fallback_director.add_backend(primary_director);
    fallback_director.add_backend(secondary_director);
}

Официальная документация поддерживает этот случай:

Обратите внимание, что директора могут использовать других директоров в качестве бэкэндов

Есть идеи, что я здесь делаю не так?

Вы можете проверить это самостоятельно, сохранив фрагмент выше как /tmp/test.vcl и запустив varni sh в Docker:

$ docker run -v /tmp/test.vcl:/test.vcl --rm varnish:6.4 varnishd -F -f /test.vcl
Error:
Message from VCC-compiler:
Expression has type INSTANCE, expected BACKEND
('/test.vcl' Line 15 Pos 35) -- (Pos 50)
    fallback_director.add_backend(primary_director);
----------------------------------################--

Expected argument: BACKEND (unnamed argument)

While compiling function call:

('/test.vcl' Line 15 Pos 5) -- (Pos 50)
    fallback_director.add_backend(primary_director);
----##############################################--

Running VCC-compiler failed, exited with 2
VCL compilation failed

1 Ответ

2 голосов
/ 14 июля 2020

Большое спасибо людям на доске Varni sh IR C - они быстро дали мне ответ!

Вот исправленная версия моего примера:

vcl 4.0;

import directors;
backend alpha { .host = "192.168.0.101"; }
backend bravo { .host = "192.168.0.102"; }

sub vcl_init {
    new primary_director = directors.random();
    primary_director.add_backend(alpha, 1.0);

    new secondary_director = directors.random();
    secondary_director.add_backend(bravo, 1.0);

    new fallback_director = directors.fallback();
    fallback_director.add_backend(primary_director.backend());
    fallback_director.add_backend(secondary_director.backend());
}

sub vcl_recv {
    set req.backend_hint = fallback_director.backend();
}

Ключевые моменты здесь:

  1. Правильный синтаксис: fallback_director.add_backend(primary_director.backend());
  2. Без set req.backend_hint = fallback_director.backend(); Varni sh будет использовать первый заданный бэкэнд.
...