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
timestamptz
をArrow::Timestamp
型にマップしてるのにエラーがでる件に関しては
5fa3f9e8628152265148c340c7bb18cab2df0978
で対処したのですが、無限ループ状態に関しては
こちらで再現できませんでした。
すいませんが、make clean && make -j 12 && make install
した後で試してもらえますか?
確認したところ再現しませんでした。ひとまず、クローズいたします。