[groonga-dev,04360] [ANN] Groonga 7.0.2

Back to archive index

Kentaro Hayashi hayas****@clear*****
2017年 4月 29日 (土) 14:40:09 JST


林です。

今日は肉の日ですね。

Groonga 7.0.2をリリースしました!

  http://groonga.org/ja/blog/2017/04/29/groonga-7.0.2.html

今回のリリースでは、特定条件下でreindexを実行するとデータを失ってしま
う不具合が修正されているのでアップグレードをおすすめします。

細かな変更点についてはニュースをご確認下さい。

  http://groonga.org/ja/docs/news.html#release-7-0-2

# 変更内容

主な変更点は以下の通りです。

  * reindexコマンドの実行によりデータが失われてしまう不具合を修正しました
  * Ubuntu 17.04 (Zesty Zapus)をサポートしました
  * 永続キャッシュをサポートしました
  * 既存のテーブルを条件のパターンとして指定できるようになりました

## reindexコマンドの実行によりデータが失われてしまう不具合を修正しました

今回のリリースでは、特定の条件下でreindexコマンドを使うとデータが失わ
れてしまう不具合を修正しました。そのためアップグレードをおすすめします。

インデックスだけが壊れてしまった場合、reindexを使って復旧することがで
きます。しかし、今回見つかった不具合の発生条件を満たすと、無事だったデー
タを消してしまいます。

この不具合は、reindexコマンドが追加されたGroonga 5.1.0からの潜在的な不
具合でした。

テーブルにデータカラムがなくインデックスカラムのみある場合、そのテーブ
ルは語彙表として使っていると判断し、テーブルのキーを全部消してから作り
直すようにしていましたが、そのせいでデータを消してしまっていました。

例えば次のような例でデータが消えてしまっていました。

  > table_create User TABLE_HASH_KEY ShortText
  [[0,1490948112.512871,0.004843950271606445],true]
  > table_create Comment TABLE_NO_KEY
  [[0,1490948112.517823,0.004474639892578125],true]
  > column_create Comment user COLUMN_SCALAR User
  [[0,1490948112.522444,0.00609898567199707],true]
  > column_create User comment COLUMN_INDEX Comment user
  [[0,1490948112.528664,0.009341239929199219],true]
  > load --table Comment
  > [
  > {"user":"Mike"}
  > ]
  [[0,1490948112.538067,0.0004284381866455078],1]

  > select User
  [[0,1490948112.538533,0.0002899169921875],
    [[[1],[["_id","UInt32"],["_key","ShortText"],["comment","UInt32"]],[1,"Mike",1]]]]
  > select Comment
  [[0,1490948112.53886,4.744529724121094e-05],
    [[[1],[["_id","UInt32"],["user","User"]],[1,"Mike"]]]]

  > reindex
  [[0,1490948112.538933,0.02556586265563965],true]

  > select User
  [[0,1490948112.564538,5.91278076171875e-05],
    [[[0],[["_id","UInt32"],["_key","ShortText"],["comment","UInt32"]]]]]
  > select Comment
  [[0,1490948112.564621,3.457069396972656e-05],
    [[[1],[["_id","UInt32"],["user","User"]],[1,""]]]]

reindexした後の User テーブルと Comment テーブルのデータが失われていることがわかります。

## Ubuntu 17.04 (Zesty Zapus)をサポートしました

今回のリリースでは、今月リリースされたUbuntu 17.04 (Zesty Zapus)をサポー
トしました。 PPA経由でインストールできます。

また、Ubuntu 12.04は4/28にEOLとなったため、サポートをやめています。

## 永続キャッシュをサポートしました

今回のリリースでは、永続キャッシュと呼ばれる仕組みをサポートしました。

GroongaのキャッシュはGroongaを終了すると消えてしまいます。再び起動しな
おした場合、再度キャッシュを作り直すまでにはタイムラグが発生します。
永続キャッシュを使うと、そのタイムラグを短縮することができます。

### groongaコマンドの場合

groongaコマンド実行時に --cache-base-path オプションを指定します。

このオプションには永続キャッシュを保存するパスを指定します。例え
ば、--cache-base-path=/dev/shm/groonga-cache を指定すると、 /dev/shm
直下に永続キャッシュファイルができます。この例だと次の2つのファイルが
作成されます。

  * /dev/shm/groonga-cache.keys
  * /dev/shm/groonga-cache.values

### groonga-httpdの場合

groonga-httpdの設定ファイル(/etc/groonga/groonga-httpd.conf)に以下の設
定を追加します。

  http {
    ...
    groonga_cache_base_path /dev/shm/groonga-httpd-cache;
    ...
  }

serverやlocationディレティブごとに指定することもできます。ここで指定し
た永続キャッシュはワーカー間で共通です。従来のキャッシュの場合には、ワー
カー毎にキャッシュを保持していました。永続キャッシュでは共通なので、あ
るワーカーではキャッシュされていたので速いけど、ほかのワーカーではキャッ
シュされていなかったので遅い、というようなことが起きなくなります。また、
キャッシュ数の設定をワーカー毎にしなくてすむようになります。

### 注意事項について

* メモリーファイルシステム上のパス(例:/dev/shm/xxxx)を必ず指定してくだ
  さい。ハードディスクなどディスクIOが遅い場合には、永続キャッシュを使
  用しても、その読み込みに時間がかかってしまうため、キャッシュを永続化
  する利点が薄れてしまいます。

* 永続キャッシュにおいて、キャッシュ数の制御がまだ行えません。
  cache_limitは従来のキャッシュのみサポートしています。永続キャッシュ
  のデフォルト設定値は100です。

* 永続キャッシュを開けない場合は自動的に再作成するので問題ありませんが、
  クラッシュした場合はキャッシュファイルを削除してください。

## 既存のテーブルを条件のパターンとして指定できるようになりました

今回のリリースでは、既存のテーブルを条件のパターンとして指定するための
in_records をサポートしました。 in_records を使うと複数のクエリーを1つ
のクエリーへとまとめることができるかもしれません。 これは、既存のテー
ブル内の各レコードがそれぞれ条件のパターンになる(複数の条件を指定でき
る)からです。

例えば、ログから特定のパターンのレコードを抽出することを考えてみましょ
う。 ログには、ユーザーとそれに紐づくタグ、時刻が記録されているとしま
す。 サンプルとなるスキーマとデータは以下を使うことにします。

  table_create users table_hash_key shorttext
  table_create tags table_hash_key shorttext

  table_create reports table_no_key
  column_create reports user column_scalar users
  column_create reports tag column_scalar tags
  column_create reports day column_scalar time

  table_create logs table_no_key
  column_create logs user column_scalar users
  column_create logs tag column_scalar tags
  column_create logs time column_scalar time

  load --table reports
  [
  {"user": "alice", "tag": "tag1", "day": "2017-04-18 00:00:00"},
  {"user": "alice", "tag": "tag1", "day": "2017-04-19 00:00:00"},
  {"user": "david", "tag": "tag2", "day": "2017-04-20 00:00:00"},
  {"user": "david", "tag": "tag3", "day": "2017-04-21 00:00:00"}
  ]

  load --table logs
  [
  {"user": "alice", "tag": "tag1", "time": "2017-04-18 11:22:33"},
  {"user": "alice", "tag": "tag1", "time": "2017-04-20 11:22:33"},
  {"user": "bob",   "tag": "tag1", "time": "2017-04-19 11:22:33"},
  {"user": "david", "tag": "tag1", "time": "2017-04-19 11:22:33"},
  {"user": "david", "tag": "tag2", "time": "2017-04-20 11:22:33"}
  ]

logs がログを記録しているテーブルです。特定のログに tag がつけられてい
ます。 特定のユーザーとタグがつけられているある日のログのみを抽出した
い、というのを実現しようとすると、クエリはどんどん複雑になっていきます。
けれども今回追加された in_records を使うと条件のパターンを既存のテーブ
ルへとまとめることができるのでクエリーを1つにすることができます。

  select logs \
    --filter 'in_records(reports, \
                         user, "==", "user", \
                         tag, "==", "tag", \
                         time_classify_day(time), "==", "day")'

上記の例では条件のパターンを reports に保存された4つのレコードで表現し
ています。 サンプルでは reports テーブルしか使っていませんが、ここに指
定しているテーブルを替えるだけで、条件のパターンのバリエーションを簡単
に切り替えることもできます。


以下は今回のリリースの変更点です。

## 改良

* [logical_select]
  drilldowns[${LABEL}].columns[${NAME}].window.sort_keys と
  drilldowns[${LABEL}].columns[${NAME}].window.group_keys で複数のキー
  を指定できるようになりました。

* [Windows] バンドルしているLZ4を1.7.5に更新しました。

* [cache] 永続化キャッシュをサポートしました。

* [log_level] 英語のドキュメントを更新しました。

* 以下のAPIを公開しました。

  * grn_set_default_cache_base_path()
  * grn_get_default_cache_base_path()
  * grn_persistent_cache_open()
  * grn_cache_default_open()

* [groonga --cache-base-path] 永続キャッシュを使うための新しいオプショ
  ンを追加しました。

* [groonga-httpd] [groonga_cache_base_path] 永続キャッシュを使うための
  新しい設定を追加しました。

* [Windows] バンドルしているmsgpackを2.1.1に更新しました。

* [object_inspect] カラム情報を表示するだけでなく、インデックスカラム
  の統計情報も表示できるようにしました。

* 正規表現の「 .* 」というパターンでインデックスを使って検索できるよう
  になりました。 この機能はデフォルトで有効です。環境変数に
  GRN_SCAN_INFO_REGEXP_DOT_ASTERISK_ENABLE=no を設定すると無効化できま
  す。

* [in_records] 既存のテーブルを条件のパターンを指定するのに使うことの
  できる関数を追加しました。

* [Ubuntu] EOLのため、Ubuntu 12.04のサポートをやめました。

## 修正

* [logical_select] 異なるキャッシュが使われてしまう不具合を修正しまし
  た。この問題は動的カラムを使っているときに発生していました。

* [logical_select] 動的カラムが作成されない不具合を修正しました。レコー
  ドにマッチしない場合に発生していました。

* [reindex] reindexコマンドの実行によりデータが失われてしまう不具合を
  修正しました。

* [httpd] 別のユーザーでワーカーを動かしている時、 quit と shutdown の
  レスポンスが壊れている問題を修正しました。 [GitHub
  ranguba/groonga-client#12]


--
Kentaro Hayashi <hayas****@clear*****>
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: 無し
型:         application/pgp-signature
サイズ:     833 バイト
説明:       無し
下載 



groonga-dev メーリングリストの案内
Back to archive index