Add pg_isready post

This commit is contained in:
Rob Watson 2018-01-23 13:48:54 +00:00
parent 209a2ba957
commit 2f3e9f0565
1 changed files with 35 additions and 0 deletions

View File

@ -0,0 +1,35 @@
---
layout: post
title: "Using pg_isready to optimize test runs"
slug: pg_isready
date: 2018-01-23 13:00:00 +0000
categories: postgresql bash
---
While working with Docker Compose to set up a containerized RSpec testing environment today, I ran into a problem.
RSpec, running in one container, was intermittently trying to access the PostgreSQL database, located in a second container, before it had finished booting. Naturally, this was causing sporadic connection errors and test failures.
The testing environment was distributed, with many discrete Docker Compose applications running in parallel. And PostgreSQL's launch time varied considerably, sometimes being under a couple of seconds, but occasionally taking ten seconds or more.
This meant that naively setting a timeout (`sleep 5 && bundle exec rspec`...) was an unsatisfactory approach. It would have increased the run time of every test environment, but without completely solving the problem.
While researching the most appropriate solution, I discovered a useful tool. [`pg_isready`](https://www.postgresql.org/docs/9.3/static/app-pg-isready.html) allows a PostgreSQL database's status to be queried quickly and simply from a script or the command line.
Once I'd found it, using it in the RSpec container's entrypoint script was simple:
```bash
#!/bin/bash
set -e
echo "Launching Rails $RAILS_ENV environment with target: $@"
until pg_isready -q -d my_database_name
do
echo "Waiting for database to be ready..."
sleep 1
done
bundle exec rake db:reset
bundle exec rspec $@
```