[svn-commits] r197 - in branches/advisor/src: back/scf/scm front/st/shell_unix
thial01 at ingres.com
thial01 at ingres.com
Sat Aug 23 10:37:10 PDT 2008
Author: thial01
Date: 2008-08-23 10:37:10 -0700 (Sat, 23 Aug 2008)
New Revision: 197
Modified:
branches/advisor/src/back/scf/scm/scmonitor.sc
branches/advisor/src/back/scf/scm/workloaddb.sql
branches/advisor/src/front/st/shell_unix/iisudbms.sh
Log:
Adding alerter to monitordb. Triggers on workloaddb can now alert the DBA - see #174
Modified: branches/advisor/src/back/scf/scm/scmonitor.sc
===================================================================
--- branches/advisor/src/back/scf/scm/scmonitor.sc 2008-08-23 13:36:51 UTC (rev 196)
+++ branches/advisor/src/back/scf/scm/scmonitor.sc 2008-08-23 17:37:10 UTC (rev 197)
@@ -102,6 +102,9 @@
i4 deadlocks = 0;
i4 lock_wait = 0;
+/* This will hold the external command we call when a dbevent is raised */
+char alert_cmd[1000];
+
/*{
**
** Name: get_statements() - read statements from IMA
@@ -161,7 +164,7 @@
{
break;
}
- else if (sqlca.sqlcode != 0)
+ else if (sqlca.sqlcode != 0 && sqlca.sqlcode != 710)
{
SIprintf("Error: %s\n", sqlca.sqlerrm.sqlerrmc);
PCexit(FAIL);
@@ -253,7 +256,7 @@
values (:statement);
}
- if (sqlca.sqlcode != 0)
+ if (sqlca.sqlcode != 0 && sqlca.sqlcode != 710)
{
SIprintf("Error: %s\n", sqlca.sqlerrm.sqlerrmc);
PCexit(FAIL);
@@ -337,7 +340,7 @@
{
break;
}
- else if (sqlca.sqlcode != 0)
+ else if (sqlca.sqlcode != 0 && sqlca.sqlcode != 710)
{
SIprintf("Error: %s\n", sqlca.sqlerrm.sqlerrmc);
PCexit(FAIL);
@@ -415,8 +418,8 @@
exec sql insert into workload
values (:workload);
- if (sqlca.sqlcode != 0)
- {
+ if (sqlca.sqlcode != 0 && sqlca.sqlcode != 710)
+ {
SIprintf("Error: %s\n", sqlca.sqlerrm.sqlerrmc);
PCexit(FAIL);
}
@@ -494,7 +497,7 @@
{
break;
}
- else if (sqlca.sqlcode != 0)
+ else if (sqlca.sqlcode != 0 && sqlca.sqlcode != 710)
{
SIprintf("Error: %s\n", sqlca.sqlerrm.sqlerrmc);
PCexit(FAIL);
@@ -595,7 +598,7 @@
values (:table);
}
- if (sqlca.sqlcode != 0)
+ if (sqlca.sqlcode != 0 && sqlca.sqlcode != 710)
{
SIprintf("Error: %s\n", sqlca.sqlerrm.sqlerrmc);
PCexit(FAIL);
@@ -673,7 +676,7 @@
{
break;
}
- else if (sqlca.sqlcode != 0)
+ else if (sqlca.sqlcode != 0 && sqlca.sqlcode != 710)
{
SIprintf("Error: %s\n", sqlca.sqlerrm.sqlerrmc);
PCexit(FAIL);
@@ -769,7 +772,7 @@
values (:attribute);
}
- if (sqlca.sqlcode != 0)
+ if (sqlca.sqlcode != 0 && sqlca.sqlcode != 710)
{
SIprintf("Error: %s\n", sqlca.sqlerrm.sqlerrmc);
PCexit(FAIL);
@@ -847,7 +850,7 @@
{
break;
}
- else if (sqlca.sqlcode != 0)
+ else if (sqlca.sqlcode != 0 && sqlca.sqlcode != 710)
{
SIprintf("Error: %s\n", sqlca.sqlerrm.sqlerrmc);
PCexit(FAIL);
@@ -943,7 +946,7 @@
values (:index);
}
- if (sqlca.sqlcode != 0)
+ if (sqlca.sqlcode != 0 && sqlca.sqlcode != 710)
{
SIprintf("Error: %s\n", sqlca.sqlerrm.sqlerrmc);
PCexit(FAIL);
@@ -1022,7 +1025,7 @@
{
break;
}
- else if (sqlca.sqlcode != 0)
+ else if (sqlca.sqlcode != 0 && sqlca.sqlcode != 710)
{
SIprintf("Error: %s\n", sqlca.sqlerrm.sqlerrmc);
PCexit(FAIL);
@@ -1103,7 +1106,7 @@
values (:reference);
}
- if (sqlca.sqlcode != 0)
+ if (sqlca.sqlcode != 0 && sqlca.sqlcode != 710)
{
SIprintf("Error: %s\n", sqlca.sqlerrm.sqlerrmc);
PCexit(FAIL);
@@ -1166,7 +1169,7 @@
into :statistics
from ima_scm_statistics;
- if (sqlca.sqlcode != 100 && sqlca.sqlcode != 0)
+ if (sqlca.sqlcode != 100 && sqlca.sqlcode != 0 && sqlca.sqlcode != 710)
{
SIprintf("Error: %s\n", sqlca.sqlerrm.sqlerrmc);
PCexit(FAIL);
@@ -1266,7 +1269,7 @@
exec sql insert into statistics
values (:statistics, :time);
- if (sqlca.sqlcode != 0)
+ if (sqlca.sqlcode != 0 && sqlca.sqlcode != 710)
{
SIprintf("Error: %s\n", sqlca.sqlerrm.sqlerrmc);
PCexit(FAIL);
@@ -1345,6 +1348,75 @@
/*{
**
+** Name: check_alert() - check for a raised db event
+**
+** Description:
+** Checks if there is a queued db event raised by a trigger on the workload db
+**
+** Inputs:
+** none
+**
+** Outputs:
+** Returns:
+** none
+** Exceptions:
+**
+** History:
+** 23-Aug-2008 (thial01)
+** Created
+*/
+
+VOID
+check_alert( VOID )
+{
+
+#ifdef DEBUG
+ SIprintf("check_alert\n");
+#endif
+
+ exec sql begin declare section;
+ char text[255];
+ exec sql end declare section;
+
+ for (;;) {
+ text[0] = '\0';
+
+ exec sql get dbevent;
+ exec sql inquire_sql (:text = dbeventtext);
+
+ if (text[0] != '\0') {
+
+ /* Check if we were asked to call an external command */
+ if (alert_cmd[0] != '\0') {
+
+ char *argv[4];
+ i4 argc = 2;
+ PID pid;
+
+ argv[0] = alert_cmd;
+ argv[1] = text;
+ argv[2] = '\0';
+
+#ifdef DEBUG
+ SIprintf("calling %s '%s'\n", alert_cmd, text);
+#endif
+
+ PCspawn(argc, argv, PC_NO_WAIT, (LOCATION *)NULL, (LOCATION *)NULL, &pid);
+
+ }
+ } else
+ {
+ /* No events in the queue */
+ break;
+ }
+ }
+
+ return;
+}
+
+
+/*{
+**
** Name: main() - main entry point to the tool.
**
** Description:
@@ -1390,20 +1462,30 @@
MEadvise(ME_INGRES_ALLOC);
/* Process the command line to get all the necessary parameters */
- if (argc != 2)
+ if (argc != 2 && argc != 4)
{
SIprintf("Invalid number of parameters given\n");
SIprintf("Usage:\n");
- SIprintf(" %s database_name\n", argv[0]);
+ SIprintf(" %s [-e event_handler] database_name\n", argv[0]);
+ SIprintf(" event_handler external command called when\n");
+ SIprintf(" workloaddb alert is raised\n");
PCexit(FAIL);
}
+
+ alert_cmd[0] = '\0';
+
+ if (argc == 4)
+ {
+ STncpy(alert_cmd, argv[2], 1000);
+ alert_cmd[999] = '\0';
+ }
- STncpy(db_name, argv[1], DB_MAXNAME);
+ STncpy(db_name, argv[argc-1], DB_MAXNAME);
db_name[DB_MAXNAME-1] = '\0';
/* Let's see if the database is valid */
exec sql connect :db_name;
- if (sqlca.sqlcode != 0)
+ if (sqlca.sqlcode != 0 && sqlca.sqlcode != 710)
{
SIprintf("Error: %s\n", sqlca.sqlerrm.sqlerrmc);
PCexit(FAIL);
@@ -1440,6 +1522,7 @@
exec sql connect workloaddb session 2; /* Session 2 for the workload db */
exec sql set autocommit on;
+ exec sql register dbevent monitor_alert;
exec sql set_sql(session = 1);
@@ -1491,6 +1574,9 @@
put_references();
put_statistics();
+ /* Check dbevent for queued alert */
+ check_alert();
+
/*
** Let's delete old entries
** to avoid an infinitely growing DB
Modified: branches/advisor/src/back/scf/scm/workloaddb.sql
===================================================================
--- branches/advisor/src/back/scf/scm/workloaddb.sql 2008-08-23 13:36:51 UTC (rev 196)
+++ branches/advisor/src/back/scf/scm/workloaddb.sql 2008-08-23 17:37:10 UTC (rev 197)
@@ -141,6 +141,26 @@
)
\p\g
+drop dbevent monitor_alert\p\g
+
+create dbevent monitor_alert\p\g
+
+drop procedure alert\p\g
+
+create procedure alert
+ (text varchar(1000) not null) as
+begin
+ raise dbevent monitor_alert :text;
+end
+\p\g
+
+/*
+create rule example_rule after insert
+ of statistics
+ where new.current_sessions = new.max_sessions
+ execute procedure alert('Maximum number of sessions reached!')\p\g
+*/
+
grant all privileges on statements to public with grant option\p\g
grant all privileges on workload to public with grant option\p\g
grant all privileges on tables to public with grant option\p\g
@@ -148,4 +168,6 @@
grant all privileges on indexes to public with grant option\p\g
grant all privileges on references to public with grant option\p\g
grant all privileges on statistics to public with grant option\p\g
+grant raise, register on dbevent monitor_alert to public with grant option\p\g
+grant execute on procedure alert to public with grant option\p\g
Modified: branches/advisor/src/front/st/shell_unix/iisudbms.sh
===================================================================
--- branches/advisor/src/front/st/shell_unix/iisudbms.sh 2008-08-23 13:36:51 UTC (rev 196)
+++ branches/advisor/src/front/st/shell_unix/iisudbms.sh 2008-08-23 17:37:10 UTC (rev 197)
@@ -3696,7 +3696,7 @@
!
[ -f "$II_SYSTEM/ingres/files/iianalyze/workloaddb.sql" ] &&
( $DOIT cd "$II_SYSTEM/ingres/files/iianalyze" ; \
- $DOIT sql workloaddb < workloaddb.sql ) ||
+ $DOIT sql workloaddb < workloaddb.sql > /dev/null ) ||
{
WKLDBDB_ERROR=Y
NONFATAL_ERROR=Y
More information about the svn-commits
mailing list