Re: Using condition variables to wait for checkpoints

2019-04-05 Thread Thomas Munro
On Thu, Mar 14, 2019 at 11:05 AM Thomas Munro  wrote:
> I renamed the CVs because the names I had used before broke the
> convention that variables named ckpt_* are protected by ckpt_lck, and
> pushed.

Erm... this made successful checkpoints slightly faster but failed
checkpoints infinitely slower.  It would help if we woke up CV waiters
in the error path too.  Patch attached.

-- 
Thomas Munro
https://enterprisedb.com
From b6ad979bf2280eee1b0fbbe4c13eaefeb82743c8 Mon Sep 17 00:00:00 2001
From: Thomas Munro 
Date: Fri, 5 Apr 2019 21:43:29 +1300
Subject: [PATCH] Wake up interested backends when a checkpoint fails.

Commit c6c9474a switched to condition variables instead of sleep
loops to notify backends of checkpoint start and stop, but forgot
to broadcast in case of checkpoint failure.

Author: Thomas Munro
Discussion:
---
 src/backend/postmaster/checkpointer.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c
index d303ce3679..a1e04239ad 100644
--- a/src/backend/postmaster/checkpointer.c
+++ b/src/backend/postmaster/checkpointer.c
@@ -279,6 +279,8 @@ CheckpointerMain(void)
 			CheckpointerShmem->ckpt_done = CheckpointerShmem->ckpt_started;
 			SpinLockRelease(>ckpt_lck);
 
+			ConditionVariableBroadcast(>done_cv);
+
 			ckpt_active = false;
 		}
 
-- 
2.21.0



Re: Using condition variables to wait for checkpoints

2019-03-13 Thread Thomas Munro
On Thu, Mar 14, 2019 at 1:15 AM Robert Haas  wrote:
> On Tue, Mar 12, 2019 at 7:12 PM Andres Freund  wrote:
> > Having useful infrastructure is sure cool.
>
> Yay!

+1

I renamed the CVs because the names I had used before broke the
convention that variables named ckpt_* are protected by ckpt_lck, and
pushed.

There are some other things like this in the tree (grepping for
poll/pg_usleep loops finds examples in xlog.c, standby.c, ...).  That
might be worth looking into.

-- 
Thomas Munro
https://enterprisedb.com



Re: Using condition variables to wait for checkpoints

2019-03-13 Thread Robert Haas
On Tue, Mar 12, 2019 at 7:12 PM Andres Freund  wrote:
> Having useful infrastructure is sure cool.

Yay!

-- 
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company



Re: Using condition variables to wait for checkpoints

2019-03-12 Thread Andres Freund
Hi,

On 2019-03-13 11:56:19 +1300, Thomas Munro wrote:
> A user complained about CREATE DATABASE taking > 200ms even with fsync
> set to off.  Andres pointed out that that'd be the clunky poll/sleep
> loops in checkpointer.c.
> 
> Here's a draft patch to use condition variables instead.
> 
> Unpatched:
> 
> postgres=# checkpoint;
> CHECKPOINT
> Time: 101.848 ms
> 
> Patched:
> 
> postgres=# checkpoint;
> CHECKPOINT
> Time: 1.851 ms

Neat. That's with tiny shmem though, I bet?


> +
> + CheckpointDone
> + Waiting for a checkpoint to complete.
> +

> +
> + CheckpointStart
> + Waiting for a checkpoint to start.
> +

Not sure I like these much, but I can't quite ome up with something
meaningfully better.


Looks good to me. Having useful infrastructure is sure cool.


- Andres