GPU Cache: max_row_num=5000に4000行INSERTしたらcorrupted発生
Closed this issue · 7 comments
max_row_num=5000に設定したGPUキャッシュ有効化テーブルに4000行挿入した場合corrputed発生しない想定なのですが
corrupted発生し、続けて"unable to wrie output GpuCache Log"が多発しております。
CREATE TABLE cache_corruption_test (
id int,
a int1,
b int2,
c int4,
d int8,
e float2,
f float4,
g float8,
h text,
i varchar(32),
j char(32)
);
CREATE TRIGGER row_sync_corruption AFTER INSERT OR UPDATE OR DELETE ON cache_corruption_test FOR ROW
EXECUTE FUNCTION pgstrom.gpucache_sync_trigger('gpu_device_id=0,max_num_rows=5000,redo_buffer_size=150m,gpu_sync_threshold=10m,gpu_sync_interval=4');
ALTER TABLE cache_corruption_test ENABLE ALWAYS TRIGGER row_sync_corruption;
-- INSERT 4000 rows ( < max: 5000 rows )
INSERT INTO cache_corruption_test (
SELECT x
,pgstrom.random_int(1,-128,127) -- a int1
,pgstrom.random_int(1,-32768,32767) -- b int2
,pgstrom.random_int(1,-2147483648,2147483647) -- c int4
,pgstrom.random_int(1,-9223372036854775808,9223372036854775807) -- d int8
,pgstrom.random_float(0.5, -32000, 32000) -- e float2
,pgstrom.random_float(0.5, -32000, 32000) -- f float4
,pgstrom.random_float(0.5, -32000, 32000) -- f float8
,LEFT(MD5((x%479)::TEXT),(x%32+1)::INTEGER) -- h text
,LEFT(MD5((x%479+1)::TEXT),(x%32+1)::INTEGER) -- i text
,LEFT(MD5((x%479+2)::TEXT),(x%32+1)::INTEGER) -- j text
FROM generate_series(1,4000) x
);
メッセージ
WARNING: gpucache: rowid exceeds max_num_rows (5000), so it is now switched to 'corrupted' state
WARNING: Bug? unable to write out GpuCache Log
WARNING: Bug? unable to write out GpuCache Log
<以降WARNINGが連発>
空っぽのテーブルに 4000 行Insertするだけなら4000しかRowIdを消費しないハズです。
Updateでは一時的に更新前/更新後が混在するので、それ以上のRowIdを使う事はありますが。
3cd806bb56d91802ca7a94ce983c68ff7c3fa27c
以降のコミットで試してもらえませんか?
それ以前だとInitial-Loadingで4000行追加した後、AFTER-ROWトリガで4000行追加する事になるので、
確かに rowid が枯渇してもおかしくないです。
手元環境(最新版)では再現せず、でした。
ご対応ありがとうございます。再現しないことを確認しました。
一方で、意図的にcorruptedを発生させたところWARNING: Bug? unable to write out GpuCache Log
が多発する現象は変わりませんでした。あまり好ましくないように感じるのですがいかがでしょうか?
発生させる方法:
CREATE TABLE cache_corruption_test (
id int,
a int1,
b int2,
c int4,
d int8,
e float2,
f float4,
g float8,
h text,
i varchar(32),
j char(32)
);
CREATE TRIGGER row_sync_corruption AFTER INSERT OR UPDATE OR DELETE ON cache_corruption_test FOR ROW
EXECUTE FUNCTION pgstrom.gpucache_sync_trigger('gpu_device_id=0,max_num_rows=5000,redo_buffer_size=150m,gpu_sync_threshold=10m,gpu_sync_interval=4');
ALTER TABLE cache_corruption_test ENABLE ALWAYS TRIGGER row_sync_corruption;
-- INSERT 4000 rows ( < max: 5000 rows なのでcorrupted発生なし)
INSERT INTO cache_corruption_test (
SELECT x
,pgstrom.random_int(1,-128,127) -- a int1
,pgstrom.random_int(1,-32768,32767) -- b int2
,pgstrom.random_int(1,-2147483648,2147483647) -- c int4
,pgstrom.random_int(1,-9223372036854775808,9223372036854775807) -- d int8
,pgstrom.random_float(0.5, -32000, 32000) -- e float2
,pgstrom.random_float(0.5, -32000, 32000) -- f float4
,pgstrom.random_float(0.5, -32000, 32000) -- f float8
,LEFT(MD5((x%479)::TEXT),(x%32+1)::INTEGER) -- h text
,LEFT(MD5((x%479+1)::TEXT),(x%32+1)::INTEGER) -- i text
,LEFT(MD5((x%479+2)::TEXT),(x%32+1)::INTEGER) -- j text
FROM generate_series(1,4000) x
);
-- 意図的にcorrupted発生 → WARNINGメッセージ多発
UPDATE cache_corruption_test SET d=d/2 WHERE id in (SELECT id FROM cache_corruption_test LIMIT 1001);
了解です。セッションに一回Warningとかにします。
b1ac1fc で修正しました。
同時に、pgstrom.gpucache_recovery('TABLE_NAME')
を使った時に、既に corrupted 状態だとにっちもさっちもいかなくなる
(GpuService側で共有メモリをオープンしなくなり誰もcorruptedを直せなくなる)を直しました。
warning、corrupted状態がgpucache_recoveryで回復することも確認しました。