Add pg_isready post
This commit is contained in:
parent
209a2ba957
commit
2f3e9f0565
|
@ -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 $@
|
||||||
|
```
|
Loading…
Reference in New Issue