From 8e92950a6ac0e058e99e2dd543cb1c7fa45fadd9 Mon Sep 17 00:00:00 2001 From: Tirumarai Selvan A Date: Fri, 25 Oct 2019 12:45:18 +0530 Subject: [PATCH 1/6] no need to prepare ddls --- server/src-lib/Hasura/RQL/DDL/EventTrigger.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src-lib/Hasura/RQL/DDL/EventTrigger.hs b/server/src-lib/Hasura/RQL/DDL/EventTrigger.hs index 1a6320be517ea..ada3c37addf75 100644 --- a/server/src-lib/Hasura/RQL/DDL/EventTrigger.hs +++ b/server/src-lib/Hasura/RQL/DDL/EventTrigger.hs @@ -135,7 +135,7 @@ addEventTriggerToCatalog qt allCols strfyNum etc = do INSERT into hdb_catalog.event_triggers (name, type, schema_name, table_name, configuration) VALUES ($1, 'table', $2, $3, $4) - |] (name, sn, tn, Q.AltJ $ toJSON etc) True + |] (name, sn, tn, Q.AltJ $ toJSON etc) False mkAllTriggersQ name qt allCols strfyNum fullspec where @@ -148,7 +148,7 @@ delEventTriggerFromCatalog trn = do DELETE FROM hdb_catalog.event_triggers WHERE name = $1 - |] (Identity trn) True + |] (Identity trn) False delTriggerQ trn updateEventTriggerToCatalog From 49eb3f431d272c561fb5f4ccb5a110414e2703e2 Mon Sep 17 00:00:00 2001 From: Tirumarai Selvan A Date: Fri, 25 Oct 2019 12:47:27 +0530 Subject: [PATCH 2/6] add archived column to event_log to avoid joining with event_triggers --- server/src-lib/Hasura/Events/Lib.hs | 5 ++--- server/src-lib/Hasura/RQL/DDL/EventTrigger.hs | 9 +++++++++ server/src-lib/Hasura/Server/Migrate/Version.hs | 2 +- server/src-rsr/initialise.sql | 3 ++- server/src-rsr/migrations/26_to_27.sql | 2 ++ 5 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 server/src-rsr/migrations/26_to_27.sql diff --git a/server/src-lib/Hasura/Events/Lib.hs b/server/src-lib/Hasura/Events/Lib.hs index 2d069e06d07a8..c80ea60735327 100644 --- a/server/src-lib/Hasura/Events/Lib.hs +++ b/server/src-lib/Hasura/Events/Lib.hs @@ -441,10 +441,9 @@ fetchEvents = SET locked = 't' WHERE id IN ( SELECT l.id FROM hdb_catalog.event_log l - JOIN hdb_catalog.event_triggers e - ON (l.trigger_name = e.name) - WHERE l.delivered ='f' and l.error = 'f' and l.locked = 'f' + WHERE l.delivered = 'f' and l.error = 'f' and l.locked = 'f' and (l.next_retry_at is NULL or l.next_retry_at <= now()) + and l.archived = 'f' FOR UPDATE SKIP LOCKED LIMIT 100 ) RETURNING id, schema_name, table_name, trigger_name, payload::json, tries, created_at diff --git a/server/src-lib/Hasura/RQL/DDL/EventTrigger.hs b/server/src-lib/Hasura/RQL/DDL/EventTrigger.hs index ada3c37addf75..e02ca4e74b64d 100644 --- a/server/src-lib/Hasura/RQL/DDL/EventTrigger.hs +++ b/server/src-lib/Hasura/RQL/DDL/EventTrigger.hs @@ -150,6 +150,15 @@ delEventTriggerFromCatalog trn = do WHERE name = $1 |] (Identity trn) False delTriggerQ trn + archiveEvents trn + +archiveEvents:: TriggerName -> Q.TxE QErr () +archiveEvents trn = do + Q.unitQE defaultTxErrorHandler [Q.sql| + UPDATE hdb_catalog.event_log + SET archived = 't' + WHERE trigger_name = $1 + |] (Identity trn) False updateEventTriggerToCatalog :: QualifiedTable diff --git a/server/src-lib/Hasura/Server/Migrate/Version.hs b/server/src-lib/Hasura/Server/Migrate/Version.hs index aa75f6b1d7871..a094e0a13fd78 100644 --- a/server/src-lib/Hasura/Server/Migrate/Version.hs +++ b/server/src-lib/Hasura/Server/Migrate/Version.hs @@ -12,7 +12,7 @@ import Hasura.Prelude import qualified Data.Text as T latestCatalogVersion :: Integer -latestCatalogVersion = 26 +latestCatalogVersion = 27 latestCatalogVersionString :: T.Text latestCatalogVersionString = T.pack $ show latestCatalogVersion diff --git a/server/src-rsr/initialise.sql b/server/src-rsr/initialise.sql index 54774f85d34c9..4c5a88b644fbf 100644 --- a/server/src-rsr/initialise.sql +++ b/server/src-rsr/initialise.sql @@ -280,7 +280,8 @@ CREATE TABLE hdb_catalog.event_log tries INTEGER NOT NULL DEFAULT 0, created_at TIMESTAMP DEFAULT NOW(), locked BOOLEAN NOT NULL DEFAULT FALSE, - next_retry_at TIMESTAMP + next_retry_at TIMESTAMP, + archived BOOLEAN NOT NULL DEFAULT FALSE ); CREATE INDEX ON hdb_catalog.event_log (trigger_name); diff --git a/server/src-rsr/migrations/26_to_27.sql b/server/src-rsr/migrations/26_to_27.sql new file mode 100644 index 0000000000000..286ebb92e1295 --- /dev/null +++ b/server/src-rsr/migrations/26_to_27.sql @@ -0,0 +1,2 @@ +ALTER TABLE hdb_catalog.event_log + ADD COLUMN archived BOOLEAN NOT NULL DEFAULT FALSE; From 7ce20a6e5c5e7fa5d1fa5d0785f085090903aed8 Mon Sep 17 00:00:00 2001 From: Tirumarai Selvan A Date: Fri, 25 Oct 2019 12:48:29 +0530 Subject: [PATCH 3/6] add index on delivered --- server/src-rsr/initialise.sql | 1 + server/src-rsr/migrations/26_to_27.sql | 2 ++ 2 files changed, 3 insertions(+) diff --git a/server/src-rsr/initialise.sql b/server/src-rsr/initialise.sql index 4c5a88b644fbf..24317b0b4db22 100644 --- a/server/src-rsr/initialise.sql +++ b/server/src-rsr/initialise.sql @@ -286,6 +286,7 @@ CREATE TABLE hdb_catalog.event_log CREATE INDEX ON hdb_catalog.event_log (trigger_name); CREATE INDEX ON hdb_catalog.event_log (locked); +CREATE INDEX ON hdb_catalog.event_log (delivered); CREATE TABLE hdb_catalog.event_invocation_logs ( diff --git a/server/src-rsr/migrations/26_to_27.sql b/server/src-rsr/migrations/26_to_27.sql index 286ebb92e1295..eefbe4818d942 100644 --- a/server/src-rsr/migrations/26_to_27.sql +++ b/server/src-rsr/migrations/26_to_27.sql @@ -1,2 +1,4 @@ ALTER TABLE hdb_catalog.event_log ADD COLUMN archived BOOLEAN NOT NULL DEFAULT FALSE; + +CREATE INDEX ON hdb_catalog.event_log (delivered); From ca07436af1f0ce85c8cab4a6cb6d50f56bfe2aad Mon Sep 17 00:00:00 2001 From: Tirumarai Selvan A Date: Fri, 25 Oct 2019 13:06:05 +0530 Subject: [PATCH 4/6] set archived = 't' during migration for deleted triggers --- server/src-rsr/migrations/26_to_27.sql | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/src-rsr/migrations/26_to_27.sql b/server/src-rsr/migrations/26_to_27.sql index eefbe4818d942..85b54fcde6f8e 100644 --- a/server/src-rsr/migrations/26_to_27.sql +++ b/server/src-rsr/migrations/26_to_27.sql @@ -1,4 +1,9 @@ ALTER TABLE hdb_catalog.event_log ADD COLUMN archived BOOLEAN NOT NULL DEFAULT FALSE; +UPDATE hdb_catalog.event_log + SET archived = 't' + WHERE + trigger_name NOT IN (SELECT name from hdb_catalog.event_triggers); + CREATE INDEX ON hdb_catalog.event_log (delivered); From 28644cdd54c32aed4e3f6e969073da89dbbcdba9 Mon Sep 17 00:00:00 2001 From: rikinsk Date: Wed, 30 Oct 2019 17:26:34 +0530 Subject: [PATCH 5/6] update event_log console queries with archived check --- .../Services/EventTrigger/EventActions.js | 115 +++++++++++------- .../EventTrigger/PendingEvents/ViewActions.js | 13 ++ .../ProcessedEvents/ViewActions.js | 13 ++ .../EventTrigger/RunningEvents/ViewActions.js | 13 ++ .../EventTrigger/StreamingLogs/LogActions.js | 26 ++++ console/src/helpers/versionUtils.js | 2 + 6 files changed, 138 insertions(+), 44 deletions(-) diff --git a/console/src/components/Services/EventTrigger/EventActions.js b/console/src/components/Services/EventTrigger/EventActions.js index f5d3ca9ac2574..abbeebb2f20d1 100644 --- a/console/src/components/Services/EventTrigger/EventActions.js +++ b/console/src/components/Services/EventTrigger/EventActions.js @@ -21,6 +21,7 @@ import { getEventTriggersQuery } from './utils'; import { CLI_CONSOLE_MODE, SERVER_CONSOLE_MODE } from '../../../constants'; import { REQUEST_COMPLETE, REQUEST_ONGOING } from './Modify/Actions'; +import { IMPROVED_EVENT_FETCH_QUERY } from '../../../helpers/versionUtils'; const SET_TRIGGER = 'Event/SET_TRIGGER'; const LOAD_TRIGGER_LIST = 'Event/LOAD_TRIGGER_LIST'; @@ -91,32 +92,41 @@ const loadTriggers = triggerNames => (dispatch, getState) => { const loadPendingEvents = () => (dispatch, getState) => { const url = Endpoints.getSchema; + const body = { + type: 'select', + args: { + table: { + name: 'event_triggers', + schema: 'hdb_catalog', + }, + columns: [ + '*', + { + name: 'events', + columns: [ + '*', + { name: 'logs', columns: ['*'], order_by: ['-created_at'] }, + ], + where: { delivered: false, error: false, tries: 0 }, + order_by: ['-created_at'], + limit: 10, + }, + ], + }, + }; + + if ( + globals.featuresCompatibility && + globals.featuresCompatibility[IMPROVED_EVENT_FETCH_QUERY] + ) { + body.args.columns[1].where.archived = false; + } + const options = { credentials: globalCookiePolicy, method: 'POST', headers: dataHeaders(getState), - body: JSON.stringify({ - type: 'select', - args: { - table: { - name: 'event_triggers', - schema: 'hdb_catalog', - }, - columns: [ - '*', - { - name: 'events', - columns: [ - '*', - { name: 'logs', columns: ['*'], order_by: ['-created_at'] }, - ], - where: { delivered: false, error: false, tries: 0 }, - order_by: ['-created_at'], - limit: 10, - }, - ], - }, - }), + body: JSON.stringify(body), }; return dispatch(requestAction(url, options)).then( data => { @@ -130,32 +140,41 @@ const loadPendingEvents = () => (dispatch, getState) => { const loadRunningEvents = () => (dispatch, getState) => { const url = Endpoints.getSchema; + const body = { + type: 'select', + args: { + table: { + name: 'event_triggers', + schema: 'hdb_catalog', + }, + columns: [ + '*', + { + name: 'events', + columns: [ + '*', + { name: 'logs', columns: ['*'], order_by: ['-created_at'] }, + ], + where: { delivered: false, error: false, tries: { $gt: 0 } }, + order_by: ['-created_at'], + limit: 10, + }, + ], + }, + }; + + if ( + globals.featuresCompatibility && + globals.featuresCompatibility[IMPROVED_EVENT_FETCH_QUERY] + ) { + body.args.columns[1].where.archived = false; + } + const options = { credentials: globalCookiePolicy, method: 'POST', headers: dataHeaders(getState), - body: JSON.stringify({ - type: 'select', - args: { - table: { - name: 'event_triggers', - schema: 'hdb_catalog', - }, - columns: [ - '*', - { - name: 'events', - columns: [ - '*', - { name: 'logs', columns: ['*'], order_by: ['-created_at'] }, - ], - where: { delivered: false, error: false, tries: { $gt: 0 } }, - order_by: ['-created_at'], - limit: 10, - }, - ], - }, - }), + body: JSON.stringify(body), }; return dispatch(requestAction(url, options)).then( data => { @@ -214,6 +233,14 @@ const loadEventLogs = triggerName => (dispatch, getState) => { }, ], }; + + if ( + globals.featuresCompatibility && + globals.featuresCompatibility[IMPROVED_EVENT_FETCH_QUERY] + ) { + body.args[0].args.where.event.archived = false; + } + const logOptions = { credentials: globalCookiePolicy, method: 'POST', diff --git a/console/src/components/Services/EventTrigger/PendingEvents/ViewActions.js b/console/src/components/Services/EventTrigger/PendingEvents/ViewActions.js index 515651d9d3b62..4f9c9d2b19f0a 100644 --- a/console/src/components/Services/EventTrigger/PendingEvents/ViewActions.js +++ b/console/src/components/Services/EventTrigger/PendingEvents/ViewActions.js @@ -4,6 +4,8 @@ import requestAction from '../../../../utils/requestAction'; import pendingFilterReducer from './FilterActions'; import { findTableFromRel } from '../utils'; import dataHeaders from '../Common/Headers'; +import globals from '../../../../Globals'; +import { IMPROVED_EVENT_FETCH_QUERY } from '../../../../helpers/versionUtils'; /* ****************** View actions *************/ const V_SET_DEFAULTS = 'PendingEvents/V_SET_DEFAULTS'; @@ -66,6 +68,17 @@ const vMakeRequest = () => { }; } + if ( + globals.featuresCompatibility && + globals.featuresCompatibility[IMPROVED_EVENT_FETCH_QUERY] + ) { + if (currentQuery.columns[1]) { + currentQuery.columns[1].where = currentQuery.columns[1].where || {}; + currentQuery.columns[1].where.archived = false; + } + countQuery.where.archived = false; + } + // order_by for relationship const currentOrderBy = state.triggers.view.query.order_by; if (currentOrderBy) { diff --git a/console/src/components/Services/EventTrigger/ProcessedEvents/ViewActions.js b/console/src/components/Services/EventTrigger/ProcessedEvents/ViewActions.js index ceba1245f6b1e..d12ac2cc7d493 100644 --- a/console/src/components/Services/EventTrigger/ProcessedEvents/ViewActions.js +++ b/console/src/components/Services/EventTrigger/ProcessedEvents/ViewActions.js @@ -9,6 +9,8 @@ import { } from '../../Common/Notification'; import dataHeaders from '../Common/Headers'; import { getConfirmation } from '../../../Common/utils/jsUtils'; +import globals from '../../../../Globals'; +import { IMPROVED_EVENT_FETCH_QUERY } from '../../../../helpers/versionUtils'; /* ****************** View actions *************/ const V_SET_DEFAULTS = 'ProcessedEvents/V_SET_DEFAULTS'; @@ -80,6 +82,17 @@ const vMakeRequest = () => { }; } + if ( + globals.featuresCompatibility && + globals.featuresCompatibility[IMPROVED_EVENT_FETCH_QUERY] + ) { + if (currentQuery.columns[1]) { + currentQuery.columns[1].where = currentQuery.columns[1].where || {}; + currentQuery.columns[1].where.archived = false; + } + countQuery.where.archived = false; + } + // order_by for relationship const currentOrderBy = state.triggers.view.query.order_by; if (currentOrderBy) { diff --git a/console/src/components/Services/EventTrigger/RunningEvents/ViewActions.js b/console/src/components/Services/EventTrigger/RunningEvents/ViewActions.js index d2b0a747d3ad6..bef89db04eec0 100644 --- a/console/src/components/Services/EventTrigger/RunningEvents/ViewActions.js +++ b/console/src/components/Services/EventTrigger/RunningEvents/ViewActions.js @@ -4,6 +4,8 @@ import requestAction from 'utils/requestAction'; import pendingFilterReducer from './FilterActions'; import { findTableFromRel } from '../utils'; import dataHeaders from '../Common/Headers'; +import globals from '../../../../Globals'; +import { IMPROVED_EVENT_FETCH_QUERY } from '../../../../helpers/versionUtils'; /* ****************** View actions *************/ const V_SET_DEFAULTS = 'RunningEvents/V_SET_DEFAULTS'; @@ -72,6 +74,17 @@ const vMakeRequest = () => { }; } + if ( + globals.featuresCompatibility && + globals.featuresCompatibility[IMPROVED_EVENT_FETCH_QUERY] + ) { + if (currentQuery.columns[1]) { + currentQuery.columns[1].where = currentQuery.columns[1].where || {}; + currentQuery.columns[1].where.archived = false; + } + countQuery.where.archived = false; + } + // order_by for relationship const currentOrderBy = state.triggers.view.query.order_by; if (currentOrderBy) { diff --git a/console/src/components/Services/EventTrigger/StreamingLogs/LogActions.js b/console/src/components/Services/EventTrigger/StreamingLogs/LogActions.js index cf8683da24b4a..5d0794bb347ca 100644 --- a/console/src/components/Services/EventTrigger/StreamingLogs/LogActions.js +++ b/console/src/components/Services/EventTrigger/StreamingLogs/LogActions.js @@ -2,6 +2,8 @@ import { defaultLogState } from '../EventState'; import Endpoints, { globalCookiePolicy } from '../../../../Endpoints'; import requestAction from 'utils/requestAction'; import dataHeaders from '../Common/Headers'; +import globals from '../../../../Globals'; +import { IMPROVED_EVENT_FETCH_QUERY } from '../../../../helpers/versionUtils'; /* ****************** View actions *************/ const V_SET_DEFAULTS = 'StreamingLogs/V_SET_DEFAULTS'; @@ -42,6 +44,14 @@ const vMakeRequest = triggerName => { currentQuery.where = { event: { trigger_name: triggerName } }; + if ( + globals.featuresCompatibility && + globals.featuresCompatibility[IMPROVED_EVENT_FETCH_QUERY] + ) { + currentQuery.where.event.archived = false; + countQuery.where.event.archived = false; + } + // order_by for relationship currentQuery.order_by = ['-created_at']; @@ -112,6 +122,14 @@ const loadNewerEvents = (latestTimestamp, triggerName) => { created_at: { $gt: latestTimestamp }, }; + if ( + globals.featuresCompatibility && + globals.featuresCompatibility[IMPROVED_EVENT_FETCH_QUERY] + ) { + currentQuery.where.event.archived = false; + countQuery.where.event.archived = false; + } + // order_by for relationship currentQuery.order_by = ['-created_at']; @@ -202,6 +220,14 @@ const loadOlderEvents = (oldestTimestamp, triggerName) => { created_at: { $lt: oldestTimestamp }, }; + if ( + globals.featuresCompatibility && + globals.featuresCompatibility[IMPROVED_EVENT_FETCH_QUERY] + ) { + currentQuery.where.event.archived = false; + countQuery.where.event.archived = false; + } + // order_by for relationship currentQuery.order_by = ['-created_at']; diff --git a/console/src/helpers/versionUtils.js b/console/src/helpers/versionUtils.js index 911eabc9792fe..8de2673353a0d 100644 --- a/console/src/helpers/versionUtils.js +++ b/console/src/helpers/versionUtils.js @@ -7,6 +7,7 @@ export const REMOTE_SCHEMA_TIMEOUT_CONF_SUPPORT = export const TABLE_ENUMS_SUPPORT = 'tableEnumsSupport'; export const EXISTS_PERMISSION_SUPPORT = 'existsPermissionSupport'; export const COMPUTED_FIELDS_SUPPORT = 'computedFieldsSupport'; +export const IMPROVED_EVENT_FETCH_QUERY = 'improvedEventFetchQuery'; // list of feature launch versions const featureLaunchVersions = { @@ -17,6 +18,7 @@ const featureLaunchVersions = { [TABLE_ENUMS_SUPPORT]: 'v1.0.0-beta.6', [EXISTS_PERMISSION_SUPPORT]: 'v1.0.0-beta.7', [COMPUTED_FIELDS_SUPPORT]: 'v1.0.0-beta.8', + [IMPROVED_EVENT_FETCH_QUERY]: 'v1.0.0-beta.9', }; export const checkValidServerVersion = version => { From e0f7e199bba1c9c5765ad3397080ab6f06470f9c Mon Sep 17 00:00:00 2001 From: Rikin Kachhia <54616969+rikinsk@users.noreply.github.com> Date: Wed, 13 Nov 2019 11:34:33 +0530 Subject: [PATCH 6/6] update feature support version --- console/src/helpers/versionUtils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/console/src/helpers/versionUtils.js b/console/src/helpers/versionUtils.js index bd248b041b590..ee5354867602a 100644 --- a/console/src/helpers/versionUtils.js +++ b/console/src/helpers/versionUtils.js @@ -22,7 +22,7 @@ const featureLaunchVersions = { [EXISTS_PERMISSION_SUPPORT]: 'v1.0.0-beta.7', [CUSTOM_GRAPHQL_FIELDS_SUPPORT]: 'v1.0.0-beta.8', [COMPUTED_FIELDS_SUPPORT]: 'v1.0.0-beta.8', - [IMPROVED_EVENT_FETCH_QUERY]: 'v1.0.0-beta.9', + [IMPROVED_EVENT_FETCH_QUERY]: 'v1.0.0-beta.10', }; export const checkValidServerVersion = version => {