merchant

Merchant backend to process payments, run by merchants
Log | Files | Refs | Submodules | README | LICENSE

commit a35e20ca524de7b3c3e8c4a7dfeb851f8a191feb
parent 1042ca084e69caaa7d3ef73cf2b800d26480d792
Author: Christian Grothoff <christian@grothoff.org>
Date:   Wed, 10 Jun 2026 16:55:30 +0200

try to fix #11500

Diffstat:
Msrc/backenddb/gc.sql | 6+++---
Msrc/backenddb/pg_statistics_helpers.sql | 50++++++++------------------------------------------
2 files changed, 11 insertions(+), 45 deletions(-)

diff --git a/src/backenddb/gc.sql b/src/backenddb/gc.sql @@ -36,9 +36,9 @@ BEGIN s := 'merchant_instance_' || rec.merchant_serial::TEXT; BEGIN EXECUTE format('SET LOCAL search_path TO %I, merchant', s); - CALL merchant_statistic_amount_gc (); - CALL merchant_statistic_bucket_gc (); - CALL merchant_statistic_counter_gc (); + EXECUTE format('CALL %I.merchant_statistic_amount_gc()', s); + EXECUTE format('CALL %I.merchant_statistic_bucket_gc()', s); + EXECUTE format('CALL %I.merchant_statistic_counter_gc()', s); EXECUTE format('DELETE FROM %I.merchant_unclaim_signatures' ' WHERE expiration_time < $1', s) USING in_now; EXCEPTION diff --git a/src/backenddb/pg_statistics_helpers.sql b/src/backenddb/pg_statistics_helpers.sql @@ -406,8 +406,6 @@ LANGUAGE plpgsql AS $$ DECLARE my_time INT8 DEFAULT ROUND(EXTRACT(epoch FROM CURRENT_TIMESTAMP(0)::TIMESTAMP) * 1000000)::INT8 / 1000 / 1000; - my_instance INT8; - my_instance_name TEXT; my_rec RECORD; my_sum RECORD; my_meta INT8; @@ -420,11 +418,6 @@ DECLARE end_slot INT8; my_total INT8; BEGIN - -- GC for all instances - FOR my_instance IN - SELECT DISTINCT merchant_serial - FROM merchant_statistic_counter_event - LOOP -- Do combination work for all numeric statistic events FOR my_rec IN SELECT imeta_serial_id @@ -433,12 +426,7 @@ BEGIN ,slug FROM merchant_statistic_interval_meta LOOP - -- First, we query the current interval statistic to update its counters - SELECT merchant_id - INTO my_instance_name - FROM merchant.merchant_instances - WHERE merchant_serial = my_instance; - PERFORM FROM merchant_statistic_interval_number_get (my_rec.slug, my_instance_name); + PERFORM FROM merchant_statistic_interval_number_get (my_rec.slug); my_meta = my_rec.imeta_serial_id; my_ranges = my_rec.ranges; @@ -470,8 +458,7 @@ BEGIN MIN(nevent_serial_id) AS rep_serial_id INTO my_sum FROM merchant_statistic_counter_event - WHERE merchant_serial=my_instance - AND imeta_serial_id=my_meta + WHERE imeta_serial_id=my_meta AND slot >= my_time - max_slot AND slot < my_time - min_slot; @@ -485,8 +472,7 @@ BEGIN -- combine entries DELETE FROM merchant_statistic_counter_event - WHERE merchant_serial=my_instance - AND imeta_serial_id=my_meta + WHERE imeta_serial_id=my_meta AND slot >= my_time - max_slot AND slot < my_time - min_slot AND nevent_serial_id > my_sum.rep_serial_id; @@ -494,7 +480,6 @@ BEGIN UPDATE merchant_statistic_counter_event SET delta = my_total WHERE imeta_serial_id = my_meta - AND merchant_serial = my_instance AND nevent_serial_id = my_sum.rep_serial_id; END IF; min_slot = min_slot + my_precision; @@ -502,13 +487,11 @@ BEGIN END LOOP; -- my_i loop -- Finally, delete all events beyond the range we care about - RAISE NOTICE 'deleting entries of %/% before % - % = %', my_instance, my_meta, my_time, my_ranges[array_length(my_ranges,1)], my_time - my_ranges[array_length(my_ranges,1)]; + RAISE NOTICE 'deleting entries of % before % - % = %', my_meta, my_time, my_ranges[array_length(my_ranges,1)], my_time - my_ranges[array_length(my_ranges,1)]; DELETE FROM merchant_statistic_counter_event - WHERE merchant_serial=my_instance - AND imeta_serial_id=my_meta + WHERE imeta_serial_id=my_meta AND slot < my_time - my_ranges[array_length(my_ranges,1)]; END LOOP; -- my_rec loop - END LOOP; -- my_instance loop END $$; COMMENT ON PROCEDURE merchant_statistic_counter_gc IS 'Performs garbage collection and compaction of the merchant_statistic_counter_event table'; @@ -521,8 +504,6 @@ LANGUAGE plpgsql AS $$ DECLARE my_time INT8 DEFAULT ROUND(EXTRACT(epoch FROM CURRENT_TIMESTAMP(0)::TIMESTAMP) * 1000000)::INT8 / 1000 / 1000; - my_instance INT8; - my_instance_name TEXT; my_rec RECORD; my_sum RECORD; my_meta INT8; @@ -537,11 +518,6 @@ DECLARE my_total_val INT8; my_total_frac INT8; BEGIN - -- GC for all instances - FOR my_instance IN - SELECT DISTINCT merchant_serial - FROM merchant_statistic_counter_event - LOOP -- Do combination work for all numeric statistic events FOR my_rec IN SELECT imeta_serial_id @@ -551,12 +527,7 @@ BEGIN FROM merchant_statistic_interval_meta LOOP - -- First, we query the current interval statistic to update its counters - SELECT merchant_id - INTO my_instance_name - FROM merchant.merchant_instances - WHERE merchant_serial = my_instance; - PERFORM FROM merchant_statistic_interval_amount_get (my_rec.slug, my_instance_name); + PERFORM FROM merchant_statistic_interval_amount_get (my_rec.slug); my_meta = my_rec.imeta_serial_id; my_ranges = my_rec.ranges; @@ -595,7 +566,6 @@ BEGIN INTO my_sum FROM merchant_statistic_amount_event WHERE imeta_serial_id=my_meta - AND merchant_serial=my_instance AND delta_curr = my_currency AND slot >= my_time - max_slot AND slot < my_time - min_slot; @@ -609,7 +579,6 @@ BEGIN -- combine entries DELETE FROM merchant_statistic_amount_event WHERE imeta_serial_id=my_meta - AND merchant_serial=my_instance AND delta_curr = my_currency AND slot >= my_time - max_slot AND slot < my_time - min_slot @@ -619,7 +588,6 @@ BEGIN delta_value = my_total_val ,delta_frac = my_total_frac WHERE imeta_serial_id = my_meta - AND merchant_serial = my_instance AND delta_curr = my_currency AND aevent_serial_id = my_sum.rep_serial_id; END IF; @@ -629,13 +597,11 @@ BEGIN END LOOP; -- my_currency loop -- Finally, delete all events beyond the range we care about - RAISE NOTICE 'deleting entries of %/% before % - % = %', my_instance, my_meta, my_time, my_ranges[array_length(my_ranges,1)], my_time - my_ranges[array_length(my_ranges,1)]; + RAISE NOTICE 'deleting entries of % before % - % = %', my_meta, my_time, my_ranges[array_length(my_ranges,1)], my_time - my_ranges[array_length(my_ranges,1)]; DELETE FROM merchant_statistic_amount_event - WHERE merchant_serial=my_instance - AND imeta_serial_id=my_meta + WHERE imeta_serial_id=my_meta AND slot < my_time - my_ranges[array_length(my_ranges,1)]; END LOOP; -- my_rec loop - END LOOP; -- my_instance loop END $$; COMMENT ON PROCEDURE merchant_statistic_amount_gc IS 'Performs garbage collection and compaction of the merchant_statistic_amount_event table';