]> git.sur5r.net Git - bacula/bacula/commitdiff
Implement a different default locking mode for our queries initialized for each new
authorMarco van Wieringen <mvw@planets.elm.net>
Wed, 7 Apr 2010 07:17:14 +0000 (09:17 +0200)
committerMarco van Wieringen <mvw@planets.elm.net>
Fri, 9 Apr 2010 11:41:07 +0000 (13:41 +0200)
session opened. Not quite sure if this is the best option but it looks to be better
then the other defaults.

bacula/src/cats/ingres.c
bacula/src/cats/myingres.c
bacula/src/cats/myingres.h
bacula/src/cats/myingres.sc
bacula/src/cats/myingres.sh

index 647f84fb9e9953f6268fb09ede28578e4f64d705..b44a3f683ecfc71c84a9437126efb89c8f31c59a 100755 (executable)
@@ -228,6 +228,8 @@ db_open_database(JCR *jcr, B_DB *mdb)
 
    mdb->connected = true;
 
+   INGsetDefaultLockingMode(mdb->db);
+
    if (!check_tables_version(jcr, mdb)) {
       V(mutex);
       return 0;
index a52e9356d1b48e43e8993980f371a7af5a5d1a13..1a5e30dee7852106f5c42d2de2483fa34a22789b 100644 (file)
@@ -357,9 +357,9 @@ static inline int INGfetchAll(const char *query, INGresult *ing_res)
 /* # line 371 "myingres.sc" */ /* open */
   {
     IIsqInit(&sqlca);
-    IIcsOpen((char *)"c2",30801,28581);
+    IIcsOpen((char *)"c2",11858,14584);
     IIwritio(0,(short *)0,1,32,0,(char *)"s2");
-    IIcsQuery((char *)"c2",30801,28581);
+    IIcsQuery((char *)"c2",11858,14584);
     if (sqlca.sqlcode < 0) 
       goto bail_out;
   }
@@ -369,7 +369,7 @@ static inline int INGfetchAll(const char *query, INGresult *ing_res)
 /* # line 377 "myingres.sc" */ /* fetch */
   {
     IIsqInit(&sqlca);
-    if (IIcsRetScroll((char *)"c2",30801,28581,-1,-1) != 0) {
+    if (IIcsRetScroll((char *)"c2",11858,14584,-1,-1) != 0) {
       IIcsDaGet(0,desc);
       IIcsERetrieve();
     } /* IIcsRetrieve */
@@ -396,7 +396,7 @@ static inline int INGfetchAll(const char *query, INGresult *ing_res)
 /* # line 400 "myingres.sc" */ /* close */
   {
     IIsqInit(&sqlca);
-    IIcsClose((char *)"c2",30801,28581);
+    IIcsClose((char *)"c2",11858,14584);
   }
 /* # line 402 "myingres.sc" */ /* host code */
    ing_res->status = ING_COMMAND_OK;
@@ -692,38 +692,132 @@ INGconn *INGconnectDB(char *dbname, char *user, char *passwd, int session_id)
 bail_out:
    return dbconn;
 }
+void INGsetDefaultLockingMode(INGconn *dbconn)
+{
+   /*
+    * Set the default Ingres session locking mode:
+    *
+    * SET LOCKMODE provides four different parameters to govern
+    * the nature of locking in an INGRES session:
+    *
+    * Level: This refers to the level of granularity desired when
+    * the table is accessed. You can specify any of the following
+    * locking levels:
+    *
+    * page    Specifies locking at the level of the data page (subject to
+    *         escalation criteria; see below)
+    * table   Specifies table-level locking in the database
+    * session Specifies the current default for your INGRES session
+    * system  Specifies that INGRES will start with page-level locking,
+    *         unless it estimates that more than Maxlocks pages will be
+    *         referenced, in which case table-level locking will be used.
+    *
+    * Readlock: This refers to locking in situations where table access
+    *           is required for reading data only (as opposed to updating
+    *           data). You can specify any of the following Readlock modes:
+    *
+    *    nolock     Specifies no locking when reading data
+    *    shared     Specifies the default mode of locking when reading data
+    *    exclusive  Specifies exclusive locking when reading data (useful in
+    *               "select-for-update" processing within a multi-statement
+    *               transaction)
+    *    system     Specifies the general Readlock default for the INGRES system
+    *
+    * Maxlocks: This refers to an escalation factor, or number of locks on
+    *           data pages, at which locking escalates from page-level
+    *           to table-level. The number of locks available to you is
+    *           dependent upon your system configuration. You can specify the
+    *           following Maxlocks escalation factors:
+    *
+    *    n       A specific (integer) number of page locks to allow before
+    *            escalating to table-level locking. The default "n" is 10,
+    *            and "n" must be greater than 0.
+    *    session Specifies the current Maxlocks default for your INGRES
+    *            session
+    *    system  Specifies the general Maxlocks default for the INGRES system
+    *
+    * Note: If you specify page-level locking, and the number of locks granted
+    * during a query exceeds the system-wide lock limit, or if the operating
+    * system's locking resources are depleted, locking escalates to table-level.
+    * This escalation occurs automatically and is independent of the user.
+    *
+    * Timeout: This refers to a time limit, expressed in seconds, for which
+    * a lock request should remain pending. If INGRES cannot grant the lock
+    * request within the specified time, then the query that requested the
+    * lock aborts. You can specify the following timeout characteristics:
+    *
+    *    n       A specific (integer) number of seconds to wait for a lock
+    *            (setting "n" to 0 requires INGRES to wait indefinitely for
+    *            the lock)
+    *    session Specifies the current timeout default for your INGRES
+    *            session (which is also the INGRES default)
+    *    system  Specifies the general timeout default for the INGRES system
+    *
+    */
+/* # line 727 "myingres.sc" */ 
+  
+  int sess_id;
+/* # line 729 "myingres.sc" */ 
+  
+   if (dbconn != NULL) {
+      sess_id = dbconn->session_id;
+      /*
+       * Switch to the correct default session for this thread.
+       */
+/* # line 736 "myingres.sc" */ /* set_sql */
+  {
+    IILQssSetSqlio(11,(short *)0,1,30,sizeof(sess_id),&sess_id);
+  }
+/* # line 738 "myingres.sc" */ /* set */
+  {
+    IIsqInit(&sqlca);
+    IIwritio(0,(short *)0,1,32,0,(char *)
+"set LOCKMODE session where level=system, readlock=nolock");
+    IIsyncup((char *)0,0);
+  }
+/* # line 740 "myingres.sc" */ /* host code */
+      /*
+       * Switch to no default session for this thread.
+       */
+/* # line 743 "myingres.sc" */ /* set_sql */
+  {
+    IILQssSetSqlio(11,(short *)0,1,30,sizeof(-97),(void *)IILQint(-97));
+  }
+/* # line 744 "myingres.sc" */ /* host code */
+   }
+}
 void INGdisconnectDB(INGconn *dbconn)
 {
-/* # line 667 "myingres.sc" */ 
+/* # line 749 "myingres.sc" */ 
   
   int sess_id;
-/* # line 669 "myingres.sc" */ 
+/* # line 751 "myingres.sc" */ 
   
    if (dbconn != NULL) {
       sess_id = dbconn->session_id;
-/* # line 673 "myingres.sc" */ /* disconnect */
+/* # line 755 "myingres.sc" */ /* disconnect */
   {
     IIsqInit(&sqlca);
     IILQsidSessID(sess_id);
     IIsqDisconnect();
   }
-/* # line 675 "myingres.sc" */ /* host code */
+/* # line 757 "myingres.sc" */ /* host code */
       free(dbconn->msg);
       free(dbconn);
    }
 }
 char *INGerrorMessage(const INGconn *dbconn)
 {
-/* # line 682 "myingres.sc" */ 
+/* # line 764 "myingres.sc" */ 
   
   char errbuf[256];
-/* # line 684 "myingres.sc" */ 
+/* # line 766 "myingres.sc" */ 
   
-/* # line 686 "myingres.sc" */ /* inquire_ingres */
+/* # line 768 "myingres.sc" */ /* inquire_ingres */
   {
     IILQisInqSqlio((short *)0,1,32,255,errbuf,63);
   }
-/* # line 687 "myingres.sc" */ /* host code */
+/* # line 769 "myingres.sc" */ /* host code */
    strncpy(dbconn->msg, errbuf, sizeof(dbconn->msg));
    return dbconn->msg;
 }
@@ -735,5 +829,5 @@ char *INGcmdTuples(INGresult *res)
 int INGputCopyEnd(INGconn *dbconn, const char *errormsg);
 int INGputCopyData(INGconn *dbconn, const char *buffer, int nbytes);
 */
-/* # line 701 "myingres.sc" */ 
+/* # line 783 "myingres.sc" */ 
 #endif
index 4b683f94f84c8349b9a493546fbb346971449a58..f011e82ae116e39092c5bba116680db08ff0793a 100644 (file)
@@ -69,20 +69,21 @@ typedef struct ing_conn {
     char *msg;
 } INGconn;
 /* ---Prototypes--- */
-short INGgetCols(INGconn *conn, const char *query, bool transaction);
+short INGgetCols(INGconn *dbconn, const char *query, bool transaction);
 char *INGgetvalue(INGresult *res, int row_number, int column_number);
 bool INGgetisnull(INGresult *res, int row_number, int column_number);
 int INGntuples(const INGresult *res);
 int INGnfields(const INGresult *res);
 char *INGfname(const INGresult *res, int column_number);
 short INGftype(const INGresult *res, int column_number);
-int INGexec(INGconn *db, const char *query, bool transaction);
-INGresult *INGquery(INGconn *db, const char *query, bool transaction);
+int INGexec(INGconn *dbconn, const char *query, bool transaction);
+INGresult *INGquery(INGconn *dbconn, const char *query, bool transaction);
 void INGclear(INGresult *res);
-void INGcommit(const INGconn *conn);
+void INGcommit(const INGconn *dbconn);
 INGconn *INGconnectDB(char *dbname, char *user, char *passwd, int session_id);
 void INGdisconnectDB(INGconn *dbconn);
-char *INGerrorMessage(const INGconn *conn);
+void INGsetDefaultLockingMode(INGconn *dbconn);
+char *INGerrorMessage(const INGconn *dbconn);
 char *INGcmdTuples(INGresult *res);
 /* # line 102 "myingres.sh" */ 
 #endif /* _MYINGRES_SH */
index ad19f9135952e6c0d074cddb25b2277de5f10a6c..a34e8c19acf75b6dc130e86f9de1e0daf438a30d 100644 (file)
@@ -662,6 +662,88 @@ bail_out:
    return dbconn;
 }
 
+void INGsetDefaultLockingMode(INGconn *dbconn)
+{
+   /*
+    * Set the default Ingres session locking mode:
+    *
+    * SET LOCKMODE provides four different parameters to govern
+    * the nature of locking in an INGRES session:
+    *
+    * Level: This refers to the level of granularity desired when
+    * the table is accessed. You can specify any of the following
+    * locking levels:
+    *
+    * page    Specifies locking at the level of the data page (subject to
+    *         escalation criteria; see below)
+    * table   Specifies table-level locking in the database
+    * session Specifies the current default for your INGRES session
+    * system  Specifies that INGRES will start with page-level locking,
+    *         unless it estimates that more than Maxlocks pages will be
+    *         referenced, in which case table-level locking will be used.
+    *
+    * Readlock: This refers to locking in situations where table access
+    *           is required for reading data only (as opposed to updating
+    *           data). You can specify any of the following Readlock modes:
+    *
+    *    nolock     Specifies no locking when reading data
+    *    shared     Specifies the default mode of locking when reading data
+    *    exclusive  Specifies exclusive locking when reading data (useful in
+    *               "select-for-update" processing within a multi-statement
+    *               transaction)
+    *    system     Specifies the general Readlock default for the INGRES system
+    *
+    * Maxlocks: This refers to an escalation factor, or number of locks on
+    *           data pages, at which locking escalates from page-level
+    *           to table-level. The number of locks available to you is
+    *           dependent upon your system configuration. You can specify the
+    *           following Maxlocks escalation factors:
+    *
+    *    n       A specific (integer) number of page locks to allow before
+    *            escalating to table-level locking. The default "n" is 10,
+    *            and "n" must be greater than 0.
+    *    session Specifies the current Maxlocks default for your INGRES
+    *            session
+    *    system  Specifies the general Maxlocks default for the INGRES system
+    *
+    * Note: If you specify page-level locking, and the number of locks granted
+    * during a query exceeds the system-wide lock limit, or if the operating
+    * system's locking resources are depleted, locking escalates to table-level.
+    * This escalation occurs automatically and is independent of the user.
+    *
+    * Timeout: This refers to a time limit, expressed in seconds, for which
+    * a lock request should remain pending. If INGRES cannot grant the lock
+    * request within the specified time, then the query that requested the
+    * lock aborts. You can specify the following timeout characteristics:
+    *
+    *    n       A specific (integer) number of seconds to wait for a lock
+    *            (setting "n" to 0 requires INGRES to wait indefinitely for
+    *            the lock)
+    *    session Specifies the current timeout default for your INGRES
+    *            session (which is also the INGRES default)
+    *    system  Specifies the general timeout default for the INGRES system
+    *
+    */
+   EXEC SQL BEGIN DECLARE SECTION;
+   int sess_id;
+   EXEC SQL END DECLARE SECTION;
+
+   if (dbconn != NULL) {
+      sess_id = dbconn->session_id;
+      /*
+       * Switch to the correct default session for this thread.
+       */
+      EXEC SQL SET_SQL (SESSION = :sess_id);
+
+      EXEC SQL SET LOCKMODE SESSION WHERE level = system, readlock = nolock;
+
+      /*
+       * Switch to no default session for this thread.
+       */
+      EXEC SQL SET_SQL (SESSION = NONE);
+   }
+}
+
 void INGdisconnectDB(INGconn *dbconn)
 {
    EXEC SQL BEGIN DECLARE SECTION;
index 6d49814304a38251090f173fbcb9d4c4515e720a..4cad1789340ed846409cbc5c7c2d0605b5e10319 100644 (file)
@@ -82,20 +82,21 @@ typedef struct ing_conn {
 
 
 /* ---Prototypes--- */
-short INGgetCols(INGconn *conn, const char *query, bool transaction);
+short INGgetCols(INGconn *dbconn, const char *query, bool transaction);
 char *INGgetvalue(INGresult *res, int row_number, int column_number);
 bool INGgetisnull(INGresult *res, int row_number, int column_number);
 int INGntuples(const INGresult *res);
 int INGnfields(const INGresult *res);
 char *INGfname(const INGresult *res, int column_number);
 short INGftype(const INGresult *res, int column_number);
-int INGexec(INGconn *db, const char *query, bool transaction);
-INGresult *INGquery(INGconn *db, const char *query, bool transaction);
+int INGexec(INGconn *dbconn, const char *query, bool transaction);
+INGresult *INGquery(INGconn *dbconn, const char *query, bool transaction);
 void INGclear(INGresult *res);
-void INGcommit(const INGconn *conn);
+void INGcommit(const INGconn *dbconn);
 INGconn *INGconnectDB(char *dbname, char *user, char *passwd, int session_id);
+void INGsetDefaultLockingMode(INGconn *dbconn);
 void INGdisconnectDB(INGconn *dbconn);
-char *INGerrorMessage(const INGconn *conn);
+char *INGerrorMessage(const INGconn *dbconn);
 char *INGcmdTuples(INGresult *res);
 
 #endif /* _MYINGRES_SH */