blob: 72c938a2a6434b9786d802c75fdcab92cf7e0c0c [file] [log] [blame]
-- UDPIFC receives data in a rx thread, errors in this thread cannot be raised
-- directly, they are recorded in memory and the main thread is responsible to
-- raise it at some proper time.
--
-- It is possible for the rx thread to record an error after last TEARDOWN,
-- technically it should be counted for last query, but there was a bug that
-- the main thread raised it in next SETUP, so the new query failed immediately
-- due to out-of-date errors.
--
-- This is fixed by discarding any rx thread errors at beginning of SETUP.
do $$ begin
-- The fail rate was low, try enough times to trigger it.
for i in 1 .. 10 loop
begin
-- Turn on fault injection on memory allocation, it can happen in
-- either malloc() or palloc().
set gp_udpic_fault_inject_percent = 50;
set gp_udpic_fault_inject_bitmap = 1048576;
-- The error only happens on malloc() failures in the rx-thread,
-- need some lucks to trigger it, so retry is needed.
for j in 1 .. 10 loop
begin
-- Try to trigger the error with a motion to QD.
select * from gp_dist_random('gp_id');
exception
-- Discard the errors.
when others then continue;
end;
end loop;
-- Turn off the fault injection
set gp_udpic_fault_inject_bitmap = 0;
-- So this motioned query should not fail, without the fix the fail
-- rate was about 30%.
execute 'select * from gp_dist_random(''gp_id'')';
end;
end loop;
end $$;