heterodb/pg-strom

arrow_fdw: timestmaptz型を含むテーブルの場合の異常

Closed this issue · 6 comments

timestamptz型のカラムを含むテーブルを生成してarrowファイルとして出力後、CREATE FOREGIN TABLEにてテーブル定義し、当該テーブルにWHERE句を含むSELECTを実行すると、サーバプロセスが無限ループ状態となり応答しなくなる。(サーバ、クライアントともにメッセージ出力無し。

全体クエリ

DROP TABLE IF EXISTS timezone_data;
DROP FOREIGN TABLE IF EXISTS timezone_arrow;
CREATE TABLE timezone_data (
  id     int,
  ts     timestamptz
);
INSERT INTO timezone_data (
  SELECT x, pgstrom.random_timestamp(1, '2020-02-11 12:00:00',
                                        '2020-02-13 12:00:00')
    FROM generate_series(1,1500) x);

\! ../arrow-tools/pg2arrow -d postgres -c 'SELECT * FROM timezone_data' -o /tmp/timezone_data.arrow

IMPORT FOREIGN SCHEMA timezone_arrow
  FROM SERVER arrow_fdw
  INTO public
OPTIONS (file '/tmp/timezone_data.arrow');

SET arrow_fdw.enabled = off;
SELECT * FROM timezone_arrow WHERE id > 100;

WHERE句を指定しないSELECT文は実行可能。また、その後にWHERE句を指定したSELECT文を実行すると、以下エラーメッセージが出力される。

SELECT * FROM timezone_arrow;                 -- 実行可能
SELECT * FROM timezone_arrow WHERE id > 100;    -- エラーメッセージ発生

エラーメッセージ

ERROR:  xpu_timelib.cu:711  xpu_timestamptz_t cannot be mapped on any Arrow type
HINT:  device at GPU-0, function at xpu_timestamptz_datum_arrow_read

これ v5.0 にした時のエンバグかなぁ…。
ArrowのTimestamp (with Timezone) も内部表現は UTC Epoch が起点なので、特に問題なっしんぐなハズなのですが。

WHERE句の有無は、GpuScanに移るかどうかに関わってるハズですので、無限ループ状態もGPU側でしょうか。
ちと調べてみます。

無限ループ状態もGPU側でしょうか。

はい、GpuScan時に無限ループ発生しています。CPU時は発生していません。

(自分メモ)
無限ループは一度だけ再現するも、その後、再現できず。

その時のバックトレースを見ると、メタデータキャッシュをぐるぐる回ってるぽいんですけどね

(gdb) bt
#0  0x00007f5c86ef84c1 in lookupArrowMetadataCache (stat_buf=stat_buf@entry=0x29a6c80,
    has_exclusive=has_exclusive@entry=true) at arrow_fdw.c:526
#1  0x00007f5c86efa97f in BuildArrowFileState (
    filename=0x29a6a20 "/tmp/timezone_data.arrow", p_stat_attrs=<optimized out>,
    frel=<optimized out>, frel=<optimized out>) at arrow_fdw.c:1949
#2  0x00007f5c86efb29c in ArrowGetForeignRelSize (root=0x29a58d0, baserel=0x285bb88,
    foreigntableid=<optimized out>) at arrow_fdw.c:2599
#3  0x000000000081dd11 in set_foreign_size (root=0x29a58d0, rel=0x285bb88, rte=0x285ba18)
    at allpaths.c:930
#4  0x000000000081d3cb in set_rel_size (root=0x29a58d0, rel=0x285bb88, rti=1,
    rte=0x285ba18) at allpaths.c:414
    :
    :
(gdb) l
521             hindex = arrowMetadataHashIndex(stat_buf);
522             dlist_foreach(iter, &arrow_metadata_cache->hash_slots[hindex])
523             {
524                     mcache = dlist_container(arrowMetadataCache, chain, iter.cur);
525
526                     if (stat_buf->st_dev == mcache->stat_buf.st_dev &&
527                             stat_buf->st_ino == mcache->stat_buf.st_ino)
528                     {
529                             /*
530                              * Is the metadata cache still valid?
(gdb)

これは特に実害無いハズなので、timestamptzにArrow::Timestampをマップする方向で。

ERROR:  xpu_timelib.cu:711  xpu_timestamptz_t cannot be mapped on any Arrow type
HINT:  device at GPU-0, function at xpu_timestamptz_datum_arrow_read

timestamptzArrow::Timestamp型にマップしてるのにエラーがでる件に関しては
5fa3f9e8628152265148c340c7bb18cab2df0978 で対処したのですが、無限ループ状態に関しては
こちらで再現できませんでした。

すいませんが、make clean && make -j 12 && make install した後で試してもらえますか?

確認したところ再現しませんでした。ひとまず、クローズいたします。