Hi Josh,
I ported the error handling mechanism from submit/index.php to to the database.inc. Please review.

Thanks,
Pasha

Josh Hursey wrote:
Pasha,

I'm looking at the patch a bit closer and even though at a high level the do_pg_connect, do_pg_query, simple_select, and select functions do the same thing the versions in submit/index.php have some additional error handling mechanisms that the ones in database.inc do not have. Specifically they send email when the functions fail with messages indicating what failed so corrections can be made.

So though I agree that we should unify the functionality I cannot recommend this patch since it will result in losing useful error handling functionality. Maybe there is another way to clean this up to preserve the error reporting.

-- Josh

On May 7, 2008, at 11:56 AM, Pavel Shamis (Pasha) wrote:

Hi Josh,
I had the original problem with some old revision from trunk.
Today I updated the server to latest revision from trunk + the patch and everything looks good.

Can I commit the patch ?

Pasha


Ethan Mallove wrote:
On Wed, May/07/2008 06:04:07PM, Pavel Shamis (Pasha) wrote:

Hi Josh.

Looking at the patch I'm a little bit conserned. The "get_table_fields()" is, as you mentioned, no longer used so should be removed. However the other functions are critical to the submission script particularly 'do_pg_connect' which opens the connection to the backend database.

All the functions are implemented in $topdir/database.inc file. And the "database.inc" implementation is better because it use password and username from config.ini. The original implementation from submit/index use
hardcoded values defined in the file.

Are you using the current development trunk (mtt/trunk) or the stable release branch (mtt/branches/ompi-core-testers)?

trunk

Can you send us the error messages that you were receiving?

1. On client side I see ""*** WARNING: MTTDatabase client did not get a serial" As result of the error some of MTT results is not visible via the web reporter
2. On server side I found follow error message:
[client 10.4.3.214] PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 23592960 bytes) in /.autodirect/swgwork/MTT/mtt/submit/index.php(79) : eval()'d code on line 77515
[Mon May 05 19:26:05 2008] [notice] caught SIGTERM, shutting down
[Mon May 05 19:30:54 2008] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec) [Mon May 05 19:30:54 2008] [notice] Digest: generating secret for digest authentication ...
[Mon May 05 19:30:54 2008] [notice] Digest: done
[Mon May 05 19:30:54 2008] [notice] LDAP: Built with OpenLDAP LDAP SDK
[Mon May 05 19:30:54 2008] [notice] LDAP: SSL support unavailable
My memory limit in php.ini file was set on 256MB !



Looks like PHP is actually using a 32MB limit ("Allowed
memory size of 33554432 ..."). Does a (Apache?) daemon need
to be restarted for the php.ini file to take effect? To
check your settings, this little PHP script will print an
HTML page of all the active system settings (search on
"memory_limit").
<?php
phpinfo();
?>

-Ethan



Regards,
Pasha


Cheers,
Josh

On May 7, 2008, at 4:49 AM, Pavel Shamis (Pasha) wrote:


Hi,
I upgraded the server side (the mtt is still running , so don't know if the problem was resolved) During upgrade I had some problem with the submit/index.php script, it had some duplicated functions and some of them were broken.
Please review the attached patch.

Pasha

Ethan Mallove wrote:

On Tue, May/06/2008 06:29:33PM, Pavel Shamis (Pasha) wrote:


I'm not sure which cron jobs you're referring to. Do you
mean these?

https://svn.open-mpi.org/trac/mtt/browser/trunk/server/php/cron


I talked about this one: https://svn.open-mpi.org/trac/mtt/wiki/ServerMaintenance


I'm guessing you would only be concerned with the below
periodic-maintenance.pl script, which just runs
ANALYZE/VACUUM queries. I think you can start that up
whenever you want (and it should optimize the Reporter).

https://svn.open-mpi.org/trac/mtt/browser/trunk/server/sql/cron/periodic-maintenance.pl

-Ethan




The only thing there are the regular
mtt-resu...@open-mpi.org email alerts and some out-of-date
DB monitoring junk. You can ignore that stuff.

Josh, are there some nightly (DB
pruning/cleaning/vacuuming?) cron jobs that Pasha should be
running?

-Ethan



Thanks.

Ethan Mallove wrote:


Hi Pasha,

I thought this issue was solved in r1119 (see below). Do you
have the latest mtt/server scripts?

https://svn.open-mpi.org/trac/mtt/changeset/1119/trunk/server/php/submit

-Ethan

On Tue, May/06/2008 03:26:43PM, Pavel Shamis (Pasha) wrote:


About the issue:
1. On client side I see ""*** WARNING: MTTDatabase client did not get a serial" As result of the error some of MTT results is not visible via the web reporter
2. On server side I found follow error message:
[client 10.4.3.214] PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 23592960 bytes) in /.autodirect/swgwork/MTT/mtt/submit/index.php(79) : eval()'d code on line 77515 [Mon May 05 19:26:05 2008] [notice] caught SIGTERM, shutting down [Mon May 05 19:30:54 2008] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec) [Mon May 05 19:30:54 2008] [notice] Digest: generating secret for digest authentication ...
[Mon May 05 19:30:54 2008] [notice] Digest: done
[Mon May 05 19:30:54 2008] [notice] LDAP: Built with OpenLDAP LDAP SDK [Mon May 05 19:30:54 2008] [notice] LDAP: SSL support unavailable
My memory limit in php.ini file was set on 256MB !

Any ideas ?

Thanks.


--
Pavel Shamis (Pasha)
Mellanox Technologies

_______________________________________________
mtt-users mailing list
mtt-us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/mtt-users


--
Pavel Shamis (Pasha)
Mellanox Technologies

_______________________________________________
mtt-users mailing list
mtt-us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/mtt-users


--
Pavel Shamis (Pasha)
Mellanox Technologies

_______________________________________________
mtt-users mailing list
mtt-us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/mtt-users



--
Pavel Shamis (Pasha)
Mellanox Technologies

Index: submit/index.php
===================================================================
--- submit/index.php    (revision 1200)
+++ submit/index.php    (working copy)
@@ -1,6 +1,7 @@
<?php
# Copyright (c) 2006      Cisco Systems, Inc.  All rights reserved.
# Copyright (c) 2006-2007 Sun Microsystems, Inc. All rights reserved. +# Copyright (c) 2008 Mellanox Technologies. All rights reserved.

#
#
@@ -24,8 +25,7 @@ if (file_exists("$topdir/config.inc")) {
ini_set("memory_limit", "32M");

$topdir = '..';
-$ompi_home = '/l/osl/www/doc/www.open-mpi.org';
-include_once("$ompi_home/dbpassword.inc");
+include_once("$topdir/database.inc");
include_once("$topdir/reporter.inc");


@@ -1465,60 +1465,6 @@ function get_table_indexes($table_name,
   return simple_select($sql_cmd);
}

-# Function used to determine which _POST fields
-# to INSERT. Prevent non-existent fields from being
-# INSERTed
-function get_table_fields($table_name) {
-
-    global $dbname;
-    global $id;
-
-    # These indexes are special in that they link phases
-    # together and hence, can and do show up in _POST
-    if ($table_name == "test_build")
-        $special_indexes = array("mpi_install$id");
-    elseif ($table_name == "test_run")
-        $special_indexes = array("test_build$id");
-
-    # Crude way to tell whether a field is an index
-    $is_not_index_clause =
-           "\n\t (table_name = '$table_name' AND NOT " .
-           "\n\t (data_type = 'integer' AND " .
-           "\n\t column_name ~ '_id$' AND " .
-           "\n\t table_catalog = '$dbname'))";
-
-    $is_special_index_clause =
-           "\n\t (table_name = '$table_name' AND " .
-           "\n\t (column_name = '$special_indexes[0]'))";
-
-    $is_index_columns = array(
-            "column_name",
-            "data_type",
-            "column_default");
-
-    $sql_cmd = "\n   SELECT " . join(",",$is_index_columns) .
-               "\n\t FROM information_schema.columns WHERE " .
-               "\n\t " .
-                     $is_not_index_clause . " OR " .
-                     $is_special_index_clause . ';';
-
-    do_pg_connect();
-
-    # This table will be easier to manage if it's
-    # keyed by column, instead of index
-    $tmp = array();
-    $arr = array();
-    $arr = select($sql_cmd);
-
-    foreach ($is_index_columns as $col) {
-        $tmp[$col] = array();
-        for ($i = 0; $i < sizeof($arr); $i++) {
-            $tmp[$col][] = $arr[$i][$col];
-        }
-    }
-    return $tmp;
-}
-
#
# Useful display of all the parameters posted.
# Warning: this function could explode the memory footprint causing the
@@ -1622,90 +1568,6 @@ function is_null_($var) {

######################################################################

-function do_pg_connect() {
-
-    global $dbname;
-    global $user;
-    global $pass;
-    global $pgsql_conn;
-    static $connected = false;
-
-    if (!$connected) {
-        $pgsql_conn =
- pg_connect("host=localhost port=5432 dbname=$dbname user=$user password=$pass");
-
-        # Exit if we cannot connect
-        if (!$pgsql_conn) {
- mtt_abort("\nCould not connect to the $dbname database; " .
-                      "submit this run later.");
-        }
-        else {
-            $connected = true;
-
- # Serialize all transactions by default - Safer that way. - do_pg_query("SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE", false);
-        }
-
- # pg_set_error_verbosity($pgsql_conn, PGSQL_ERRORS_VERBOSE); # PHP 5 needed - # pg_trace($_ENV['HOME'] . "/pgsql.trace", 'w', $pgsql_conn); - # debug("\npg_options: " . var_export(pg_options($pgsql_conn)));
-    }
-}
-
-function do_pg_query($cmd, $silent) {
-    $db_res = null;
-
-    do_pg_connect();
-
-    debug("\nSQL: $cmd\n");
-    if (! ($db_res = pg_query($cmd))) {
-        $out = "\nSQL QUERY: " . $cmd .
-               "\nSQL ERROR: " . pg_last_error() .
-               "\nSQL ERROR: " . pg_result_error();
-
-        # Some errors are unsurprising, allow for silence in
-        # such cases
-        if (! $silent) {
-            mtt_error($out);
-            mtt_send_mail($out);
-        }
-    }
- debug("\nDatabase rows affected: " . pg_affected_rows($db_res) . "\n");
-
-    return $db_res;
-}
-
-# Fetch scalar value
-function select_scalar($cmd) {
-
-    $set = array();
-    $set = simple_select($cmd);
-    return array_shift($set);
-}
-
-# Fetch 1D array
-function simple_select($cmd) {
-
-    do_pg_connect();
-
-    $rows = null;
-
-    debug("\nSQL: $cmd\n");
-    if (! ($result = pg_query($cmd))) {
-        $out = "\nSQL QUERY: " . $cmd .
-               "\nSQL ERROR: " . pg_last_error() .
-               "\nSQL ERROR: " . pg_result_error();
-        mtt_error($out);
-        mtt_send_mail($out);
-    }
-    $max = pg_num_rows($result);
-    for ($i = 0; $i < $max; ++$i) {
-        $row = pg_fetch_array($result, $i, PGSQL_NUM);
-        $rows[] = $row[0];
-    }
-    return $rows;
-}
-
# Fetch an associative hash (column name => value)
function associative_select($cmd) {

@@ -1722,21 +1584,6 @@ function associative_select($cmd) {
   return pg_fetch_array($result);
}

-# Fetch 2D array
-function select($cmd) {
-    do_pg_connect();
-
-    debug("\nSQL: $cmd\n");
-    if (! ($result = pg_query($cmd))) {
-        $out = "\nSQL QUERY: " . $cmd .
-               "\nSQL ERROR: " . pg_last_error() .
-               "\nSQL ERROR: " . pg_result_error();
-        mtt_error($out);
-        mtt_send_mail($out);
-    }
-    return pg_fetch_all($result);
-}
-
######################################################################

# Function for reporting errors back to the client


--
Pavel Shamis (Pasha)
Mellanox Technologies

_______________________________________________
mtt-users mailing list
mtt-us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/mtt-users





--
Pavel Shamis (Pasha)
Mellanox Technologies




--
Pavel Shamis (Pasha)
Mellanox Technologies

Index: database.inc
===================================================================
--- database.inc        (revision 1200)
+++ database.inc        (working copy)
@@ -3,6 +3,7 @@
 #
 # Copyright (c) 2006 Sun Microsystems, Inc.
 #                         All rights reserved.
+# Copyright (c) 2008      Mellanox Technologies.  All rights reserved.
 # $COPYRIGHT$
 #
 # Additional copyrights may follow
@@ -100,10 +101,13 @@ function do_pg_connect() {
         $pgsql_conn = 
             pg_connect("host=localhost port=5432 dbname=$mtt_database_name 
user=$mtt_database_username password=$mtt_database_password");
         if (!$pgsql_conn) {
-            print("\nCould not connect to '$dbname' database.");
-            exit;
+            mtt_abort("\nCould not connect to the $dbname database; " .
+                    "submit this run later.");
+        } else {
+            $connected = true;
+# Serialize all transactions by default - Safer that way.
+            do_pg_query("SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION 
LEVEL SERIALIZABLE", false);
         }
-        $connected = true;
     }
 }

@@ -113,12 +117,17 @@ function do_pg_query($cmd, $silent) {

     $start = time();

-    debug_sql($cmd, 2);
+    debug("\nSQL: $cmd\n");
     if (! ($db_res = pg_query($cmd))) {
+        $out = "\nSQL QUERY: " . $cmd .
+            "\nSQL ERROR: " . pg_last_error() .
+            "\nSQL ERROR: " . pg_result_error();
+
+# Some errors are unsurprising, allow for silence in
+# such cases
         if (! $silent) {
-            print("\npostgres: " .
-                        pg_last_error() . "\n" .
-                        pg_result_error());
+            mtt_error($out);
+            mtt_send_mail($out);
         }
     }

@@ -137,21 +146,9 @@ function do_pg_query($cmd, $silent) {

 # Fetch scalar value
 function select_scalar($cmd) {
-    do_pg_connect();
-
-    $rows = null;
-
-    debug_sql($cmd, 2);
-    if (! ($result = pg_query($cmd))) {
-        print("\npostgres: " . pg_last_error() . "\n" .
-                  pg_result_error());
-    }
-    $max = pg_num_rows($result);
-    for ($i = 0; $i < $max; ++$i) {
-        $row = pg_fetch_array($result, $i, PGSQL_NUM);
-        $rows[] = $row[0];
-    }
-    return array_shift($rows);
+    $set = array();
+    $set = simple_select($cmd);
+    return array_shift($set);
 }

 # Fetch 1D array
@@ -160,10 +157,13 @@ function simple_select($cmd) {

     $rows = null;

-    debug_sql($cmd, 2);
+    debug("\nSQL: $cmd\n");
     if (! ($result = pg_query($cmd))) {
-        print("\npostgres: " . pg_last_error() . "\n" .
-                  pg_result_error());
+        $out = "\nSQL QUERY: " . $cmd .
+            "\nSQL ERROR: " . pg_last_error() .
+            "\nSQL ERROR: " . pg_result_error();
+        mtt_error($out);
+        mtt_send_mail($out);
     }
     $max = pg_num_rows($result);
     for ($i = 0; $i < $max; ++$i) {
@@ -177,10 +177,13 @@ function simple_select($cmd) {
 function select($cmd) {
     do_pg_connect();

-    debug_sql($cmd, 2);
+    debug("\nSQL: $cmd\n");
     if (! ($result = pg_query($cmd))) {
-        print("\npostgres: " . pg_last_error() . "\n" .
-                  pg_result_error());
+        $out = "\nSQL QUERY: " . $cmd .
+            "\nSQL ERROR: " . pg_last_error() .
+            "\nSQL ERROR: " . pg_result_error();
+        mtt_error($out);
+        mtt_send_mail($out);
     }
     return pg_fetch_all($result);
 }
Index: submit/index.php
===================================================================
--- submit/index.php    (revision 1200)
+++ submit/index.php    (working copy)
@@ -1,6 +1,7 @@
 <?php
 # Copyright (c) 2006      Cisco Systems, Inc.  All rights reserved.
 # Copyright (c) 2006-2007 Sun Microsystems, Inc.  All rights reserved.
+# Copyright (c) 2008      Mellanox Technologies.  All rights reserved.

 #
 #
@@ -24,8 +25,7 @@ if (file_exists("$topdir/config.inc")) {
 ini_set("memory_limit", "32M");

 $topdir = '..';
-$ompi_home = '/l/osl/www/doc/www.open-mpi.org';
-include_once("$ompi_home/dbpassword.inc");
+include_once("$topdir/database.inc");
 include_once("$topdir/reporter.inc");


@@ -1465,60 +1465,6 @@ function get_table_indexes($table_name, 
     return simple_select($sql_cmd);
 }

-# Function used to determine which _POST fields
-# to INSERT. Prevent non-existent fields from being
-# INSERTed
-function get_table_fields($table_name) {
-
-    global $dbname;
-    global $id;
-
-    # These indexes are special in that they link phases
-    # together and hence, can and do show up in _POST
-    if ($table_name == "test_build")
-        $special_indexes = array("mpi_install$id");
-    elseif ($table_name == "test_run")
-        $special_indexes = array("test_build$id");
-
-    # Crude way to tell whether a field is an index
-    $is_not_index_clause =
-           "\n\t (table_name = '$table_name' AND NOT " .
-           "\n\t (data_type = 'integer' AND " .
-           "\n\t column_name ~ '_id$' AND " .
-           "\n\t table_catalog = '$dbname'))";
-
-    $is_special_index_clause = 
-           "\n\t (table_name = '$table_name' AND " .
-           "\n\t (column_name = '$special_indexes[0]'))";
-
-    $is_index_columns = array(
-            "column_name",
-            "data_type",
-            "column_default");
-
-    $sql_cmd = "\n   SELECT " . join(",",$is_index_columns) .
-               "\n\t FROM information_schema.columns WHERE " .
-               "\n\t " . 
-                     $is_not_index_clause . " OR " .
-                     $is_special_index_clause . ';';
-
-    do_pg_connect();
-
-    # This table will be easier to manage if it's
-    # keyed by column, instead of index
-    $tmp = array();
-    $arr = array();
-    $arr = select($sql_cmd);
-
-    foreach ($is_index_columns as $col) {
-        $tmp[$col] = array();
-        for ($i = 0; $i < sizeof($arr); $i++) {
-            $tmp[$col][] = $arr[$i][$col];
-        }
-    }
-    return $tmp;
-}
-
 #
 # Useful display of all the parameters posted.
 # Warning: this function could explode the memory footprint causing the 
@@ -1622,90 +1568,6 @@ function is_null_($var) {

 ######################################################################

-function do_pg_connect() {
-
-    global $dbname;
-    global $user;
-    global $pass;
-    global $pgsql_conn;
-    static $connected = false;
-
-    if (!$connected) {
-        $pgsql_conn =
-            pg_connect("host=localhost port=5432 dbname=$dbname user=$user 
password=$pass");
-
-        # Exit if we cannot connect
-        if (!$pgsql_conn) {
-            mtt_abort("\nCould not connect to the $dbname database; " .
-                      "submit this run later.");
-        }
-        else {
-            $connected = true;
-
-            # Serialize all transactions by default - Safer that way.
-            do_pg_query("SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION 
LEVEL SERIALIZABLE", false);
-        }
-
-        # pg_set_error_verbosity($pgsql_conn, PGSQL_ERRORS_VERBOSE); # PHP 5 
needed
-        # pg_trace($_ENV['HOME'] . "/pgsql.trace", 'w', $pgsql_conn);
-        # debug("\npg_options: " . var_export(pg_options($pgsql_conn)));
-    }
-}
-
-function do_pg_query($cmd, $silent) {
-    $db_res = null;
-
-    do_pg_connect();
-
-    debug("\nSQL: $cmd\n");
-    if (! ($db_res = pg_query($cmd))) {
-        $out = "\nSQL QUERY: " . $cmd .
-               "\nSQL ERROR: " . pg_last_error() .
-               "\nSQL ERROR: " . pg_result_error();
-
-        # Some errors are unsurprising, allow for silence in
-        # such cases
-        if (! $silent) {
-            mtt_error($out);
-            mtt_send_mail($out);
-        }
-    }
-    debug("\nDatabase rows affected: " . pg_affected_rows($db_res) . "\n");
-
-    return $db_res;
-}
-
-# Fetch scalar value
-function select_scalar($cmd) {
-
-    $set = array();
-    $set = simple_select($cmd);
-    return array_shift($set);
-}
-
-# Fetch 1D array
-function simple_select($cmd) {
-
-    do_pg_connect();
-
-    $rows = null;
-
-    debug("\nSQL: $cmd\n");
-    if (! ($result = pg_query($cmd))) {
-        $out = "\nSQL QUERY: " . $cmd .
-               "\nSQL ERROR: " . pg_last_error() .
-               "\nSQL ERROR: " . pg_result_error();
-        mtt_error($out);
-        mtt_send_mail($out);
-    }
-    $max = pg_num_rows($result);
-    for ($i = 0; $i < $max; ++$i) {
-        $row = pg_fetch_array($result, $i, PGSQL_NUM);
-        $rows[] = $row[0];
-    }
-    return $rows;
-}
-
 # Fetch an associative hash (column name => value)
 function associative_select($cmd) {

@@ -1722,21 +1584,6 @@ function associative_select($cmd) {
     return pg_fetch_array($result);
 }

-# Fetch 2D array
-function select($cmd) {
-    do_pg_connect();
-
-    debug("\nSQL: $cmd\n");
-    if (! ($result = pg_query($cmd))) {
-        $out = "\nSQL QUERY: " . $cmd .
-               "\nSQL ERROR: " . pg_last_error() .
-               "\nSQL ERROR: " . pg_result_error();
-        mtt_error($out);
-        mtt_send_mail($out);
-    }
-    return pg_fetch_all($result);
-}
-
 ######################################################################

 # Function for reporting errors back to the client

Reply via email to