Subject: [alpine-devel] extra/pgcluster

From: Cameron Banta <[email-masked]>
Date: Fri, 5 Jun 2009 10:07:05 -0500

Hello,

I updated the init scripts on this postgresql fork. (It allows multi master
replication.) I don't think my earlier patches were committed yet, so I made
a new one.

I'm working on a document in the wiki for how to set up the conf files to
get it to work.

-Cameron
From 7c07a7f05488996b05db542d5879aefafe9cbed6 Mon Sep 17 00:00:00 2001
From: Cameron Banta <[email-masked]>
Date: Fri, 5 Jun 2009 14:25:21 +0000
Subject: [PATCH] initial commit

---
 extra/pgcluster/APKBUILD        |   50 +++++++++++
 extra/pgcluster/pgcluster.confd |   57 +++++++++++++
 extra/pgcluster/pgcluster.initd |  172 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 279 insertions(+), 0 deletions(-)
 create mode 100644 extra/pgcluster/APKBUILD
 create mode 100644 extra/pgcluster/pgcluster.confd
 create mode 100644 extra/pgcluster/pgcluster.initd

diff --git a/extra/pgcluster/APKBUILD b/extra/pgcluster/APKBUILD
new file mode 100644
index 0000000..02e80c0
--- /dev/null
+++ b/extra/pgcluster/APKBUILD
@@ -0,0 +1,50 @@
+# Maintainer: Cameron Banta <[email-masked]>
+pkgname=pgcluster
+pkgver=1.9.0rc5
+pkgrel=0
+pkgdesc="PostgreSQL with multi-master cluster/replication patch"
+url="http://pgfoundry.org/projects/pgcluster/"
+license="BSD"
+depends="$pkgname-libpq"
+makedepends="readline-dev openssl-dev zlib-dev"
+subpackages="$pkgname-dev $pkgname-doc $pkgname-libpq $pkgname-client"
+source="http://pgfoundry.org/frs/download.php/1705/$pkgname-$pkgver.tar.gz
+	$pkgname.initd
+	$pkgname.confd
+	"
+
+build() {
+	cd "$srcdir"/$pkgname-$pkgver || return 1
+	./configure --prefix=/usr \
+		--mandir=/usr/share/man \
+		--with-docdir=/usr/share/doc \
+		--with-openssl \
+		|| return 1
+
+	make || return 1
+	make DESTDIR="$pkgdir" install || return 1
+
+	install -D -m755 "$srcdir"/$pkgname.initd \
+		"$pkgdir"/etc/init.d/$pkgname
+	install -D -m644 "$srcdir"/$pkgname.confd \
+		"$pkgdir"/etc/conf.d/$pkgname || return 1
+}
+
+libpq() {
+	depends="uclibc openssl"
+	pkgdesc="PGCluster libraries"
+	mkdir -p "$subpkgdir"/usr/lib
+	mv "$pkgdir"/usr/lib/libpq.so* "$subpkgdir"/usr/lib/
+}
+
+client() {
+	depends="uclibc openssl $pkgname-libpq readline"
+	pkgdesc="PGCluster client"
+	mkdir -p "$subpkgdir"/usr/bin
+	mv "$pkgdir"/usr/bin/psql "$subpkgdir"/usr/bin/
+}
+
+
+md5sums="d2fe705e25a01c19c8f8daa1fbcc55d1  pgcluster-1.9.0rc5.tar.gz
+ad21a30c7fd5ce9de1290c317492a0e5  pgcluster.initd
+503f94824fc7a385a831d7e55b74f9a0  pgcluster.confd"
diff --git a/extra/pgcluster/pgcluster.confd b/extra/pgcluster/pgcluster.confd
new file mode 100644
index 0000000..9e1376e
--- /dev/null
+++ b/extra/pgcluster/pgcluster.confd
@@ -0,0 +1,57 @@
+# PostgreSQL's Database Directory
+PGDATA="/var/lib/postgresql/pgcluster"
+
+# PostgreSQL User
+PGUSER="postgres"
+
+# PostgreSQL Group
+PGGROUP="postgres"
+
+# control what gets started by init script
+PG_START_DB="yes"
+PG_START_REPLICATE="yes"
+PG_START_LB="no"
+
+# Extra options to run postmaster with, e.g.:
+# -N is the maximal number of client connections
+# -B is the number of shared buffers and has to be at least 2x the value for -N
+# Please read the man-page to postmaster for more options. Many of these options
+# can be set directly in the configuration-file.
+#PGOPTS="-N 512 -B 1024"
+
+
+# SERVER SHUTDOWN:
+# The server will receive 3 signals in the worst case:
+# 1. SIGTERM
+#  This signals the server to ignore new connections and to
+#  wait for all clients to end their transactions before shutting down.
+#  Use WAIT_FOR_DISCONNECT to control how much time the clients
+#  should have until the next signal is being sent.
+# 2. SIGINT
+#  Tell the server to forcefully disconnect all clients.
+#  Terminating a client results in a rollback of the open transactions for this client.
+#  Use WAIT_FOR_CLEANUP to determine how much time the server has
+#  for cleanup.
+# 3. SIGQUIT
+#  This will terminate the server immediately and results in a recovery run for the next start.
+
+# Wait for clients to disconnect
+WAIT_FOR_DISCONNECT=30
+
+# Time the server has to clean up
+WAIT_FOR_CLEANUP=60
+
+# Time the server has to quit (with a recover-run on next startup)
+# Set to 0 to deactivate it
+WAIT_FOR_QUIT=60
+
+# Comment this out if you don't want to wait for the server to
+# startup before continuing.  For example, if this server is a 
+# PITR log shipping based replication standby
+WAIT_FOR_START="-w"
+
+# If you have to export environment variables for the database process,
+# this can be done here.
+#
+# Example:
+#   export R_HOME="/usr/lib/R"
diff --git a/extra/pgcluster/pgcluster.initd b/extra/pgcluster/pgcluster.initd
new file mode 100644
index 0000000..fb5cdfd
--- /dev/null
+++ b/extra/pgcluster/pgcluster.initd
@@ -0,0 +1,172 @@
+#!/sbin/runscript
+# Copyright 1999-2008 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/files/postgresql.init-8.3,v 1.4 2008/09/28 22:53:02 caleb Exp $
+
+opts="${opts} reload setup"
+
+depend() {
+	use net
+	provide postgresql
+}
+
+checkconfig() {
+	if [ ! -d "$PGDATA" ] ; then
+		eerror "Directory not found: $PGDATA"
+		eerror "Please make sure that PGDATA points to the right path."
+		eerror "You can run '/etc/init.d/pgcluster setup' to setup a new database cluster."
+		return 1
+	fi
+}
+
+start() {
+	checkconfig || return 1
+
+	#ebegin "Starting PostgreSQL"
+
+	if [ -f "$PGDATA/postmaster.pid" ] ; then
+		rm -f "$PGDATA/postmaster.pid"
+	fi
+
+	local retval
+
+	if [ ${PG_START_DB} == "yes" ]; then 
+		ebegin "Starting PGCluster database instance"
+		su -l ${PGUSER} \
+			-c "env PGDATA=\"${PGDATA}\" /usr/bin/pg_ctl start ${WAIT_FOR_START} -o '--silent-mode=true ${PGOPTS}'" >/dev/null
+		retval=$?
+		if [ $retval -ne 0 ]; then
+			eend $retval 
+		else
+
+			# The following is to catch the case of an already running server
+			# in which pg_ctl doesn't know to which server it connected to and false reports the server as 'up'
+			sleep 2
+			if [ ! -f "$PGDATA/postmaster.pid" ] ; then
+				eerror "The pid-file doesn't exist but pg_ctl reported a running server."
+				eerror "Please check whether there is another server running on the same port or read the log-file."
+				eend 1 
+			else
+				local pid=$(grep "^[0-9]\+" "$PGDATA/postmaster.pid")
+				test -d /proc/"${pid}" 
+				eend $?
+			fi
+		fi
+	fi
+
+	if [ ${PG_START_REPLICATE} == "yes" ]; then
+		ebegin "Starting PGCluster replicate instance"
+		su -l ${PGUSER} \
+			-c "env PGDATA=\"${PGDATA}\" /usr/bin/pgreplicate -D ${PGDATA} -l" >/dev/null
+		retval=$?
+		sleep 1
+		if [ ! -f "$PGDATA/pgreplicate.pid" ] ; then
+			eerror "Where's the pid file?"
+			eend 1 
+		else
+			local pid=$(grep "^[0-9]\+" "$PGDATA/pgreplicate.pid")
+			test -d /proc/"${pid}" 
+			eend $?
+		fi
+	fi
+
+	if [ ${PG_START_LB} == "yes" ]; then
+		ebegin "Starting PGCluster load balancer instance"
+		su -l ${PGUSER} \
+			-c "env PGDATA=\"${PGDATA}\" /usr/bin/pglb -D ${PGDATA} -l" >/dev/null
+		retval=$?
+		sleep 1
+		if [ ! -f "$PGDATA/pglb.pid" ] ; then
+			eerror "Where's the pid file?"
+			eend 1 
+		else
+			local pid=$(grep "^[0-9]\+" "$PGDATA/pglb.pid")
+			test -d /proc/"${pid}" 
+			eend $?
+		fi
+	fi
+	return
+}
+
+stop() {
+	local retval
+
+	if [ ${PG_START_LB} == "yes" ]; then
+		ebegin "Stopping PGCluster Load Balancer instance"
+		su -l ${PGUSER} \
+			-c "env PGDATA=\"${PGDATA}\" /usr/bin/pglb -D ${PGDATA} -l stop" >/dev/null
+		eend $?
+	fi
+	if [ ${PG_START_REPLICATE} == "yes" ]; then
+		ebegin "Stopping PGCluster Replicate instance"
+		su -l ${PGUSER} \
+			-c "env PGDATA=\"${PGDATA}\" /usr/bin/pgreplicate -D ${PGDATA} -l stop" >/dev/null
+		eend $?
+	fi
+
+
+	if [ ${PG_START_DB} == "yes" ]; then 
+		ebegin "Stopping PGCLuster database (this can take up to $(( ${WAIT_FOR_DISCONNECT} + ${WAIT_FOR_CLEANUP} )) seconds)"
+		if [ ! -f "$PGDATA/postmaster.pid" ] ; then
+			ewarn "$PGDATA/postmaster.pid not found. Was it running?"
+			eend 1
+			return 0
+		fi
+		su -l ${PGUSER} \
+			-c "env PGDATA=\"${PGDATA}\" /usr/bin/pg_ctl stop -t ${WAIT_FOR_DISCONNECT} -m smart" >/dev/null
+
+		retval=$?
+		[ $retval -eq 0 ] && eend $retval && return $retval
+
+		ewarn "Some clients did not disconnect within ${WAIT_FOR_DISCONNECT} seconds."
+		ewarn "Going to shutdown the server anyway."
+
+		su -l ${PGUSER} \
+			-c "env PGDATA=\"${PGDATA}\" /usr/bin/pg_ctl stop -m fast" >/dev/null
+
+		retval=$?
+		[ $retval -eq 0 ] && eend $retval && return $retval
+
+		if [ ${WAIT_FOR_QUIT} -eq 0 ] ; then
+			eerror "Server did not shut down and sending the SIGQUIT has been disabled."
+			eend $retval
+			return $retval
+		fi
+
+		ewarn "Shutting down the server gracefully failed."
+		ewarn "Forcing it to shutdown which leads to a recover-run on next startup."
+
+		su -l ${PGUSER} \
+			-c "env PGDATA=\"${PGDATA}\" /usr/bin/pg_ctl stop -m immediate" >/dev/null
+
+		retval=$?
+		[ $retval -eq 0 ] && eend $retval && return $retval
+
+		eerror "Forced shutdown failed!!! Something is wrong with your system, please take care of it manually."
+		eend $?
+	fi
+}
+
+reload() {
+	ebegin "Reloading PostgreSQL configuration"
+	su -l ${PGUSER} \
+		-c "env PGDATA=\"${PGDATA}\" /usr/bin/pg_ctl reload" >/dev/null
+	eend $?
+}
+
+setup() { 
+	ebegin "Creating a new PGCluster database cluster" 
+	if [ -d "${PGDATA}" ] ; then 
+		eend 1 "${PGDATA} already exist" 
+		return 
+	fi 
+	mkdir -p "${PGDATA}" 
+	chown -Rf postgres:postgres "${PGDATA}" 
+	chmod 0700 "${PGDATA}" 
+	cd "${PGDATA}" # to avoid the: could not change directory to "/root" 
+	su -c "/usr/bin/initdb --pgdata ${PGDATA}" postgres
+	einfo "You can use the '/etc/init.d/pgcluster' script to run PostgreSQL instead"
+	einfo "of 'pg_ctl'."
+	eend $? 
+} 
+
-- 
1.6.2.5

---

From: Michael Mason <[email-masked]>
Date: Sat, 6 Jun 2009 01:01:15 +0000

On Jun 5, 2009, at 3:07 PM, Cameron Banta wrote:

> Hello,
>
> I updated the init scripts on this postgresql fork. (It allows multi  
> master replication.) I don't think my earlier patches were committed  
> yet, so I made a new one.
>
> I'm working on a document in the wiki for how to set up the conf  
> files to get it to work.
>

Patch Applied.
http://git.alpinelinux.org/cgit/aports-mmason/

> -Cameron
> <extra_pgcluster_0001-initial-commit.patch>

---
Unsubscribe:  [email-masked]
Help:         [email-masked]
---

---

From: Natanael Copa <[email-masked]>
Date: Sat, 06 Jun 2009 21:31:46 +0200

> > yet, so I made a new one.

The fixed patch drowned in my inbox. sorry about that.

> > I'm working on a document in the wiki for how to set up the conf  

I had a short look at it. Replicating postgres... *really* cool! Thanks
for those patches.

> http://git.alpinelinux.org/cgit/aports-mmason/

Mike, Thanks alot for taking care of the patches!

-nc

---