diff options
| author | Christian Grothoff <christian@grothoff.org> | 2022-02-24 10:06:43 +0100 | 
|---|---|---|
| committer | Christian Grothoff <christian@grothoff.org> | 2022-02-24 10:06:43 +0100 | 
| commit | 5e5004020eb85a82394ac4d8bd83765304ffd8da (patch) | |
| tree | ac9b01a0d203760133584b90492b27220670e272 | |
| parent | e253a5b055dd1e9d335e7736160a5413ee4c157c (diff) | |
-fix aggregator with deferred constraint
| -rw-r--r-- | src/exchangedb/exchange-0001.sql | 19 | ||||
| -rw-r--r-- | src/exchangedb/plugin_exchangedb_postgres.c | 17 | 
2 files changed, 34 insertions, 2 deletions
| diff --git a/src/exchangedb/exchange-0001.sql b/src/exchangedb/exchange-0001.sql index 477a9b0d..125f1020 100644 --- a/src/exchangedb/exchange-0001.sql +++ b/src/exchangedb/exchange-0001.sql @@ -581,7 +581,7 @@ CREATE INDEX IF NOT EXISTS wire_out_by_wire_target_serial_id_index  CREATE TABLE IF NOT EXISTS aggregation_tracking    (aggregation_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY -- UNIQUE    ,deposit_serial_id INT8 PRIMARY KEY -- REFERENCES deposits (deposit_serial_id) ON DELETE CASCADE -  ,wtid_raw BYTEA CONSTRAINT wire_out_ref REFERENCES wire_out(wtid_raw) ON DELETE CASCADE DEFERRABLE +  ,wtid_raw BYTEA NOT NULL CONSTRAINT wire_out_ref REFERENCES wire_out(wtid_raw) ON DELETE CASCADE DEFERRABLE    )    PARTITION BY HASH (deposit_serial_id);  COMMENT ON TABLE aggregation_tracking @@ -1078,6 +1078,23 @@ COMMENT ON FUNCTION exchange_do_withdraw_limit_check(INT8, INT8, INT8, INT4)    IS 'Check whether the withdrawals from the given reserve since the given time are below the given threshold'; +-- NOTE: experiment, currently dead, see postgres_Start_deferred_wire_out; +-- now done inline. FIXME: Remove code here once inline version is confirmed working nicely! +CREATE OR REPLACE PROCEDURE defer_wire_out() +LANGUAGE plpgsql +AS $$ +BEGIN + +IF EXISTS ( +  SELECT 1 +    FROM information_Schema.constraint_column_usage +   WHERE table_name='wire_out' +     AND constraint_name='wire_out_ref')  +THEN  +  SET CONSTRAINTS wire_out_ref DEFERRED; +END IF; + +END $$;  CREATE OR REPLACE FUNCTION exchange_do_deposit( diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index c80f3370..507a2c66 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -7949,7 +7949,22 @@ postgres_start_deferred_wire_out (void *cls)    struct PostgresClosure *pg = cls;    struct GNUNET_PQ_ExecuteStatement es[] = {      GNUNET_PQ_make_execute ("START TRANSACTION ISOLATION LEVEL READ COMMITTED"), -    GNUNET_PQ_make_try_execute ("SET CONSTRAINTS wire_out_ref DEFERRED"), +    GNUNET_PQ_make_execute ("DO $$" +                            "BEGIN" +                            " IF EXISTS (" +                            "   SELECT 1" +                            "     FROM information_Schema.constraint_column_usage" +                            "    WHERE table_name='wire_out'" +                            "      AND constraint_name='wire_out_ref')" +                            "  THEN " +                            "  SET CONSTRAINTS wire_out_ref DEFERRED;" +                            "  END IF;" +                            "END $$"), +    // FIXME: above logic is better as it tests that the constraint +    // is actually applicable; but maybe we want to drop the constraint +    // entirely once do_gc() is fixed to do without it? +    //    GNUNET_PQ_make_execute ("CALL defer_wire_out()"), +    //    GNUNET_PQ_make_execute ("SET CONSTRAINTS wire_out_ref DEFERRED;"),      GNUNET_PQ_EXECUTE_STATEMENT_END    }; | 
