heterodb/pg-strom

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で回復することも確認しました。