486 Commits

Author SHA1 Message Date
Josh Kupershmidt
8c2dd16608 Small fixes related to the concurrent_indexes changes.
Move PQsetnonblocking() call to setup_workers(), and make
sure we're not forgetting any workers.
2012-12-11 19:46:49 -07:00
Josh Kupershmidt
0bdb4bb96f Missing PQclear(). 2012-12-11 19:12:57 -07:00
Josh Kupershmidt
0d984ed3e5 First pass at implementing concurrent index builds using multiple connections.
Adds a new --jobs command-line argument to specify how many worker
connections you want. These worker connections should stick around
while processing table(s) in a single database. For each table,
parcel out the indexes to be built among these worker conns,
submitting each CREATE INDEX ... request using PQsendQuery() i.e.
in non-blocking fashion.

Most of this is still rather crude, in particular the
while (num_active_workers) ... loop in rebuild_indexes(), but
it seems to be working, so I'm committing here.
2012-12-10 21:08:01 -07:00
Daniele Varrazzo
fcd3f7eaae Added pg_repack runs to check the get_order_by definitions work 2012-12-09 12:11:10 +00:00
Daniele Varrazzo
13cf8679db Added support for COLLATE to index keys 2012-12-09 12:02:49 +00:00
Daniele Varrazzo
4bcb7641c9 Function get_index_keys() renamed to get_order_by()
It was a FIXME item in the source. Reasonably so.
2012-12-09 11:35:52 +00:00
Josh Kupershmidt
9d776b3980 Likely fix for Issue #4 -- make sure params[] is long enough for two strings. 2012-12-08 18:57:27 -07:00
Daniele Varrazzo
a47686a7ee Added support for DESC and NULLS FIRST/LAST to index keys
Fixes issue #3
2012-12-09 01:11:39 +00:00
Josh Kupershmidt
6fc41e9c1a Fix 'installcheck', since the last commit broke the expected output when the table is missing a valid primary/unique key. 2012-12-06 21:26:12 -07:00
Josh Kupershmidt
66ae2f33a7 Downgrade ERROR to WARNING in the case where a table does not have a primary key or not-null unique key.
We want to be able to keep processing further tables if we
encounter this problem on one of many --tables.
2012-12-06 21:05:54 -07:00
Josh Kupershmidt
f6ca290fb2 Support for multiple --tables, as well as Concurrent DDL Guard.
Code merged in, with a few more changes, from the multiple_tables branch.

The multiple --table support and SimpleStringList code is largely
borrowed from pg_dump. (pg_reorg Issue #18).

The concurrent DDL guard is implemented using an auxiliary
database connection (pg_reorg Issue #8) which holds an ACCESS SHARE
lock on the target table while pg_repack conducts the rest of its work.
2012-12-06 20:58:33 -07:00
Josh Kupershmidt
a072cc9812 Ignore other pg_repack clients which may be running concurrently for the purposes of SQL_XID_SNAPSHOT.
Use application_name from pg_stat_activity, if available, to identify
other pg_repack clients. Fixes Issue #1.
2012-12-06 16:11:55 -07:00
Daniele Varrazzo
1a0a28d3f8 Bugtrack url changed to pg_repack's one 2012-12-01 12:58:50 +00:00
Daniele Varrazzo
c395f72a1c Some docs clarification if you find a stray trigger 2012-12-01 12:50:27 +00:00
Josh Kupershmidt
fbcd24b4e0 Have the client double-check that it is connected as a database superuser before plowing through initialization steps.
Addresses Issue #2.
2012-11-30 20:09:22 -07:00
Josh Kupershmidt
3b856623fd Add comment explaining how race condition between CREATE TABLE ... AS SELECT and recording of log entries is avoided. 2012-11-29 20:27:33 -07:00
Josh Kupershmidt
d402a73e42 No need to use strlen() with StringInfoData. 2012-11-26 20:08:47 -07:00
Daniele Varrazzo
7e4f811381 Style of definitions lists in the docs improved 2012-11-22 23:23:30 +00:00
Josh Kupershmidt
06a38f4a99 Typofix from last commit. 2012-11-19 07:42:21 -07:00
Daniele Varrazzo
c756d13a55 Docs cleanup by Josh 2012-11-19 11:13:33 +00:00
Daniele Varrazzo
520870ca2e Try rst2html.py too to render the docs 2012-11-19 11:07:00 +00:00
Josh Kupershmidt
3c13a0d05e Don't forget to disconnect conn2 when disconnect() is called, otherwise
we leave a connection hanging open for every database processed
via pg_repack -a.
2012-11-18 14:36:09 -07:00
Daniele Varrazzo
580307f79e Mention Slony fix for pg_repack 1.1.8 (issue #4) 2012-11-16 22:32:59 +00:00
Daniele Varrazzo
d13f1b141d Merge branch 'version_check' 2012-11-16 21:32:45 +00:00
Daniele Varrazzo
deaae7dd72 Added version_sql() function and consistency check of sql version 2012-11-16 21:32:28 +00:00
Josh Kupershmidt
3c73a0204a More consistent error reporting
This patch is a port of Daniele's commit 0be414ad10c32d from his own fork,
"error_reporting" branch.

reorg_all_database can return an error message: in case of any error different
from "missing schema" return the error and keep processing the other databases
instead of printing and stopping the program.

The output of the program is now something like:

    $ pg_reorg --all
    pg_reorg: reorg database "contrib_regression"
    pg_reorg: reorg database "template1" ... skipped: pg_reorg is not installed in the database
2012-11-16 15:37:31 +00:00
Josh Kupershmidt
8ba92a1f49 Rename argument to simple_string_list_size() for consistency. 2012-11-16 15:27:53 +00:00
Josh Kupershmidt
decd822393 Move simple_string_list_size() into pgut.c, with the rest of these string functions.
Also, fix an error with this function not actually using its string_list argument.
2012-11-16 15:27:53 +00:00
Josh Kupershmidt
40626769d8 Since commit 742380f0429b6 included some of the same changes
already in 6a0af679e14d1d, go ahead and include a few more of
the error cleanup from 6a0af679e14d1d.
2012-11-16 15:27:53 +00:00
Josh Kupershmidt
34605aef27 Fix bogus use of table name parameters.
Mimic the original code, which used execute_elevel() with params to
pass in table names which are assumed to be quoted already by the user.
2012-11-16 15:27:53 +00:00
Josh Kupershmidt
00ddb1edf9 Improved error handling, particularly when processing multiple tables.
Previously, an error while processing any single table would cause
pg_reorg to cause exit() and bail out. Quick summary of fixes:
 * get rid of pgut_atexit_push() and pgut_atexit_pop() use, since
   we are no longer relying on calling exit() to handle mundane errors
 * remove lock_conn_pid variable; we can just use buffer instead
 * lock_exclusive() and lock_access_share() now return bool instead of
   bailing out on any error
 * ERROR-level ereport() or elog() calls now return WARNING instead,
   to avoid bailing out unnecessarily
 * signature of reorg_cleanup() changed; it no longer needs to take a
   void pointer
 * check return of strdup() for vxid
 * Use pgut_rollback() instead of sending ROLLBACK; command directly

There are still one or two FIXMEs left, including fixing table name
escaping, but I'm committing this much.
2012-11-16 15:25:41 +00:00
Josh Kupershmidt
ad75dcfbb1 Allow multiple --table options to be specified on the command-line.
Per Issue #18. SimpleStringList code borrowed from pg_dump and a
pending patch to add similar functionality to pg_restore,
clusterdb, vacuumdb, and reindexdb.

The error handling in reorg_one_table() could still be much improved,
so that an error processing a single table doesn't cause pg_reorg to
necessarily bail out and skip further tables, but I'll leave that for
another day.
2012-11-16 15:19:35 +00:00
Josh Kupershmidt
ad00eb181d Several fixes for concurrent-DDL guard.
* KILL_COMPETING_LOCKS was using pg_cancel_backend() instead of
   pg_terminate_backend()
 * create kill_ddl() function for canceling+terminating any pending
   unsafe concurrent DDL, i.e. anyone hanging out waiting for
   an ACCESS EXCLUSIVE lock on our table.
 * create lock_access_share() function for reliably obtaining an
   ACCESS SHARE lock on the target table, killing off any queued
   ACCESS EXCLUSIVE lockers in the process via kill_ddl()
 * Avoid deadlock possible before we run:
     CREATE TABLE reorg.table_xxx AS SELECT ... FROM ONLY ...
   by using lock_access_share()
 * Fix a few calls in lock_exclusive() which were forgetting to
   specify the passed-in connection.

These fixes are related to Issue #8. The main thing remaining AFAIK
is to review or fix some of the unlikely-error handling bits;
most of these should be marked with XXX now.
2012-11-16 15:18:25 +00:00
Josh Kupershmidt
cf25780575 Further improvements to concurrent-DDL guard.
Fix table locking so that race conditions don't exist between lock
release in primary conn, and lock acquisition in conn2. Also, have
conn2 be in charge of performing the table swap step, to avoid a
similar race.

Part of work for Issue #8.
2012-11-16 15:18:25 +00:00
Josh Kupershmidt
3606e0a957 Switch to using pgut_command() and pgut_execute() for conn2. 2012-11-16 15:14:12 +00:00
Josh Kupershmidt
78bae38718 Take an ACCESS SHARE LOCK on the target table, in an initial attempt to prevent concurrent DDL.
This is a first pass at Daniele's suggestion in Issue #8, although it is
definitely still buggy -- it is still possible for another transaction
to get in an AccessExclusive lock and perform DDL either before the
ACCESS SHARE lock is acquired or immediately after it is released.
2012-11-16 15:14:12 +00:00
Daniele Varrazzo
e02811689a Fixed non-portable use of sed to parse the version from META
Patch from Josh, with the help of RhodiumToad.
2012-11-16 10:36:16 +00:00
Daniele Varrazzo
1bcaf267b3 Stop database processing if library version doesn't match the binary
Actually this leaves out the case of the SQL schema not consistent with the
library/binary installed, and this is a relatively likely case:
the user has run "make install" but the repack schema was already loaded
from an older version.
2012-11-15 23:32:21 +00:00
Daniele Varrazzo
c43b6bdceb More consistent error reporting
repack_all_database can return an error message: in case of any error different
from "missing schema" return the error and keep processing the other databases
instead of printing and stopping the program.

The output of the program is now something like:

    $ pg_reorg --all
    pg_reorg: reorg database "contrib_regression"
    pg_reorg: reorg database "template1" ... skipped: pg_reorg is not installed in the database
2012-11-15 23:32:21 +00:00
Daniele Varrazzo
0af231dff5 Use a single version number for program, library and SQL
Having the SQL on a different numbering scheme is useful to provide an ungrade
path. But pg_repack has no need of such a path as it can be uninstalled with
no problem, so we are not going to provide update script. Hence it's much
easier to have a single version number for everything.
2012-11-15 23:31:58 +00:00
Daniele Varrazzo
ffe5a2b323 Added git repos reference to the META info 2012-11-15 15:42:39 +00:00
Daniele Varrazzo
8b3f64f0fc Added PGXN URL for download and pgxn client usage docs 2012-11-15 15:40:50 +00:00
Daniele Varrazzo
77d27a14f3 Use the same title of README/docs for the extension 2012-11-15 13:53:06 +00:00
Daniele Varrazzo
258ca24986 Docs title and mission uniformed with the README
Also reduced excessive left padding in Contents box.
2012-11-15 12:04:49 +00:00
Daniele Varrazzo
292e00835e Use correct homepage link in pg_repack --help
Also fixed punctuation in help.
2012-11-15 11:53:00 +00:00
Daniele Varrazzo
b728d7b9dd README wordsmithing by Josh applied 2012-11-15 11:39:51 +00:00
Daniele Varrazzo
a926623e74 A few doc typos fixed 2012-11-15 00:58:58 +00:00
Daniele Varrazzo
ec28c2772f Mention partial index issue fixed in docs 2012-11-15 00:19:29 +00:00
Daniele Varrazzo
44bf1543be Don't choose a partial index as primary key
Fixes reorg/pg_reorg#22
2012-11-15 00:16:38 +00:00
Daniele Varrazzo
ef2c7da4a5 Doc page reordered in a more logical order
Requirements, Installation, Usage, Examples, etc.
2012-11-13 14:33:08 +00:00