diff --git a/.gitignore b/.gitignore index bffb51b..fc936f5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ *.so regress/regression.diffs regress/regression.out +dist/*.zip diff --git a/META.json b/META.json index feaff93..8e3b64d 100644 --- a/META.json +++ b/META.json @@ -2,18 +2,18 @@ "name": "pg_repack", "abstract": "PostgreSQL module for data reorganization", "description": "Reorganize tables in PostgreSQL databases with minimal locks", - "version": "1.2.0-beta1", + "version": "1.2.1", "maintainer": [ "Josh Kupershmidt ", "Daniele Varrazzo " ], "tags": [ "bloat", "maintenance", "vacuum", "cluster" ], - "release_status": "testing", + "release_status": "stable", "license": "bsd", "provides": { "pg_repack": { "file": "lib/pg_repack.sql", - "version": "1.2.0-beta1", + "version": "1.2.1", "abstract": "Reorganize tables in PostgreSQL databases with minimal locks" } }, diff --git a/Makefile b/Makefile index 6b9b8d6..51956e6 100644 --- a/Makefile +++ b/Makefile @@ -7,19 +7,26 @@ # PG_CONFIG ?= pg_config +EXTENSION = pg_repack -# Pull out the version number from pg_config +.PHONY: dist/$(EXTENSION)-$(EXTVERSION).zip + +# Pull out PostgreSQL version number from pg_config VERSION := $(shell $(PG_CONFIG) --version | awk '{print $$2}') ifeq ("$(VERSION)","") $(error pg_config not found) endif -# version as a number, e.g. 9.1.4 -> 901 +# PostgreSQL version as a number, e.g. 9.1.4 -> 901 INTVERSION := $(shell echo $$(($$(echo $(VERSION) | sed 's/\([[:digit:]]\{1,\}\)\.\([[:digit:]]\{1,\}\).*/\1*100+\2/')))) +# The version number of the library +EXTVERSION = $(shell grep '"version":' META.json | head -1 \ + | sed -e 's/[ ]*"version":[ ]*"\(.*\)",/\1/') + # We support PostgreSQL 8.3 and later. ifeq ($(shell echo $$(($(INTVERSION) < 803))),1) -$(error pg_repack requires PostgreSQL 8.3 or later. This is $(VERSION)) +$(error $(EXTENSION) requires PostgreSQL 8.3 or later. This is $(VERSION)) endif @@ -36,3 +43,12 @@ check installcheck: $(MAKE) -C $$dir $@ || CHECKERR=$$?; \ done; \ exit $$CHECKERR + +# Prepare the package for PGXN submission +package: dist dist/$(EXTENSION)-$(EXTVERSION).zip + +dist: + mkdir -p dist + +dist/$(EXTENSION)-$(EXTVERSION).zip: + git archive --format zip --prefix=$(EXTENSION)-$(EXTVERSION)/ --output $@ master diff --git a/README.rst b/README.rst index 76429d1..c5299be 100644 --- a/README.rst +++ b/README.rst @@ -17,31 +17,34 @@ CLUSTER directly. Please check the documentation (in the ``doc`` directory or online_) for installation and usage instructions. +All users of pg_reorg 1.1.9 or earlier, and pg_repack 1.2.0-beta1 or earlier, +are **urged to upgrade** to the latest pg_repack version to fix a serious +data corruption issue_. + .. _pg_repack: http://reorg.github.com/pg_repack .. _CLUSTER: http://www.postgresql.org/docs/current/static/sql-cluster.html .. _VACUUM FULL: VACUUM_ .. _VACUUM: http://www.postgresql.org/docs/current/static/sql-vacuum.html .. _online: pg_repack_ +.. _issue: https://github.com/reorg/pg_repack/issues/23 What about pg_reorg? -------------------- pg_repack is a fork of the pg_reorg_ project, which has proven hugely -successful. Unfortunately development appears to have stopped after the -release of the version 1.1.7, around August 2011. +successful. Unfortunately new feature development on pg_reorg_ has slowed +or stopped since late 2011. -pg_repack 1.1.8 was released as a drop-in replacement for pg_reorg, addressing -some of the shortcomings of the last pg_reorg version (such as support for -PostgreSQL 9.2 and EXTENSION packaging) and known bugs. Shortly after the -first pg_repack release, pg_reorg 1.1.8 was released too, merging all the -pg_repack changes. Version 1.1.8 is the last pg_reorg release at the time of -writing. +pg_repack was initially released as a drop-in replacement for pg_reorg, +addressing some of the shortcomings of the last pg_reorg version (such as +support for PostgreSQL 9.2 and EXTENSION packaging) and known bugs. -pg_repack 1.2 is a new development line based on the original pg_reorg -codebase and offering new features. Its behaviour may be different from the -1.1.x release so it shouldn't be considered a drop-in replacement: you are -advised to check the documentation__ before upgrading from previous versions. +pg_repack 1.2 introduces further new features (parallel index builds, +ability to rebuild only indexes) and bugfixes. In some cases its behaviour +may be different from the 1.1.x release so it shouldn't be considered a +drop-in replacement: you are advised to check the documentation__ before +upgrading from previous versions. .. __: pg_repack_ .. _pg_reorg: http://reorg.projects.pgfoundry.org/ diff --git a/doc/pg_repack.rst b/doc/pg_repack.rst index 9a6c102..5a05c1f 100644 --- a/doc/pg_repack.rst +++ b/doc/pg_repack.rst @@ -450,6 +450,7 @@ Releases * Don't wait for locks held in other databases (pg_repack issue #11). * Bugfix: correctly handle key indexes with options such as DESC, NULL FIRST/LAST, COLLATE (pg_repack issue #3). + * Fixed data corruption bug on delete (pg_repack issue #23). * More helpful program output and error messages. * pg_repack 1.1.8 diff --git a/doc/release.rst b/doc/release.rst new file mode 100644 index 0000000..fddb736 --- /dev/null +++ b/doc/release.rst @@ -0,0 +1,63 @@ +What to do to release pg_repack +=============================== + +This document is the list of operations to do to release a new pg_repack +version. The version number in this document is indicated by ``$VER``: it +should be a three-digit dot-separated version, eventually followed by a +pre-release string: ``1.2.0``, ``1.2.1``, ``1.2-dev0``, ``1.2.0-beta1`` are +valid version numbers. + +In order to release the package you will accounts on Github, Freecode and PGXN +with the right privileges: contact Daniele Varrazzo to obtain them. + +- Set the right version number in ``META.json`` (note: it's in two different + places). +- Set the right release_status in ``META.json``: ``testing`` or ``stable``. +- Commit the above metadata changes. +- Create a tag, signed if possible:: + + git tag -a -s ver_$VER + +- Create a package running ``make package``. The package will be called + ``dist/pg_repack-$VER.zip``. + +- Check the packages installs and tests ok with `pgxn client`__:: + + pgxn install --sudo -- dist/pg_repack-$VER.zip + pgxn check dist/pg_repack-$VER.zip + + (note that ``check`` may require the Postgres bin directory to be added to + the path; check the ``install`` log to see where ``pg_repack`` executable + was installed). + + .. __: http://pgxnclient.projects.pgfoundry.org/ + +- Push the code changes and tags on github:: + + git push + git push --tags + +- Upload the package on http://manager.pgxn.org/. + +- Check the uploaded package works as expected:: + + pgxn install --sudo -- pg_repack + pgxn check pg_repack + +- Upload the docs by pushing in the repos at + http://reorg.github.io/pg_repack/. The operations are roughly:: + + git clone git@github.com:reorg/reorg.github.com.git + cd reorg.github.com.git + git submodule init + git submodule update + make + git commit -a -m "Docs upload for release $VER" + git push + +- Check the page http://reorg.github.io/pg_repack/ is right. + +- Announce the package on reorg-general@pgfoundry.org and + pgsql-announce@postgresql.org. + +- Announce the package on http://freecode.com/. diff --git a/lib/pg_repack.sql.in b/lib/pg_repack.sql.in index eb42436..80bc2d4 100644 --- a/lib/pg_repack.sql.in +++ b/lib/pg_repack.sql.in @@ -190,7 +190,7 @@ CREATE VIEW repack.tables AS 'INSERT INTO repack.table_' || R.oid || ' VALUES ($1.*)' AS sql_insert, 'DELETE FROM repack.table_' || R.oid || ' WHERE ' || repack.get_compare_pkey(PK.indexrelid, '$1') AS sql_delete, 'UPDATE repack.table_' || R.oid || ' SET ' || repack.get_assign(R.oid, '$2') || ' WHERE ' || repack.get_compare_pkey(PK.indexrelid, '$1') AS sql_update, - 'DELETE FROM repack.log_' || R.oid || ' WHERE id <= $1' AS sql_pop + 'DELETE FROM repack.log_' || R.oid || ' WHERE id = $1' AS sql_pop FROM pg_class R LEFT JOIN pg_class T ON R.reltoastrelid = T.oid LEFT JOIN repack.primary_keys PK diff --git a/lib/repack.c b/lib/repack.c index c2c128f..eae361a 100644 --- a/lib/repack.c +++ b/lib/repack.c @@ -282,13 +282,16 @@ repack_apply(PG_FUNCTION_ARGS) plan_update = repack_prepare(sql_update, 2, &argtypes[1]); execute_plan(SPI_OK_UPDATE, plan_update, &values[1], &nulls[1]); } + /* Delete tuple in log. + * XXX It would be a lot more efficient to perform + * this DELETE in bulk, but be careful to only + * delete log entries we have actually processed. + */ + if (plan_pop == NULL) + plan_pop = repack_prepare(sql_pop, 1, argtypes); + execute_plan(SPI_OK_DELETE, plan_pop, values, nulls); } - /* delete tuple in log */ - if (plan_pop == NULL) - plan_pop = repack_prepare(sql_pop, 1, argtypes); - execute_plan(SPI_OK_DELETE, plan_pop, values, nulls); - SPI_freetuptable(tuptable); }