Eli Mesika has uploaded a new change for review.

Change subject: core:  Custom Materialized Views should be...
......................................................................

core:  Custom Materialized Views should be...

Custom Materialized Views should be treated differently from
regular product Materialized Views

This patch addresses the following issues:

1) Do not fail the upgrade on custom MV file, rather, revert the custom
changes and generate only warnings
   (need support from integration team)

2) Add custom column to MV table that will easily distinguish between
product MV and custom MV.

3) Add active column to temporary disable a MV

4) Refresh options:
          Defining min refresh flood time in seconds (in the same
          manner log flood is handled)

Change-Id: I6a6857a1691c1dafa1a7edcd58b292e70c78b318
Signed-off-by: Eli Mesika <[email protected]>
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=907232
---
M backend/manager/dbscripts/dbfunctions.sh
M backend/manager/dbscripts/materialized_views_sp.sql
A backend/manager/dbscripts/upgrade/03_02_0400_materialized_views_extensions.sql
3 files changed, 108 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/69/11669/1

diff --git a/backend/manager/dbscripts/dbfunctions.sh 
b/backend/manager/dbscripts/dbfunctions.sh
index f09ef7a..0f210cb 100755
--- a/backend/manager/dbscripts/dbfunctions.sh
+++ b/backend/manager/dbscripts/dbfunctions.sh
@@ -157,7 +157,12 @@
     
custom_materialized_views_file="upgrade/post_upgrade/custom/create_materialized_views.sql"
     if [ -f ${custom_materialized_views_file} ]; then
         echo "running custom materialized views from 
${custom_materialized_views_file} ..."
-        execute_file ${custom_materialized_views_file} ${DATABASE} 
${SERVERNAME} ${PORT}  > /dev/null
+        psql -U ${USERNAME} --pset=tuples_only=on  --set ON_ERROR_STOP=1 -h 
${SERVERNAME} -p ${PORT} -f "${custom_materialized_views_file}" ${DATABASE} > 
/dev/null
+        if [ $? -ne 0 ] ; then
+            #drop all custom views
+            psql -U ${USERNAME} -h ${SERVERNAME} -p ${PORT} -c "select 
DropAllCustomMaterializedViews();" ${DATABASE} > /dev/null
+            echo "Illegal syntax in custom Materialized Views, Custom 
Materialized Views were dropped."
+        fi
     fi
     refresh_materialized_views
 
diff --git a/backend/manager/dbscripts/materialized_views_sp.sql 
b/backend/manager/dbscripts/materialized_views_sp.sql
index ccb926b..832971d 100644
--- a/backend/manager/dbscripts/materialized_views_sp.sql
+++ b/backend/manager/dbscripts/materialized_views_sp.sql
@@ -57,7 +57,8 @@
 $$ LANGUAGE 'plpgsql' IMMUTABLE STRICT;
 
 -- CreateMaterializedViewAsCreates a new Materialized View
-CREATE OR REPLACE FUNCTION CreateMaterializedView(v_matview NAME, v_view_name 
NAME, v_refresh_rate_in_sec INTEGER)
+CREATE OR REPLACE FUNCTION CreateMaterializedView(v_matview NAME, v_view_name 
NAME, v_refresh_rate_in_sec INTEGER,
+                                                  v_custom BOOLEAN, 
v_min_refresh_rate_in_sec INTEGER)
  RETURNS VOID
 AS $procedure$
 DECLARE
@@ -80,18 +81,28 @@
 
      EXECUTE 'GRANT SELECT ON ' || v_matview || ' TO PUBLIC';
 
-     INSERT INTO materialized_views (mv_name, v_name, refresh_rate_in_sec, 
last_refresh)
-       VALUES (v_matview, v_view_name, v_refresh_rate_in_sec, 
CURRENT_TIMESTAMP);
+     INSERT INTO materialized_views (mv_name, v_name, refresh_rate_in_sec, 
last_refresh, custom, min_refresh_rate_in_sec)
+       VALUES (v_matview, v_view_name, v_refresh_rate_in_sec, 
CURRENT_TIMESTAMP, v_custom, v_min_refresh_rate_in_sec);
 
      RETURN;
  END; $procedure$
  LANGUAGE plpgsql;
 
+CREATE OR REPLACE FUNCTION CreateMaterializedView(v_matview NAME, v_view_name 
NAME, v_refresh_rate_in_sec INTEGER)
+ RETURNS VOID
+AS $procedure$
+BEGIN
+     PERFORM  CreateMaterializedView(v_matview, v_view_name, 
v_refresh_rate_in_sec, false, 0);
+END; $procedure$
+ LANGUAGE plpgsql;
+
+
 -- Enables to create a New materialized view with a name of existing view
 -- This is done in order to solve cases where we are forced to use the old 
view name for the new createed
 -- Materialized View because it is used from dynamic SQL and we have to send 
only a DB patch without forcing
 -- recompilation of engine code
-CREATE OR REPLACE FUNCTION CreateMaterializedViewAs(v_view_name NAME, 
v_refresh_rate_in_sec INTEGER)
+CREATE OR REPLACE FUNCTION CreateMaterializedViewAs(v_view_name NAME, 
v_refresh_rate_in_sec INTEGER,
+                                                    v_custom BOOLEAN, 
v_min_refesh_rate_in_sec INTEGER)
  RETURNS VOID
 AS $procedure$
 DECLARE
@@ -105,10 +116,18 @@
 
      v_renamed_view := v_view_name || '_mt_base';
      EXECUTE  'ALTER VIEW ' ||  v_view_name || ' RENAME TO ' || v_renamed_view;
-     perform CreateMaterializedView(v_view_name, v_renamed_view, 
v_refresh_rate_in_sec);
+     perform CreateMaterializedView(v_view_name, v_renamed_view, 
v_refresh_rate_in_sec, v_custom, v_min_refesh_rate_in_sec);
 
      RETURN;
  END; $procedure$
+ LANGUAGE plpgsql;
+
+CREATE OR REPLACE FUNCTION CreateMaterializedViewAs(v_view_name NAME, 
v_refresh_rate_in_sec INTEGER)
+ RETURNS VOID
+AS $procedure$
+BEGIN
+    PERFORM  CreateMaterializedViewAs(v_view_name, v_refresh_rate_in_sec, 
false, 0);
+END; $procedure$
  LANGUAGE plpgsql;
 
 -- Drops a Materialized View
@@ -132,7 +151,7 @@
  END; $procedure$
  LANGUAGE plpgsql;
 
---  Drops a Materialized Views
+--  Drops all Materialized Views
 CREATE OR REPLACE FUNCTION DropAllMaterializedViews()
 RETURNS void
 AS $procedure$
@@ -151,6 +170,26 @@
 END; $procedure$
 LANGUAGE plpgsql;
 
+-- Drops all custom Materialized Views
+CREATE OR REPLACE FUNCTION DropAllCustomMaterializedViews()
+RETURNS void
+AS $procedure$
+DECLARE
+    v_cur CURSOR FOR SELECT * FROM materialized_views where custom;
+    v_record materialized_views%ROWTYPE;
+BEGIN
+       OPEN v_cur;
+       -- loop on all entries in materialized_views
+       LOOP
+           FETCH v_cur INTO v_record;
+           EXIT WHEN NOT FOUND;
+           perform DropMaterializedView(v_record.mv_name);
+       END LOOP;
+       CLOSE v_cur;
+END; $procedure$
+LANGUAGE plpgsql;
+
+
 -- Checks if  Materialized View should be refreshed
 CREATE OR REPLACE FUNCTION IsMaterializedViewRefreshed(v_matview NAME)
  RETURNS boolean
@@ -165,7 +204,9 @@
     END IF;
 
     -- check if materialized View should refresh
-    v_is_refreshed := (CURRENT_TIMESTAMP - to_interval(refresh_rate_in_sec)) 
<= last_refresh from materialized_views
+    v_is_refreshed := (((CURRENT_TIMESTAMP - to_interval(refresh_rate_in_sec)) 
<= last_refresh) and
+                      ((CURRENT_TIMESTAMP - 
to_interval(min_refresh_rate_in_sec)) <= last_refresh)) or
+                      not active from materialized_views
                        where mv_name = v_matview;
     RETURN v_is_refreshed;
  END; $procedure$
@@ -243,7 +284,7 @@
        LOOP
            FETCH v_cur INTO v_record;
            EXIT WHEN NOT FOUND;
-           IF (v_force or not IsMaterializedViewRefreshed(v_record.mv_name)) 
THEN
+           IF ((v_force and v_record.min_refresh_rate_in_sec = 0) or not 
IsMaterializedViewRefreshed(v_record.mv_name)) THEN
               perform RefreshMaterializedView(v_record.mv_name);
            END IF;
        END LOOP;
@@ -296,3 +337,49 @@
  END; $procedure$
  LANGUAGE plpgsql;
 
+-- Updates a  Materialized View min refresh rate
+CREATE OR REPLACE FUNCTION UpdateMaterializedViewMinRefreshRate(v_matview 
NAME, v_min_refresh_rate INTEGER)
+ RETURNS VOID
+AS $procedure$
+DECLARE
+     v_entry materialized_views%ROWTYPE;
+ BEGIN
+     SELECT * INTO v_entry FROM materialized_views WHERE mv_name = v_matview;
+     IF NOT FOUND THEN
+         RAISE EXCEPTION 'Materialized view % does not exist.', v_matview;
+    END IF;
+
+    update materialized_views set min_refresh_rate_in_sec = v_min_refresh_rate
+    where  mv_name = v_matview;
+    RETURN;
+ END; $procedure$
+ LANGUAGE plpgsql;
+
+CREATE OR REPLACE FUNCTION ActivateMaterializedView(v_matview NAME, v_active 
BOOLEAN)
+ RETURNS VOID
+AS $procedure$
+DECLARE
+     v_entry materialized_views%ROWTYPE;
+ BEGIN
+     SELECT * INTO v_entry FROM materialized_views WHERE mv_name = v_matview;
+     IF NOT FOUND THEN
+         RAISE EXCEPTION 'Materialized view % does not exist.', v_matview;
+    END IF;
+
+    update materialized_views set active = v_active
+    where  mv_name = v_matview;
+    RETURN;
+ END; $procedure$
+ LANGUAGE plpgsql;
+
+CREATE OR REPLACE FUNCTION ActivateAllMaterializedViews(v_active BOOLEAN)
+ RETURNS VOID
+AS $procedure$
+DECLARE
+     v_entry materialized_views%ROWTYPE;
+ BEGIN
+    update materialized_views set active = v_active;
+    RETURN;
+ END; $procedure$
+ LANGUAGE plpgsql;
+
diff --git 
a/backend/manager/dbscripts/upgrade/03_02_0400_materialized_views_extensions.sql
 
b/backend/manager/dbscripts/upgrade/03_02_0400_materialized_views_extensions.sql
new file mode 100644
index 0000000..fef5f93
--- /dev/null
+++ 
b/backend/manager/dbscripts/upgrade/03_02_0400_materialized_views_extensions.sql
@@ -0,0 +1,7 @@
+-- Determines the minimum duration we will have to wait between 2 refreshes , 
0 means : no wait
+select fn_db_add_column('materialized_views', 'min_refresh_rate_in_sec', 'int 
default 0');
+-- Indicates if this is a product view or custom view
+select fn_db_add_column('materialized_views', 'custom', 'boolean default 
false');
+-- Indicates if this materialized_view is currently active
+select fn_db_add_column('materialized_views', 'active', 'boolean default 
true');
+


--
To view, visit http://gerrit.ovirt.org/11669
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I6a6857a1691c1dafa1a7edcd58b292e70c78b318
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Eli Mesika <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to