Re: [PATCHES] patch for pg_autovacuum 8.0.x prevent segv for dropped tables

2005-10-20 Thread daveg
On Thu, Oct 20, 2005 at 12:30:27PM -0400, Tom Lane wrote:
> "Matthew T. O'Connor"  writes:
> > Tom Lane wrote:
> >> Surely this is completely broken?  AFAICT you are testing the result
> >> from a VACUUM or ANALYZE command, which is not going to return any
> >> tuples.
> 
> > Upon further inspection, I think you are right.  I would think that 
> > instead of checking the query result with PQntuples, it should probably 
> > be checked with |PQresultStatus. 
> 
> ISTM this is the wrong place to test at all.  I put a PQntuples check
> into update_table_thresholds() instead, which seems a far more direct
> defense against trouble.  (Consider eg the case where someone drops the
> table just after your VACUUM completes successfully.  Also there are
> drop/rename scenarios to think about: success of the VACUUM proves that
> there is a table named FOO, not that there is still a table with the OID
> you have on record.)

Yes, I agree, update_table_thresholds() is the right place for the check.
Please ignore the earlier patch.

Thanks

-dg

-- 
David Gould  [EMAIL PROTECTED]
If simplicity worked, the world would be overrun with insects.

---(end of broadcast)---
TIP 9: In versions below 8.0, the planner will ignore your desire to
   choose an index scan if your joining column's datatypes do not
   match


Re: [PATCHES] patch for pg_autovacuum 8.0.x prevent segv for dropped

2005-10-20 Thread Andrew Dunstan



Tom Lane wrote:


daveg <[EMAIL PROTECTED]> writes:
 


Below is a patch for this that should apply against any 8.0.x. The change
verifies that the catalog query returned some rows before accessing the row
data.
   



Surely this is completely broken?  AFAICT you are testing the result
from a VACUUM or ANALYZE command, which is not going to return any
tuples.
 



I guess he should change

   if (PQntuples(res))

to

   if (|PQresultStatus|(res) == PGRES_COMMAND_OK)

?

cheers

andrew



---(end of broadcast)---
TIP 6: explain analyze is your friend


Re: [PATCHES] patch for pg_autovacuum 8.0.x prevent segv for dropped tables

2005-10-20 Thread Tom Lane
"Matthew T. O'Connor"  writes:
> Tom Lane wrote:
>> Surely this is completely broken?  AFAICT you are testing the result
>> from a VACUUM or ANALYZE command, which is not going to return any
>> tuples.

> Upon further inspection, I think you are right.  I would think that 
> instead of checking the query result with PQntuples, it should probably 
> be checked with |PQresultStatus. 

ISTM this is the wrong place to test at all.  I put a PQntuples check
into update_table_thresholds() instead, which seems a far more direct
defense against trouble.  (Consider eg the case where someone drops the
table just after your VACUUM completes successfully.  Also there are
drop/rename scenarios to think about: success of the VACUUM proves that
there is a table named FOO, not that there is still a table with the OID
you have on record.)

regards, tom lane

---(end of broadcast)---
TIP 3: Have you checked our extensive FAQ?

   http://www.postgresql.org/docs/faq


Re: [PATCHES] patch for pg_autovacuum 8.0.x prevent segv for dropped

2005-10-20 Thread Matthew T. O'Connor

Tom Lane wrote:

daveg <[EMAIL PROTECTED]> writes:
  

Below is a patch for this that should apply against any 8.0.x. The change
verifies that the catalog query returned some rows before accessing the row
data.



Surely this is completely broken?  AFAICT you are testing the result
from a VACUUM or ANALYZE command, which is not going to return any
tuples.


Upon further inspection, I think you are right.  I would think that 
instead of checking the query result with PQntuples, it should probably 
be checked with |PQresultStatus. 


Matt

|

---(end of broadcast)---
TIP 2: Don't 'kill -9' the postmaster


Re: [PATCHES] patch for pg_autovacuum 8.0.x prevent segv for dropped tables

2005-10-20 Thread Tom Lane
daveg <[EMAIL PROTECTED]> writes:
> Below is a patch for this that should apply against any 8.0.x. The change
> verifies that the catalog query returned some rows before accessing the row
> data.

Surely this is completely broken?  AFAICT you are testing the result
from a VACUUM or ANALYZE command, which is not going to return any
tuples.

regards, tom lane

---(end of broadcast)---
TIP 9: In versions below 8.0, the planner will ignore your desire to
   choose an index scan if your joining column's datatypes do not
   match


Re: [PATCHES] patch for pg_autovacuum 8.0.x prevent segv for dropped

2005-10-20 Thread Andrew Dunstan


Small nit: please observe postgres community conventions regarding

a) indentation (BSD style, tabsize 4) and
b) diff type (context, not unidiff)

The patch itself looks ok to me.

cheers

andrew

daveg wrote:


Apologies if this is old news, but pg_autovacuum in 8.0.x has the bad habit
of SEGVing and exiting when a table gets dropped out from under it. This
creates problems if you rely on pg_autovacuum for the bulk of your vacuuming
as it forgets it's statistics when it is restarted and so will skip some
desireable vacuums.

I looked at the new autovacuum in 8.1 and it appears from casual inspection
not to have the same problem.

Below is a patch for this that should apply against any 8.0.x. The change
verifies that the catalog query returned some rows before accessing the row
data.

-dg

diff -Naur source/postgresql-8.0.2/contrib/pg_autovacuum/pg_autovacuum.c 
build/postgresql-8.0.2/contrib/pg_autovacuum/pg_autovacuum.c
--- source/postgresql-8.0.2/contrib/pg_autovacuum/pg_autovacuum.c   
2005-04-02 16:02:03.0 -0800
+++ build/postgresql-8.0.2/contrib/pg_autovacuum/pg_autovacuum.c
2005-09-28 22:15:25.428710172 -0700
@@ -1013,6 +1013,7 @@
static void
perform_maintenance_command(db_info * dbi, tbl_info * tbl, int operation)
{
+   PGresult*res;
charbuf[256];

/*
@@ -1069,10 +1070,16 @@
fflush(LOGOUTPUT);
}

-   send_query(buf, dbi);
-
-   update_table_thresholds(dbi, tbl, operation);
-
+   res = send_query(buf, dbi);
+   if (PQntuples(res)) {
+   update_table_thresholds(dbi, tbl, operation);
+   } else {
+   if (args->debug >= 1) {
+   sprintf(logbuffer, "Cannot refind table %s", 
tbl->table_name);
+   log_entry(logbuffer, LVL_DEBUG);
+   fflush(LOGOUTPUT);
+   }
+   }
if (args->debug >= 2)
print_table_info(tbl);
}
 



---(end of broadcast)---
TIP 6: explain analyze is your friend


Re: [PATCHES] patch for pg_autovacuum 8.0.x prevent segv for dropped

2005-10-20 Thread Matthew
Looks reasonable to me.  All the patch does is make sure that the result 
set is valid.  Probably a check I should have done from the beginning, 
or pg _autovacuum should be locking tables to make sure they aren't 
dropped, but that sounds too intrusive, this is probably better.


Matt



daveg wrote:

Apologies if this is old news, but pg_autovacuum in 8.0.x has the bad habit
of SEGVing and exiting when a table gets dropped out from under it. This
creates problems if you rely on pg_autovacuum for the bulk of your vacuuming
as it forgets it's statistics when it is restarted and so will skip some
desireable vacuums.
 
I looked at the new autovacuum in 8.1 and it appears from casual inspection

not to have the same problem.

Below is a patch for this that should apply against any 8.0.x. The change
verifies that the catalog query returned some rows before accessing the row
data.

-dg

diff -Naur source/postgresql-8.0.2/contrib/pg_autovacuum/pg_autovacuum.c 
build/postgresql-8.0.2/contrib/pg_autovacuum/pg_autovacuum.c
--- source/postgresql-8.0.2/contrib/pg_autovacuum/pg_autovacuum.c   
2005-04-02 16:02:03.0 -0800
+++ build/postgresql-8.0.2/contrib/pg_autovacuum/pg_autovacuum.c
2005-09-28 22:15:25.428710172 -0700
@@ -1013,6 +1013,7 @@
 static void
 perform_maintenance_command(db_info * dbi, tbl_info * tbl, int operation)
 {
+   PGresult*res;
charbuf[256];
 
 	/*

@@ -1069,10 +1070,16 @@
fflush(LOGOUTPUT);
}
 
-	send_query(buf, dbi);

-
-   update_table_thresholds(dbi, tbl, operation);
-
+   res = send_query(buf, dbi);
+   if (PQntuples(res)) {
+   update_table_thresholds(dbi, tbl, operation);
+   } else {
+   if (args->debug >= 1) {
+   sprintf(logbuffer, "Cannot refind table %s", 
tbl->table_name);
+   log_entry(logbuffer, LVL_DEBUG);
+   fflush(LOGOUTPUT);
+   }
+   }
if (args->debug >= 2)
print_table_info(tbl);
 }
  



---(end of broadcast)---
TIP 5: don't forget to increase your free space map settings