10月 182014
 

Varnish4.0.2がリリースされました。
多くのバグフィックスと機能追加・改善・修正、ドキュメント改善などを含むためバージョンアップを強く薦めます。
ちなみにvarnishstatのヒットレート表示も復活しています。

Changes
ダウンロード

変更内容から幾つか抜粋して紹介します。


バグフィックス

ESIのメモリリークを修正

deliver時に競合状態陥る可能性があるバグを修正
チケット報告はされていないのできわめて稀なケースだとは思います。

再利用を行う変数の初期化不足で落ちるケースがあるのを修正しました(#1553)

purge時にworkspaceを使いきって落ちるのを修正しました(#1551)

varnishtopで正しくグループ化されないのを修正しました(#1591)

VMOD_ABIのバージョン要件が4.0.1で緩和されたはずなのにされていなかったのを修正しました(#1538)

varnishncsaでHTTPでない壊れたリクエストが来た場合に出力しないようにしました(#1584)

max-ageとageが存在する場合でTTL計算時にageが二重で効いていたのを修正しました(#1578)
例えばmax-ageが10でageが2だった場合、期待されるttlは8ですがageが二重で効いて6になってました。

director.hashでバックエンドを取得する際に存在しない変数を指定すると落ちるのを修正しました(#1568)
hashディレクターで取得する際にreq.http.cookieのようにリクエストによっては存在しないものを指定すると落ちましたがそれを修正。

vcl_backend_responseからretryするとbereqの変更内容が消えるのを修正しました(#1512)
この修正と一緒にbackendスレッドでロールバックを行うと落ちる問題も修正されました。

リクエストのbodyを読みきれなかった場合で落ちるケースが有るのを修正しました(#1562)

shm_reclenを増やすと落ちるケースが有るのを修正しました(#1547)

random/hashディレクターでsickなbackendにリクエストを投げるケースがあるのを修正しました(#1575)

varnishtest実行時にバッファ不足でassertが出るのを改善しました
varnishtestのログのバッファサイズは256KB持っているのですが
出力されるログが多すぎると以下の様なエラーがでるので512KBまで拡張しました。


パラメータ追加・変更

追加:group_cc
vclをコンパイルする際に利用するcc_commandを実行するグループを指定できます。

名前変更:vsl_reclen(旧名shm_reclen)
まだshm_reclenは残っていますがそのうち消えると思うので使っている場合は変えましょう。

値変更:workspace_client
最小値が3KBから9KBに増えました。


機能追加・改善・修正

vmod_std:querysortでのキー数制限(32)がなくなりました
workspaceを使うようになっていますのですごく大きなキーを変更する可能性がある場合は大きめにすると良いです。

vclにHTTP型が追加されました
reqやbereqなどをまるごとvmodに渡すようなことが出来るようになりました。

vmodにBYTES型が追加されました
もともとvclではあったBYTESですが、型変換無しでvmodに渡せるようになりました。

rollbackがstd.rollbackに移動しました
rollbackは非推奨になります。

vcl_deliverでsynthが使えるようになりました

varnishstatのhitrate表示が復活しました
よかった・・・

組み込みのエラーページがvalid HTML5になりました

server.(hostname|identity)がすべてのファンクションで使えるようになりました
4.0.1まではclientスレッドのファンクションでしか使えませんでした。

vmod_std:文字列検索をするstrstrが追加
使い方は通常のstrstrと同じです。
大文字小文字は区別されますので必要に応じてstd.tolowerを使うなどで揃えると良いです。


//STRING strstr([検索対象文字列], [検索文字列])

//req.url中に/admin/が含まれているかをチェック
if(std.strstr(req.url, "/admin/")){
  //found
  ...
}else{
  //notfound
  ...
}

varnishlog:-kオプションが復活
指定個数のトランザクションを表示したらexitするオプションです

varnishadm:vcl.showでincludeされているすべてが表示できる-vオプションが追加
varnishadmで現在loadされているvclのリストを出力するvcl.showというコマンドがあるのですが
一つ困ったところにinclude先が表示されないという問題がありました。
しかし今回サポートされた-vオプションでその名前でloadされているvclの全情報(builtin.vcl含む)が表示されるようになりました。


[root@cache01 ~]# varnishadm vcl.show -v boot

// VCL.SHOW 0 110 input
vcl 4.0;
import std;
import directors;
include "/etc/varnish/backend.vcl";
include "/etc/varnish/main.vcl";

// VCL.SHOW 1 5479 Builtin
...中略...

// VCL.SHOW 2 1180 /etc/varnish/backend.vcl
probe healthcheck {
...中略...

// VCL.SHOW 3 3179 /etc/varnish/main.vcl
sub vcl_synth{
...中略...

といった感じです。
コメントのVCL.SHOWは以下の情報を示します
// VCL.SHOW [srcbodyのインデックス番号] [文字列長] [srcname]
まずVCLはDSLで実行前にCのコードに変換されるのですが、その際にVCL_confという構造体に各種の情報が突っ込まれていてインデックス番号とsrcnameはそこの情報になります。


varnishd -d -f /etc/varnish/default.vcl -C
の出力から抜粋
const char *srcname[4] = {
        "input",
        "Builtin",
        "/etc/varnish/backend.vcl",
        "/etc/varnish/main.vcl",
};
const char *srcbody[4] = {
    /* "input"*/
        "vcl 4.0;\n"
        "import std;\n"
...
        "",
    /* "Builtin"*/
        "/*-\n"
        " * Copyright (c) 2006 Verdens Gang AS\n"
...
        "}\n"
        "",
    /* "/etc/varnish/backend.vcl"*/
        "probe healthcheck {\n"
...
        "",
    /* "/etc/varnish/main.vcl"*/
        "sub vcl_synth{\n"
...
        "",
};
...
const struct VCL_conf VCL_conf = {
        .magic = VCL_CONF_MAGIC,
        .init_vcl = VGC_Init,
        .fini_vcl = VGC_Fini,
        .ndirector = 9,
        .director = directors,
        .ref = VGC_ref,
        .nref = VGC_NREFS,
        .nsrc = 4,★VCLの個数
        .srcname = srcname,★名前(inputはルートのVCL、builtinはVarnishのデフォルトの動作を定義したもの、ファイルパスのものはincludeしたもの)
        .srcbody = srcbody,★VCLそのもの
        .recv_func = VGC_function_vcl_recv,
        .pipe_func = VGC_function_vcl_pipe,
        .pass_func = VGC_function_vcl_pass,
        .hash_func = VGC_function_vcl_hash,
        .purge_func = VGC_function_vcl_purge,
        .miss_func = VGC_function_vcl_miss,
        .hit_func = VGC_function_vcl_hit,
        .deliver_func = VGC_function_vcl_deliver,
        .synth_func = VGC_function_vcl_synth,
        .backend_fetch_func = VGC_function_vcl_backend_fetch,
        .backend_response_func = VGC_function_vcl_backend_response,
        .backend_error_func = VGC_function_vcl_backend_error,
        .init_func = VGC_function_vcl_init,
        .fini_func = VGC_function_vcl_fini,
};


直近のVDDによると次は4.1でが予定されていて速くて年内に出る可能性があります。