Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1if8cd-0006fQ-FN for pgsql-bugs@arkaria.postgresql.org; Wed, 11 Dec 2019 20:30:11 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1if8cb-0001tu-La for pgsql-bugs@arkaria.postgresql.org; Wed, 11 Dec 2019 20:30:09 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1if8cb-0001ql-6T for pgsql-bugs@lists.postgresql.org; Wed, 11 Dec 2019 20:30:09 +0000 Received: from mail-lj1-x243.google.com ([2a00:1450:4864:20::243]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1if8cX-0006lZ-CV for pgsql-bugs@lists.postgresql.org; Wed, 11 Dec 2019 20:30:07 +0000 Received: by mail-lj1-x243.google.com with SMTP id c19so25489460lji.11 for ; Wed, 11 Dec 2019 12:30:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-language; bh=gFq8K6qi5wglgrt7rUhwUgzuUB7uLepoRLbfLy2kqAg=; b=Eg5rDz00ntpImb3TdwZCRBf51WNSr4OGByd7bP85zyN2bTNp4z/26teS21SGQFR0g3 ZUSZ2Tk7Mwv5b0jaPbKMlvyLBUrjULSBTtZW5trPGb+ejTG4+wqqUiFNVmOeF9VpurHJ OBHVB2Gt++lHXEzMGwjxZPTmwxEiVmvFvOZzhoGivxRLWTph7qv8NwgPr/NjwQq3csTa eORl4zUtyNEAz9rQeZNqopq0Vw76br9GoOsTjG/Y1dET22eYi+vpUUMs1ZxU0E697Ou4 TOtN7tgWLSFmbydN4LvXIt3e2uIoIMBaoRhEQBCqjduOtHwshOQFWz8YSiF1wXWryDp8 GNfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language; bh=gFq8K6qi5wglgrt7rUhwUgzuUB7uLepoRLbfLy2kqAg=; b=N8jpp9Cxr5dK9gvoAi3nVF6hT0pt4aSkoI/a+S/wrDTeK3YUgg9dD245i/5CoKe2RH XASwpHCj6Mq43oVwAl+Iti6ZclcAWWdiUOqr1dm/wcQ9QK+sIiZwVBkBrV9n/R+lfOsQ QEMc4HTrvqJlLhSz7HgfoANrlIiYWcm1yNJJuUlZBBEKy2J6qPZaG/VIp+vjAnVChCHw PcgPptM8Lj/X9pwA+Q6dMqgaZG5ulcTfVxque3uX2PGV9EeXGm/+kVcBM9z9Fl6nv6mV H/+VOoTCaFWZ4PFo3f6LpcW+HmCnjERkDU+6fzY+nPEcUIP+1pxuzovzQdEINC+brN+B t+1w== X-Gm-Message-State: APjAAAXsOhkCpAEgePcRuOVzPSOlnjSb0B9cZvBauHx+dw/5+VyOX8v4 kA7GajT0y8mroKSitmXKAJ4= X-Google-Smtp-Source: APXvYqzRj+9nsN8uK0ddnuF1GEZ/6R0c9rNclr3EQOhxEiDiqFhURKs4db5bUozbYO2Zi/+p8od1Uw== X-Received: by 2002:a2e:b045:: with SMTP id d5mr3539863ljl.184.1576096203740; Wed, 11 Dec 2019 12:30:03 -0800 (PST) Received: from [1.0.0.7] ([178.155.4.41]) by smtp.gmail.com with ESMTPSA id g14sm1766158ljj.37.2019.12.11.12.30.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Dec 2019 12:30:02 -0800 (PST) Subject: Re: BUG #16161: pg_ctl stop fails sometimes (on Windows) To: pgsql-bugs@lists.postgresql.org, PG Bug reporting form References: <16161-7a985d2f1bbe8f71@postgresql.org> From: Alexander Lakhin Message-ID: <4d28c7e1-fe91-b9fd-3227-478e549b05d5@gmail.com> Date: Wed, 11 Dec 2019 23:30:01 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.7.2 MIME-Version: 1.0 In-Reply-To: <16161-7a985d2f1bbe8f71@postgresql.org> Content-Type: multipart/mixed; boundary="------------5E32B2FC4D694F266C93B710" Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk This is a multi-part message in MIME format. --------------5E32B2FC4D694F266C93B710 Content-Type: multipart/alternative; boundary="------------2036BFDF6F37579CBDDBF5C4" --------------2036BFDF6F37579CBDDBF5C4 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit 11.12.2019 23:00, PG Bug reporting form wrote: > The following bug has been logged on the website: > > Bug reference: 16161 > Logged by: Alexander Lakhin > Email address: exclusion@gmail.com > PostgreSQL version: 12.1 > Operating system: Windows > Description: > > The regression tests on Windows sometimes fail with 'Permission denied' > errors. For example: > https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=dory&dt=2019-12-11%2007%3A45%3A33 > > ============== shutting down postmaster ============== > pg_ctl: could not open PID file > "c:/pgbuildfarm/pgbuildroot/HEAD/pgsql.build/src/test/regress/./tmp_check/data/postmaster.pid": > Permission denied > > This error occurs when pg_ctl is trying to open postmaster.pid while this > file is in "delete pending" state > (https://stackoverflow.com/questions/3764072/). To reproduce the issue reliably I propose a simple modification to synchronize unlink() with open() and a simple test (sync_pid_ops+test.patch). With the patch applied, `vcregress taptest src/test/restart` fails for me on iteration 47, 6, 7, 42, 51, 26, ... I see two ways to fix the issue: 1) Unlink postmaster.pid using rename operation (adopt the solution from https://stackoverflow.com/questions/3764072/). 2) Ignore such 'Permission denied' error and just try to open the file once again (attached fix_open_for_unlink.patch implements this). I'm inclined to the second approach as pgwin32_open() already handles two transient states (Windows-only), and it could be useful not only for postmaster.pid, but for some other files. Best regards, Alexander --------------2036BFDF6F37579CBDDBF5C4 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit
11.12.2019 23:00, PG Bug reporting form wrote:
The following bug has been logged on the website:

Bug reference:      16161
Logged by:          Alexander Lakhin
Email address:      exclusion@gmail.com
PostgreSQL version: 12.1
Operating system:   Windows
Description:        

The regression tests on Windows sometimes fail with 'Permission denied'
errors. For example:
https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=dory&dt=2019-12-11%2007%3A45%3A33

============== shutting down postmaster               ==============
pg_ctl: could not open PID file
"c:/pgbuildfarm/pgbuildroot/HEAD/pgsql.build/src/test/regress/./tmp_check/data/postmaster.pid":
Permission denied

This error occurs when pg_ctl is trying to open postmaster.pid while this
file is in "delete pending" state
(https://stackoverflow.com/questions/3764072/).
To reproduce the issue reliably I propose a simple modification to synchronize unlink() with open() and a simple test (sync_pid_ops+test.patch).
With the patch applied, `vcregress taptest src/test/restart` fails for me on iteration 47, 6, 7, 42, 51, 26, ...

I see two ways to fix the issue:
1) Unlink postmaster.pid using rename operation (adopt the solution from https://stackoverflow.com/questions/3764072/).
2) Ignore such 'Permission denied' error and just try to open the file once again (attached fix_open_for_unlink.patch implements this).


I'm inclined to the second approach as pgwin32_open() already handles two transient states (Windows-only), and it could be useful not only for postmaster.pid, but for some other files.


Best regards,
Alexander

--------------2036BFDF6F37579CBDDBF5C4-- --------------5E32B2FC4D694F266C93B710 Content-Type: text/x-patch; name="sync_pid_ops+test.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="sync_pid_ops+test.patch" diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index de554e28cf..0594b6649f 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -838,6 +838,13 @@ UnlinkLockFiles(int status, Datum arg) { ListCell *l; +#ifdef WIN32 +{ +FILETIME time; +do { GetSystemTimePreciseAsFileTime(&time); } +while (((((ULONGLONG) time.dwHighDateTime) << 32) + time.dwLowDateTime) % 10000000L > (10000L)); +} +#endif foreach(l, lock_files) { char *curfile = (char *) lfirst(l); diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index b0858411ed..3ab1608a5d 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -276,6 +276,14 @@ get_pgpid(bool is_status_request) exit(is_status_request ? 4 : 1); } +#ifdef WIN32 +{ +FILETIME time; +do { GetSystemTimePreciseAsFileTime(&time); } +while (((((ULONGLONG) time.dwHighDateTime) << 32) + time.dwLowDateTime) % 10000000L > (10000L)); +} +#endif + pidf = fopen(pid_file, "r"); if (pidf == NULL) { diff --git a/src/test/restart/t/001_restart.pl b/src/test/restart/t/001_restart.pl new file mode 100644 index 0000000000..f0621d7f27 --- /dev/null +++ b/src/test/restart/t/001_restart.pl @@ -0,0 +1,20 @@ +use strict; +use warnings; +use PostgresNode; +use TestLib; +use Test::More; +use Config; + +my $node = get_new_node('master'); +$node->init(); + +for ( my $i = 1; $i <= 1000; $i++ ) { + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); + diag( sprintf("%02d:%02d:%02d iteration %d", $hour, $min, $sec, $i) ); + $node->start; + $node->stop; +} + +ok(1, 'node start/stop test'); + +done_testing(); --------------5E32B2FC4D694F266C93B710 Content-Type: text/x-patch; name="fix_open_for_unlink.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="fix_open_for_unlink.patch" diff --git a/src/port/open.c b/src/port/open.c index f37afc7512..dad328f000 100644 --- a/src/port/open.c +++ b/src/port/open.c @@ -135,6 +135,21 @@ pgwin32_open(const char *fileName, int fileFlags,...) continue; } + /* + * ERROR_ACCESS_DENIED can be returned while the file is deleted + * (Windows NT status code is STATUS_DELETE_PENDING). + * https://stackoverflow.com/questions/3764072/ + * Try again for 1 second to check whether the "access denied" + * condition persists. + */ + if (err == ERROR_ACCESS_DENIED) { + if (loops < 10) { + pg_usleep(100000); + loops++; + continue; + } + } + _dosmaperr(err); return -1; } --------------5E32B2FC4D694F266C93B710--