Intermittent pg_ctl failures on Windows
The buildfarm's Windows members occasionally show weird pg_ctl failures,
for instance this recent case:
https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=bowerbird&dt=2018-03-10%2020%3A30%3A20
### Restarting node "master"
# Running: pg_ctl -D G:/prog/bf/root/HEAD/pgsql.build/src/test/recovery/tmp_check/t_006_logical_decoding_master_data/pgdata -l G:/prog/bf/root/HEAD/pgsql.build/src/test/recovery/tmp_check/log/006_logical_decoding_master.log restart
waiting for server to shut down.... done
server stopped
waiting for server to start....The process cannot access the file because it is being used by another process.
stopped waiting
pg_ctl: could not start server
Examine the log output.
Bail out! system pg_ctl failed
or this one:
https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=bowerbird&dt=2017-12-29%2023%3A30%3A24
### Stopping node "subscriber" using mode fast
# Running: pg_ctl -D c:/prog/bf/root/HEAD/pgsql.build/src/test/subscription/tmp_check/t_001_rep_changes_subscriber_data/pgdata -m fast stop
waiting for server to shut down....pg_ctl: could not open PID file "c:/prog/bf/root/HEAD/pgsql.build/src/test/subscription/tmp_check/t_001_rep_changes_subscriber_data/pgdata/postmaster.pid": Permission denied
Bail out! system pg_ctl failed
I'd been writing these off as Microsoft randomness and/or antivirus
interference, but it suddenly occurred to me that there might be a
consistent explanation: since commit f13ea95f9, when pg_ctl is waiting
for server start/stop, it is trying to read postmaster.pid more-or-less
concurrently with the postmaster writing to that file. On Unix that's not
much of a problem, but I believe that on Windows you have to specifically
open the file with sharing enabled, or you get error messages like these.
The postmaster should be enabling sharing, because port.h redirects
open/fopen to pgwin32_open/pgwin32_fopen which enable the sharing flags.
But it only does that #ifndef FRONTEND. So pg_ctl is just using naked
open(), which could explain these failures.
If this theory is accurate, it should be pretty easy to replicate the
problem if you modify the postmaster to hold postmaster.pid open longer
when rewriting it, e.g. stick fractional-second sleeps into CreateLockFile
and AddToDataDirLockFile.
I'm not in a position to investigate this in detail nor test a fix,
but I think somebody should.
regards, tom lane
Hi Tom,
This is a great catch. I am looking into it: I will start by reproducing the error as you suggested.
Thanks,
Badrul
-----Original Message-----
From: Tom Lane [mailto:tgl@sss.pgh.pa.us]
Sent: Saturday, March 10, 2018 2:48 PM
To: pgsql-hackers@lists.postgresql.org
Subject: Intermittent pg_ctl failures on Windows
The buildfarm's Windows members occasionally show weird pg_ctl failures, for instance this recent case:
### Restarting node "master"
# Running: pg_ctl -D G:/prog/bf/root/HEAD/pgsql.build/src/test/recovery/tmp_check/t_006_logical_decoding_master_data/pgdata -l G:/prog/bf/root/HEAD/pgsql.build/src/test/recovery/tmp_check/log/006_logical_decoding_master.log restart waiting for server to shut down.... done server stopped waiting for server to start....The process cannot access the file because it is being used by another process.
stopped waiting
pg_ctl: could not start server
Examine the log output.
Bail out! system pg_ctl failed
or this one:
### Stopping node "subscriber" using mode fast # Running: pg_ctl -D c:/prog/bf/root/HEAD/pgsql.build/src/test/subscription/tmp_check/t_001_rep_changes_subscriber_data/pgdata -m fast stop waiting for server to shut down....pg_ctl: could not open PID file "c:/prog/bf/root/HEAD/pgsql.build/src/test/subscription/tmp_check/t_001_rep_changes_subscriber_data/pgdata/postmaster.pid": Permission denied Bail out! system pg_ctl failed
I'd been writing these off as Microsoft randomness and/or antivirus interference, but it suddenly occurred to me that there might be a consistent explanation: since commit f13ea95f9, when pg_ctl is waiting for server start/stop, it is trying to read postmaster.pid more-or-less concurrently with the postmaster writing to that file. On Unix that's not much of a problem, but I believe that on Windows you have to specifically open the file with sharing enabled, or you get error messages like these.
The postmaster should be enabling sharing, because port.h redirects open/fopen to pgwin32_open/pgwin32_fopen which enable the sharing flags.
But it only does that #ifndef FRONTEND. So pg_ctl is just using naked open(), which could explain these failures.
If this theory is accurate, it should be pretty easy to replicate the problem if you modify the postmaster to hold postmaster.pid open longer when rewriting it, e.g. stick fractional-second sleeps into CreateLockFile and AddToDataDirLockFile.
I'm not in a position to investigate this in detail nor test a fix, but I think somebody should.
regards, tom lane
Hello!
We reproduced these errors on out buildfarm and my windows workstation.
We used small TAP test that restarts PostgresNode in loop. Additionally,
constant WAITS_PER_SEC in the pg_ctl.c file has been increased 1000
times.
There are two different problems with pg_ctl:
1 - share access to postmaster.pid;
2 - share access to logfile. Postmaster runs in the shell (CMD.EXE).
When the server stops cmd.exe may blocks logfile from been opened by new
cmd.exe.
waiting for server to shut down.... done
server stopped
waiting for server to start....The process cannot access the file
because it is being used by another process.
stopped waiting
pg_ctl: could not start server
Examine the log output.
To avoid the first error we made two changes:
pg_ctl now opens the postmaster.pid file using pgwin32_open() function
to correctly handle share locks.
On Windows systems we cannot handle ERROR_DELETE_PENDING because
GetLastError() returns ERROR_ACCESS_DENIED instead.
So we rename the lock files before delete them.
To avoid the second error we added the wait for cmd.exe finish in the
do_stop() and do_restart() functions.
Git patch is in the attachment.
On 2018-03-12 18:55, Badrul Chowdhury wrote:
Hi Tom,
This is a great catch. I am looking into it: I will start by
reproducing the error as you suggested.Thanks,
Badrul-----Original Message-----
From: Tom Lane [mailto:tgl@sss.pgh.pa.us]
Sent: Saturday, March 10, 2018 2:48 PM
To: pgsql-hackers@lists.postgresql.org
Subject: Intermittent pg_ctl failures on WindowsThe buildfarm's Windows members occasionally show weird pg_ctl
failures, for instance this recent case:### Restarting node "master"
# Running: pg_ctl -D
G:/prog/bf/root/HEAD/pgsql.build/src/test/recovery/tmp_check/t_006_logical_decoding_master_data/pgdata
-l
G:/prog/bf/root/HEAD/pgsql.build/src/test/recovery/tmp_check/log/006_logical_decoding_master.log
restart waiting for server to shut down.... done server stopped
waiting for server to start....The process cannot access the file
because it is being used by another process.
stopped waiting
pg_ctl: could not start server
Examine the log output.
Bail out! system pg_ctl failedor this one:
### Stopping node "subscriber" using mode fast # Running: pg_ctl -D
c:/prog/bf/root/HEAD/pgsql.build/src/test/subscription/tmp_check/t_001_rep_changes_subscriber_data/pgdata
-m fast stop waiting for server to shut down....pg_ctl: could not open
PID file
"c:/prog/bf/root/HEAD/pgsql.build/src/test/subscription/tmp_check/t_001_rep_changes_subscriber_data/pgdata/postmaster.pid":
Permission denied Bail out! system pg_ctl failedI'd been writing these off as Microsoft randomness and/or antivirus
interference, but it suddenly occurred to me that there might be a
consistent explanation: since commit f13ea95f9, when pg_ctl is waiting
for server start/stop, it is trying to read postmaster.pid
more-or-less concurrently with the postmaster writing to that file.
On Unix that's not much of a problem, but I believe that on Windows
you have to specifically open the file with sharing enabled, or you
get error messages like these.
The postmaster should be enabling sharing, because port.h redirects
open/fopen to pgwin32_open/pgwin32_fopen which enable the sharing
flags.
But it only does that #ifndef FRONTEND. So pg_ctl is just using naked
open(), which could explain these failures.If this theory is accurate, it should be pretty easy to replicate the
problem if you modify the postmaster to hold postmaster.pid open
longer when rewriting it, e.g. stick fractional-second sleeps into
CreateLockFile and AddToDataDirLockFile.I'm not in a position to investigate this in detail nor test a fix,
but I think somebody should.regards, tom lane
--
regars, Roman Zharkov
Attachments:
pg_ctl.patchtext/x-diff; name=pg_ctl.patchDownload
From 7db244f6224d772a0c0fb26e6dfc38b2bad7a93e Mon Sep 17 00:00:00 2001
From: Roman Zharkov <r.zharkov@postgrespro.ru>
Date: Fri, 12 Jul 2019 13:01:58 +0700
Subject: [PATCH] [refer #PGPRO-2846] Avoid share locks on log_file between old
and new cmd.exe when the server restarts. pg_ctl now opens the postmaster.pid
file using pgwin32_open() function to correctly handle share locks. On
Windows systems we cannot handle ERROR_DELETE_PENDING because GetLastError()
returns ERROR_ACCESS_DENIED instead. So we rename the lock files before
delete them. Discussion:
https://www.postgresql.org/message-id/flat/16922.1520722108%40sss.pgh.pa.us
---
src/backend/utils/init/miscinit.c | 18 ++++-
src/bin/pg_ctl/pg_ctl.c | 135 ++++++++++++++++++++++++++++++++++++++
2 files changed, 150 insertions(+), 3 deletions(-)
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c
index ce929d8806..32a3e9520f 100644
--- a/src/backend/utils/init/miscinit.c
+++ b/src/backend/utils/init/miscinit.c
@@ -840,9 +840,21 @@ UnlinkLockFiles(int status, Datum arg)
foreach(l, lock_files)
{
- char *curfile = (char *) lfirst(l);
-
- unlink(curfile);
+ /*
+ * On Windows systems we cannot handle ERROR_DELETE_PENDING
+ * because GetLastError() returns ERROR_ACCESS_DENIED instead.
+ * So rename the file first.
+ */
+ char *tmpfile;
+ char *curfile = (char *)lfirst(l);
+ tmpfile = psprintf("%s.deleted", curfile);
+ if (rename(curfile, tmpfile) == 0) {
+ unlink(tmpfile);
+ }
+ else {
+ unlink(curfile);
+ }
+ pfree(tmpfile);
/* Should we complain if the unlink fails? */
}
/* Since we're about to exit, no need to reclaim storage */
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index ed2396aa6c..6b6705e0f2 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -31,6 +31,8 @@
#ifdef WIN32 /* on Unix, we don't need libpq */
#include "pqexpbuffer.h"
+#include "windows.h"
+#include "tlhelp32.h"
#endif
/* PID can be negative for standalone backend */
@@ -75,6 +77,11 @@ typedef enum
static bool do_wait = true;
static int wait_seconds = DEFAULT_WAIT;
+#ifdef WIN32
+static int windows_shell_wait_seconds = 1;
+#define open(a,b,c) pgwin32_open(a,b,c) /* It is not necessary to include whole port.h */
+#define fopen(a,b) pgwin32_fopen(a,b)
+#endif
static bool wait_seconds_arg = false;
static bool silent_mode = false;
static ShutdownMode shutdown_mode = FAST_MODE;
@@ -110,6 +117,8 @@ static pid_t postmasterPID = -1;
#define shutdownEvent shutdownHandles[0]
#define postmasterProcess shutdownHandles[1]
+static pgpid_t pgwin32_getppid(pgpid_t pid);
+static bool pgwin32_parent_shell_is_alive(pid_t pid);
#endif
@@ -867,6 +876,12 @@ do_stop(void)
pid = get_pgpid(false);
+#ifdef WIN32
+ /* On Windows systems we must additionaly check status of the processes after server stops */
+ pgpid_t postmasters_shell_pid;
+ postmasters_shell_pid = pgwin32_getppid(pid);
+#endif
+
if (pid == 0) /* no pid file */
{
write_stderr(_("%s: PID file \"%s\" does not exist\n"), progname, pid_file);
@@ -934,6 +949,32 @@ do_stop(void)
"waiting for session-initiated disconnection.\n"));
exit(1);
}
+
+#ifdef WIN32
+ /*
+ * On Windows systems postmaster's shell may still run after postmaster.pid file has deleted.
+ * This may lead to share locks on log_file between old and new cmd.exe when the server restarts.
+ * The share locks do not allow the new cmd.exe to run.
+ */
+ if (postmasters_shell_pid > 0 && pgwin32_parent_shell_is_alive(postmasters_shell_pid))
+ {
+ print_msg(_("\npostmaster's shell is still alive. waiting for server to shut down again..."));
+ /* wait for stop */
+ for (cnt = 0; cnt < windows_shell_wait_seconds * WAITS_PER_SEC; cnt++)
+ {
+ if (pgwin32_parent_shell_is_alive(postmasters_shell_pid))
+ {
+ if (cnt % WAITS_PER_SEC == 0)
+ print_msg(".");
+ pg_usleep(USEC_PER_SEC / WAITS_PER_SEC);
+ }
+ else
+ break;
+ }
+ /* Do not fail if the parent process is still running. */
+ }
+#endif
+
print_msg(_(" done\n"));
print_msg(_("server stopped\n"));
@@ -954,6 +995,12 @@ do_restart(void)
pid = get_pgpid(false);
+#ifdef WIN32
+ /* On Windows systems we must additionaly check status of the processes after server stops */
+ pgpid_t postmasters_shell_pid;
+ postmasters_shell_pid = pgwin32_getppid(pid);
+#endif
+
if (pid == 0) /* no pid file */
{
write_stderr(_("%s: PID file \"%s\" does not exist\n"),
@@ -1026,6 +1073,31 @@ do_restart(void)
exit(1);
}
+#ifdef WIN32
+ /*
+ * On Windows systems postmaster's shell may still run after postmaster.pid file has deleted.
+ * This may lead to share locks on log_file between old and new cmd.exe when the server restarts.
+ * The share locks do not allow the new cmd.exe to run.
+ */
+ if (postmasters_shell_pid > 0 && pgwin32_parent_shell_is_alive(postmasters_shell_pid))
+ {
+ print_msg(_("\npostmaster's shell is still alive. waiting for server to shut down again..."));
+ /* wait for stop */
+ for (cnt = 0; cnt < windows_shell_wait_seconds * WAITS_PER_SEC; cnt++)
+ {
+ if (pgwin32_parent_shell_is_alive(postmasters_shell_pid))
+ {
+ if (cnt % WAITS_PER_SEC == 0)
+ print_msg(".");
+ pg_usleep(USEC_PER_SEC / WAITS_PER_SEC);
+ }
+ else
+ break;
+ }
+ /* Do not fail if the parent process is still running. */
+ }
+#endif
+
print_msg(_(" done\n"));
print_msg(_("server stopped\n"));
}
@@ -1176,6 +1248,69 @@ do_promote(void)
* utility routines
*/
+#ifdef WIN32
+static pgpid_t
+pgwin32_getppid(pgpid_t pid)
+{
+ /* Finds parent process id. Returns 0 by default. */
+ HANDLE hSnapshot;
+ PROCESSENTRY32 pe32;
+ pgpid_t ppid = 0;
+
+ hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, (DWORD)pid);
+ __try{
+ if (hSnapshot == INVALID_HANDLE_VALUE) __leave;
+
+ ZeroMemory(&pe32, sizeof(pe32));
+ pe32.dwSize = sizeof(pe32);
+ if (!Process32First(hSnapshot, &pe32)) __leave;
+
+ do{
+ if (pe32.th32ProcessID == pid){
+ ppid = (pgpid_t)pe32.th32ParentProcessID;
+ break;
+ }
+ } while (Process32Next(hSnapshot, &pe32));
+
+ }
+ __finally{
+ if (hSnapshot != INVALID_HANDLE_VALUE) CloseHandle(hSnapshot);
+ }
+ return ppid;
+}
+
+static bool
+pgwin32_parent_shell_is_alive(pid_t pid)
+{
+ {
+ /* Checks the parent cmd.exe with specified pid is running */
+ HANDLE hSnapshot;
+ PROCESSENTRY32 pe32;
+ bool res = false;
+
+ hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, (DWORD)pid);
+ __try{
+ if (hSnapshot == INVALID_HANDLE_VALUE) __leave;
+
+ ZeroMemory(&pe32, sizeof(pe32));
+ pe32.dwSize = sizeof(pe32);
+ if (!Process32First(hSnapshot, &pe32)) __leave;
+
+ do{
+ if (pe32.th32ProcessID == pid && strcmp(pe32.szExeFile, "cmd.exe") == 0){
+ res = true;
+ }
+ } while (Process32Next(hSnapshot, &pe32));
+
+ }
+ __finally{
+ if (hSnapshot != INVALID_HANDLE_VALUE) CloseHandle(hSnapshot);
+ }
+ return res;
+ }
+}
+#endif
+
static bool
postmaster_is_alive(pid_t pid)
{
--
2.14.1.windows.1
r.zharkov@postgrespro.ru writes:
pg_ctl now opens the postmaster.pid file using pgwin32_open() function
to correctly handle share locks.
HEAD already does that, no? See f02259fe9.
On Windows systems we cannot handle ERROR_DELETE_PENDING because
GetLastError() returns ERROR_ACCESS_DENIED instead.
So we rename the lock files before delete them.
This seems improbably broken/stupid. Also, I've not seen any buildfarm
failures that would match this; it's always pg_ctl complaining not the
postmaster.
To avoid the second error we added the wait for cmd.exe finish in the
do_stop() and do_restart() functions.
Hmmm ... there seems the germ of a good idea here, but can't we do
it with less (and less ugly) code?
Alternatively, perhaps we could fix things so that the parent cmd.exe
shell isn't involved in logfile access? That'd require teaching the
postmaster to open/redirect its stdout/stderr, which is kind of
annoying, but it might beat hacking things as you have done here.
regards, tom lane
On 2019-07-17 20:51, Tom Lane wrote:
r.zharkov@postgrespro.ru writes:
pg_ctl now opens the postmaster.pid file using pgwin32_open() function
to correctly handle share locks.HEAD already does that, no? See f02259fe9.
You are right. I tested branch REL_11_STABLE and it is my mistake.
On Windows systems we cannot handle ERROR_DELETE_PENDING because
GetLastError() returns ERROR_ACCESS_DENIED instead.
So we rename the lock files before delete them.This seems improbably broken/stupid. Also, I've not seen any buildfarm
failures that would match this; it's always pg_ctl complaining not the
postmaster.
The probability is very small. In one of our tests pg_ctl fails with
that error sometime.
In a test with multiple frequent restarts the probability is 5-6%. On
other machines probability differs.
To find out the real error code we used the Process Monitor utility.
To avoid the second error we added the wait for cmd.exe finish in the
do_stop() and do_restart() functions.Hmmm ... there seems the germ of a good idea here, but can't we do
it with less (and less ugly) code?Alternatively, perhaps we could fix things so that the parent cmd.exe
shell isn't involved in logfile access? That'd require teaching the
postmaster to open/redirect its stdout/stderr, which is kind of
annoying, but it might beat hacking things as you have done here.
If we need parent cmd.exe only for log writing, can we start the
postmaster without it?
Is cmd.exe necessary?
--
regards, Roman Zharkov
On Wed, Jul 17, 2019 at 09:51:48AM -0400, Tom Lane wrote:
r.zharkov@postgrespro.ru writes:
On Windows systems we cannot handle ERROR_DELETE_PENDING because
GetLastError() returns ERROR_ACCESS_DENIED instead.
So we rename the lock files before delete them.This seems improbably broken/stupid. Also, I've not seen any buildfarm
failures that would match this; it's always pg_ctl complaining not the
postmaster.
Oh, it is. A lot. And this has been discussed a couple of times
across multiple threads on -bugs and/or -hackers. I think that
Windows just lacks a way to detect reliably if a file is pending for
deletion or not, and there is no way that we are going to enforce
blindly a ERROR_DELETE_PENDING when we see EACCES. One code path
which is impacted by that is our wrapper for stat() for the win32
port... For now I'd rather believe that what the OS tells us is true,
in which case here it is plain wrong, but well.
--
Michael
Hello,
Therefore, we suggest replace the deletion of a lock file by renaming it.
unlink in windows is not an atomic operation.
When we try to open the file between
SetDispositionInformationFile and CloseFile we get ERROR_DELETE_PENDING ( see screenshot )
Attachments:
On Wed, Jul 17, 2019 at 09:54:16PM +0700, r.zharkov@postgrespro.ru wrote:
You are right. I tested branch REL_11_STABLE and it is my mistake.
[...]
The probability is very small. In one of our tests pg_ctl fails with that
error sometime.
In a test with multiple frequent restarts the probability is 5-6%. On other
machines probability differs.
To find out the real error code we used the Process Monitor utility.
I would like to be sure of something here. Are those failures based
on what you have tested on REL_11_STABLE or do you still see pg_ctl
complain about such things on HEAD (post f02259fe as mentioned by Tom
upthread)? I would like to think that you mean the former and the
latter, but this thread mentions only the former.
--
Michael
At Thu, 18 Jul 2019 14:04:34 +0700, Жарков Роман <r.zharkov@postgrespro.ru> wrote in <ECD07611-BBA8-4E9B-975C-50E59F7154DA@postgrespro.ru>
Hello,
Therefore, we suggest replace the deletion of a lock file by renaming it.
unlink in windows is not an atomic operation.
When we try to open the file between
SetDispositionInformationFile and CloseFile we get ERROR_DELETE_PENDING ( see screenshot )
I found a mail in the arvhive.
/messages/by-id/CABUevExwz9ncAk90Hb3Sb4MHeaOEyS59eTb_AKW9qFEjAidg5Q@mail.gmail.com
One approach would be to rename the file into something indicating it's
being deleted, before actually deleting it.That would be an option (IIRC if you open with FILE_SHARE_DELETE, it can
also be renamed). But if we can track the delete when we try to open itand
just treat it as "file does not exist", that seems cleaner.
I'm not sure what exactly you're suggesting. But isn't there the issue
that such an approach will not interoperate with external tools?I'll have to admit I wasn't thinking of external tools. The external tools
would have to learn about pending-delete files themselves. So yeah, if we
care about those then renaming them to something predictable and then
instruct the third party tools to exclude such files would be a more
complete fix.
STATUS_PENDING_DELETE is concealed under win32 API (seems like a kind of
misdesign if it is true that ERROR_PENDING_DELETE is defined but not actually
used as I saw in someone's blog.). AFAICS native interfaces like NtOpenFile
returns the native status code. That is a bit cumbersome but not too difficult
(as heard).
https://resources.infosecinstitute.com/calling-ntdll-functions-directly/
That said, I haven't succeeded even to open a file with it. (I replaced the path
with NT native path (\??\c:\blah..) since NtOpenFile doesn't accept the
user-friendly(?) paths).
regards.
--
Kyotaro Horiguchi
NTT Open Source Software Center
I have tested clean REL_11_STABLE.
Commit f02259fe was reverted by df8b5f3e in this branch.
So pg_ctl uses “old” open() function.
regards, Roman
Show quoted text
18 июля 2019 г., в 15:51, Michael Paquier <michael@paquier.xyz> написал(а):
On Wed, Jul 17, 2019 at 09:54:16PM +0700, r.zharkov@postgrespro.ru wrote:
You are right. I tested branch REL_11_STABLE and it is my mistake.[...]
The probability is very small. In one of our tests pg_ctl fails with that
error sometime.
In a test with multiple frequent restarts the probability is 5-6%. On other
machines probability differs.
To find out the real error code we used the Process Monitor utility.I would like to be sure of something here. Are those failures based
on what you have tested on REL_11_STABLE or do you still see pg_ctl
complain about such things on HEAD (post f02259fe as mentioned by Tom
upthread)? I would like to think that you mean the former and the
latter, but this thread mentions only the former.
--
Michael
On Thu, Jul 18, 2019 at 04:14:34PM +0700, Жарков Роман wrote:
I have tested clean REL_11_STABLE.
Commit f02259fe was reverted by df8b5f3e in this branch.
So pg_ctl uses “old” open() function.
Yeah, that was a failure from me, so I tend to be rather very careful
about anything related to Windows. However, after that we have added
40cfe86 about which nobody has complained yet, and the number of
buildfarm failures about pg_ctl concurrency on HEAD has gone down to
zero since (perhaps I am missing something?).
So, instead of trying to invent a new solution only for stable
branches (which may have its own bugs we would need to deal with only
on stable branches, and only for Windows), why don't we just try to
move forward into back-patching those pieces? Or it happens that we
still have some potential failures on HEAD and REL_12_STABLE which
would justify some extra handling? In this case, I would recommend
that we focus on HEAD as a first step, and put things in order there.
--
Michael
Michael Paquier <michael@paquier.xyz> writes:
On Thu, Jul 18, 2019 at 04:14:34PM +0700, Жарков Роман wrote:
I have tested clean REL_11_STABLE.
Commit f02259fe was reverted by df8b5f3e in this branch.
So pg_ctl uses “old” open() function.
Yeah, that was a failure from me, so I tend to be rather very careful
about anything related to Windows. However, after that we have added
40cfe86 about which nobody has complained yet, and the number of
buildfarm failures about pg_ctl concurrency on HEAD has gone down to
zero since (perhaps I am missing something?).
Hm, I think 0ba06e0 is actually the relevant change here? Though
40cfe86 was a necessary cleanup fix.
I'm too tired to dig in the buildfarm database to be sure, but my
impression is that the failure rate is much-better-but-not-zero.
So I'd support back-patching those two commits, but I'm not sure
if that's the end of the conversation.
regards, tom lane
First time we found pg_ctl errors while testing our fork.
I reproduced them on REL_11_STABLE.
I found three problems with pg_ctl do_stop/do_restart:
1 - "old" fopen() function;
2 - "delete pending" problem rarely happens with "new" fopen() function when pg_ctl tries to open postmaster.pid file;
3 - cmd.exe shell may block the log file when the server restarts;
Now i try to reproduce it on REL_12_STABLE
regard, Roman
Show quoted text
19 июля 2019 г., в 10:02, Michael Paquier <michael@paquier.xyz> написал(а):
On Thu, Jul 18, 2019 at 04:14:34PM +0700, Жарков Роман wrote:
I have tested clean REL_11_STABLE.
Commit f02259fe was reverted by df8b5f3e in this branch.
So pg_ctl uses “old” open() function.Yeah, that was a failure from me, so I tend to be rather very careful
about anything related to Windows. However, after that we have added
40cfe86 about which nobody has complained yet, and the number of
buildfarm failures about pg_ctl concurrency on HEAD has gone down to
zero since (perhaps I am missing something?).So, instead of trying to invent a new solution only for stable
branches (which may have its own bugs we would need to deal with only
on stable branches, and only for Windows), why don't we just try to
move forward into back-patching those pieces? Or it happens that we
still have some potential failures on HEAD and REL_12_STABLE which
would justify some extra handling? In this case, I would recommend
that we focus on HEAD as a first step, and put things in order there.
--
Michael
On Fri, Jul 19, 2019 at 12:59:43AM -0400, Tom Lane wrote:
Hm, I think 0ba06e0 is actually the relevant change here? Though
40cfe86 was a necessary cleanup fix.
Oops. Yes, I meant that.
I'm too tired to dig in the buildfarm database to be sure, but my
impression is that the failure rate is much-better-but-not-zero.
So I'd support back-patching those two commits, but I'm not sure
if that's the end of the conversation.
Yeah, I am a bit afraid to miss something under the hood... Let's
see... Looking at the last 90 days of failures, I actually see one
from 63 days ago from bowerbird which seems to indicate that we are not yet
completely done with it:
https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=bowerbird&dt=2019-05-16%2010%3A30%3A52
# Running: pg_ctl stop -D
H:\prog\bf\root\HEAD\pgsql.build\src\bin\pg_ctl\tmp_check\tmp_test_qB5F/data
waiting for server to shut down....pg_ctl: could not open PID file
"H:/prog/bf/root/HEAD/pgsql.build/src/bin/pg_ctl/tmp_check/tmp_test_qB5F/data/postmaster.pid":
Permission denied
not ok 16 - pg_ctl stop
And there is this one from jacana with subscription tests from 27 days
ago:
https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=jacana&dt=2019-06-12%2003%3A42%3A55
This makes it at least two, still that's much less than before :(
--
Michael
Hello,
I have reproduced the DELETE_PENDING error on the REL_12_STABLE.
I changed the WAITS_PER_SEC to 500000 in the pg_ctl.c file.
Then I launched dummy TAP test ( see attachment ).
The picture in the attachment illustrates the hidden DELETE_PENDING
error.
-------------------------------------------
Log output:
# Postmaster PID for node "master" is 17796
# restarted 233
# 14:31:05
### Restarting node "master"
# Running: pg_ctl -D
C:/HOME/Git/postgrespro/src/test/pg_ctl/tmp_check/t_test_master_data/pgdata
-l C:/HOME/Git/postgrespro/src/test/pg_ctl/tmp_check/log/test_master.log
restart
waiting for server to shut down....pg_ctl: could not open PID file
"C:/HOME/Git/postgrespro/src/test/pg_ctl/tmp_check/t_test_master_data/pgdata/postmaster.pid":
Permission denied
Bail out! system pg_ctl failed
### Stopping node "master" using mode immediate
# Running: pg_ctl -D
C:/HOME/Git/postgrespro/src/test/pg_ctl/tmp_check/t_test_master_data/pgdata
-m immediate stop
pg_ctl: PID file
"C:/HOME/Git/postgrespro/src/test/pg_ctl/tmp_check/t_test_master_data/pgdata/postmaster.pid"
does not exist
Is server running?
Bail out! system pg_ctl failed
-------------------------------------------
On 2019-07-19 11:59, Tom Lane wrote:
Michael Paquier <michael@paquier.xyz> writes:
On Thu, Jul 18, 2019 at 04:14:34PM +0700, Жарков Роман wrote:
I have tested clean REL_11_STABLE.
Commit f02259fe was reverted by df8b5f3e in this branch.
So pg_ctl uses “old” open() function.Yeah, that was a failure from me, so I tend to be rather very careful
about anything related to Windows. However, after that we have added
40cfe86 about which nobody has complained yet, and the number of
buildfarm failures about pg_ctl concurrency on HEAD has gone down to
zero since (perhaps I am missing something?).Hm, I think 0ba06e0 is actually the relevant change here? Though
40cfe86 was a necessary cleanup fix.I'm too tired to dig in the buildfarm database to be sure, but my
impression is that the failure rate is much-better-but-not-zero.
So I'd support back-patching those two commits, but I'm not sure
if that's the end of the conversation.regards, tom lane
--
regards, Roman
Attachments:
postmaster_pid.PNGimage/png; name=postmaster_pid.PNGDownload
�PNG
IHDR � . �b4 sRGB ��� gAMA ���a pHYs � ��o�d ��IDATx^��M�uK��Tj�eY� �9�2H���P� BB`�1`��=�`�U��tKT �������f ,[!a�Z��mh Zn����G}��m^����z��������k���^�����q�Z�2####�W�}�� 0�k Lr���?���o__N����������w�������| �����k_���������N���/��?�����7������������� `O<==ueo�M�o����B���������g���������?~��O���=���?{�������_��������?s������������������o��q ��^"j��5J�����f��w��>�����)����?y��;�����/�6�����a�h��N�������_�~����r�_�O���@����`@����5/��m_�V���?z�cM<R�=�- �D������+�f�]�UGOI���?�?7�/���~���?���I����������~���1���/�cB��|�g �z8XI
N�l���UBD���b$m(���r��7����P��^��\<�vn ��^�l��5B&����\=��U�9������_>�w�O�����Pb�_��9 �l;���^����qc�o����
:��aT�f�n<w][���r?m����� ��x��5��j�H�W='����B����_���?�;���/������\���=1��|M���������
'���N��F?e���q��kk��|,�����ci[�E6�Y�jew$�"��DM���5�(=��s������a�o�!�.�,[z�����i����b@���Cr����(� ���uG�'z������y��5J��p����h>�_�3�?���wN����i(��_��$E�k�trD$(b����DH��PI��c�����#"VY������dG�Y���5+}Q�:�T� �'t� ��"�3�U%����^�_�%[��8~a{�Q�s���W?[��}���xZg���P�e���H���q� ���%��X��������[r��C��������z�?������P���Ed�A%br�N@���q,��� � �W���B�Cus�cIl�����^D�{��U:y\��-�)�V��%�#��~'����z��X(��$:^�������iKh���U���*�>��T_�xt� x����z��5+�v��UG��Z��k��&�������_��N���Z���:vN2�M�$^���K���U������z�����N�x��U:�`��m�W2�7�����c�u���^}u���-l_5_z��� yl�]= �;���^�jD/��;vW��������������/�*���M�/)U�"%Q�_������VYc��������JO���&��\������]*0�����J����m����9'���>7_����Q����� �����=�+d[/yF�����^�������q����������vn��"y@����Q���:����_M�Ir��*���PF�S�][��_�o:��<�i�k���S�
X��8v��a����^o?m����$e^��^}�O`u<i���c@���c�x��e,$m� x\��\�� ��G��w�������������?t:��������t�~�?=�����������>}���X�C^�7H���K�b�d} �����o�k�����������N������G���?�����Q �em��5 ��.��?�O�����_�>�����\
�% � ��s�� o$� ��5 &Ar
�I�\ `$� ��5 &Ar
�I�\ `�&�^N���������tz���GO?:�f���[��|��*�
�m[1k�����y9��U6�����r������%x~����� 8�'����}V�Wo+��9F����:���-�{&1�&u��~������:�g���{ P��Z�Wo+��9F����:���-�{)��|C1~�zq/����7c��� �� �&�U��|�_�7����y�/���o~c�C?�_��t��q��0�/�M��& �~�z~�����-�k�J�r�v���~<�(�]�ag����{L�Isb�_K���_�C��e���O5��x�!6�����S�q��� ���s-��7^�7��{��E��_��_�������=g��A�4����'���v�Y���v�JX\��u���}e�v��_�0�Iic�X�V�q�'J+dR5�U'T
�"r4'F��c�3�*��� �}��o����E�E� ��&�����_����Er�������#��>�����R��m��_�e�$+{���l�& @�����5���`m��O�J�k�a������Y� ���'�����8�S?�H��)?����?h=����K����R���N�e�7/M��o� *[t��[m���_5�k��������m��o ����\��k��@&��/�o�k!=�����t���}���[����������b�[�2M�w���Jv������d��W�w������x�~����z-;����Tc ����k��r]��sI/��� �%~L|p�o\{�A�������i��~P�����F�����R}U����uR�*��Y���1}�L����;3������azvi���= {���5 ����z$� ��5 vK� �� �k �$�� o$� ������?��@ �@ �@ y7r�������C �@ �@ �@ �F��\����C �@ �@ �@ �F�7� ���@� �������Vb���X�A �@ �@ �[$� �
B��O������To�n�@ �@ �� ��B~��_�>~�h�����{�����=���Z-H�A �@ �@ ��"H���s_�?==E���wY�3
�5b�X#���+���������Xm=��H��B:�����T���������&�x�Y�:��*��k�\�� �@ �@ ��B9��au�V�}�*��K��^��^��&f����'V��tYBug^����N�yb�]+r,[����z_��d�gW#f��e�|������Hh=�����s�%��?���yL=��$���:����o�\#}�o��"Q��< ��@ �@ �@ }���W��p����?�b����j����3�K/�g_����������%�%�v�-��8�i�aY�3��'V��Bc�b�Y#���2-�>�9A}������
�������0;�7H���N��o|:IE�#�`>�h�c���O���&��k��Zu���kAQ�8��m�����@ �@ y/B�]�����2�b���I�����k�k��� �+b��$�e�'!��n���u�dF?�MB��.�5>#�>�����V�5R��b���^����}-�>����c��,=R�����+_#�u��Db�d����%4"n��s��a%�H�y��f�}�I{�O��r��Z�1����4.�_��Tr��Y��H]�@ �@ rK���W��P����k��I�q]K�,�Mz���X��O����SP��O*��2.K ����+��-O�o��n{�.���r�Y��� �����_���YH��^�Z -�a�Zm,Y3.�\���O�?���]�9c��kAS:���Z8I�:e[)��5-�s0J��sg���'����@ �@ y/B�t����zA�H?��S)V��P�{&���9����J��#!��d/o�>-���������t��t���L�GmF��-]#�m/��mk����%�5)���H����t�b�������w��Z�-�����X<N���3�5�5*�*�F:H��'�Oz�6Rf�k�;����q ��@ �@ �@������au(�^�����������^�5�E#H/����n$��E�������K?�a�"Y��b��K�Uw$���)������Y��y!}#z}�\s�H,== ���&l3��:���<��A�1��c����k$t�!��<��~���Rf�k<�x~����6Rz��e���������@ �@ y/��H����zA���<�E*��CrMJ(l�j���T-?�����k=��I��^k|F��Z�.��c�Bm��^�H��:&���G����c�'����G�l���������X�< -��6N�E?��m����6���<6K��\���N��l+e�\#)6��Q6���k�������5�G>�mG"uA �@ �@ �-E�+��C)��4��%�O��K��S�����g�b�M<��>��*�/������g���I����3���c��H��8�`���^�|$���)������Y�������>Yf��1p�����X,}���a�Zm���+��~�����AR2i������~X�n,��Y��Z�^��?eK��\c��G������(�f�I]�@ �@ rK���n���zA�H?i�z��e����.)#���xm��$(���J/��'��Yud_�>��/c�\��eI�i`���>�g�?��UwV�^�Q��h=r[�����������I����G�l���K��l�\������2����q�c_��XN���*Y5��\�MIsI?C?O���>�!u�X�5jO6�P{���IxLZI7�����.���SO4��5�'�W���L��@ �@ �@ �[�|O�9V�R�iz��e������Rm�dF7�D�$�F�^P�n����%��bQ�t�����Fc���{����s}F��$���-��mm9���x.$�3���M�<�9>+�E�<�e��:n������A��o�1J�~��Ae��^rM�����r��l��Z���L�-Is<lh=$Vr-��� �M����q��5�@ �@ �^���^
�C)������Ry$k^�J��m �l^^��2K�L^�(
+��T�����|F�>�L(�:��8z��=�8��^�Z�iY��'A�Yb��D��6K�����Y��9gt��Q�$�}�.^;,����J�-�?����qQ���5C�x<�����N�p��K�Q��'�'�T_&�����Z�HZ��u\�!�%�����{SOI�L��\���%��D��eR�@ �@ ��R�M���:��/I��H��L�z�-���_���A/��&���(�V�'�����naQ�3k�i��;�����P_���$(8K,]�X6��i��������t�$�f����e���UG����N�����v�/JR-�� �^rM���Yl�(e^rM��s�w\�!��ki��H�y<�/�L��?j�E���B[��@ �@ �@n)�&�jXJ�/W'�j�jC/}���%���������^H��\�v��dG�2��%��%��)����������s|&%���RO��g���'�7�Wr{$�>�zk���o��K����%�k�:n�����a��n��@?9�f��J���z =��%:IEv��L
�G��.+�� ���)��X�q��5�{�vC �@ �@ �����^
��[J|y�R,=,�2��D���If�I��{��>�BAj��Jp�Yb��9���������WO,=R���kKIL�X�<���/K�v�\'��Od}O���'��*�"u��M��h����\�@�.�@ �@ ��<�4�u�:|�B/���x���g���>{��u�q�IR����Z����@ �@ r+Arm� Q�^����������� ��@ �@ �@ }Ar
�@� �L��X�m%V[���@ �@ ��5Ar
�@ �@ �@ �$� �@ �@ �@ �IAr
�@ �@ �@ �$� �@ �@ �@ �I�jr
<�����������:�f ��� �� f�g3�����������u`� � � 8� �b%�f�5� �q�{�� ��� � pX; ��J���k`p��/�>� ��5 <&� �<�v 0��8�$��&��u_�}>/ �k xLp �y`� `+q6#H��M������| ^ X� ��� ���� �,V�lF�\���}���@� �� �1�= ��� �Y���������$H�m������d��%��./�C������t�l:�:����to\�����m<���K���|��K�c����I����^���r\t��� ��\����s �#��`�}��'�7����
#k xSX�3J��X��\�/���1�?s��+��D���rz><�e-�7�U�;��$���z�vN2J^M��7o�����}/��p�������s�[o, ��M���y ���� ?�������~�A��?O��YX3 ���J�����`Cr�jt]��wg���o�C�|3"��|t�������,�y��,?
|����`$�(�v��;��y������� �nXw@l����q� � ���(���� �M��f:���Y�\����o������}���%&t�_C���x�O�y���}�a���6�_�����s�K$4�W^z��57�����/���2��N.��S����B���m���m�?��sy��1�?��O�z~*��{����1}n���k��1���k��bj� ����~��4��� p]�:���T�#� ���6A���������� ���/ ����S=�6kG�C���>;�[�� �V� 3+����MQ�y�n����o���M|s��)K7v��)I0�n��c|K����2���%Q_����Q�����q8c�r6�m�g����d�U�(��Y��
.���
z;��l�>���%���7>�c1���V�g���<��&�b�����X?�����u������X��������m9���b1
��U� �> ]�W</�{����|���p�41�k��l��]�W �C&�Ht�+Gr�j���������~@��
#���,�����c��\�R��m�����[�������V>"�a��>�����F���'�E������6���#Qsy%��1���{A���g���=�[�~i�O��,#F�y�kq�9����]b ���������y���?�a �����3,����gK� �M!fk���qIr�OJDd;B����X)#[�f1�usR����K
���W��:��k��=X���Ef���o*��
�?���M?Gsy%��1���;�k��W}J��������s8�+��j��] ��Y����.1
���� ��y�y���?�a ������K�-�� �;V�lF�\�t�%n���,s;}�p�5��MY��o������S��[i�����@V��c������Y/~�rgL\^��7������x,uh�*�mAc#��q�������l�>����g�7v��-��}�B >���W�� ��U��'����5��������J�u�]{�"� ��X���/�t����g���.���x��Z;�3���X3 ���J���kW�j2�M�����������P����R�����+�"��N�n���~���C��`�p��_]n�����v;~�����
���P�e�dw{b.�@w>f1|R����IR������@����b�A�(N�����A���n�n�Q��} ��Y�����'� ��X� 3�\���bY�����Q��{�X��3\;y
���������A��� �7��8�$�� ��?Dm������8�><���X �1�= ��� �Y���� �|���[>��7��b��q�}H���X �1�= ��� �Y���� �67��b���x`X3 �c�{ �k �X��Ar
ln\������:�f ��� �� f�g3�����������u`� � � 8� �b%�f�5� �q�{�� ��� � pX; ��J���k`p��/�>� ��5 <&� �<�v 0��8�$��&��u_�}>/ �k xLp �y`� `+q6#H� ����~zzzz:}��/t �V�lF�� pRb������� � ��X�����k��J�=����WxL(yF�4����dCr
�qx�g( ���g3���\�>��O��K����N�g����x�/�����n��I����!�?��/�M�&�5�~9�vTg��Q���m�����5���+�g�}�Z������;/^t\�>��P/��9��RmI�m�
6��%���~:��5lt�m���1�Kh,��S�z�KkwG37"�&��n�����KX����_�=_�z�'[��Z�����������|��y�5����|�W��cg��k�
��|
��{�YN?��e�=zj+��c�?!ej\{�c ��&�'������z�^��� p7������������7*F",�d� ��cx�7S���d���n��>'���MJr�{��6�t�m��W_A6�w\�z�R�������w�}��o����7���p������N����q�C���9�m�7�8���o��C��6��?�6��h�_��x���a���K�������x���o=v�
��Es=���!���P���M=���9�r���s�}�9�!�����������q�k��}x��Fz'��<��jW����3�p���9�Um�3T������{�����������_�����}7��;���q��.tc?0:>��N p_����xo���
Kz`; #���sD ��I�J��37`2�!��z��)�v�b\]����M����:��g<}��(�5�X����s�
��&����w*��:0�B������������[�oC[�7�s�q�b<������#������4���
��n9^���q�bNz��+[6�%l�gW��<��[��Z���N��q����36mUg�����s����z�t�w�;�0/��)�����{�^����X�8��K�Oc�] �+q6#�[���q����\�I�%a���������,��N������!+Q?9h=E:m����O��g��+J�����Jr�k��I���N�}��W��)����U���\N�Y�q�Tl?>�O��:y�U���������v&�R�y��nc�V;���~��>�G��q$��q!��S�b�,8�� 6J������5��)�}��9���i_�Q�6�o��&��Kb���������m�c�f]K��Y���u91)�����y�@�+n���1���7�W>f��n���x�n��:z���������e=�k��SI<�b��z.��+��=����xnE������E�}���W��~N�^�����?�e�a���q���a�9���#R9?�zx\t<�g�����\7��<���9��������h{��6�V�u�0qq���.���������^����NX>V}h�W>k�}�:�y+������I�[���eq.������={z� �1f�5����r��m���y�����D���s���kS� ��g3�����n@h�zh��\[��Ir��=������4��������n}�������6�+FsM&�8�&kUr-�t1)���g�8Y.�����<�\�j�c���a�9
6���,�
����V�����~���1�@��N5�B�����ee�>��i�|R$t�7 �*_�&S�k��s����1'��O�Q�J���'�M/�"�I����~����m�������e����9e�|����)��s���V�Oe����_*o�+Qz��*S����n��X������g�����}(]�C�/�C��v��W���c�^k����i��K9R����/������N,�l���~�����1�����qzTu<[����V��Y������Q���n(g�d�����K���_EsL������E�^��X|l�7 �D���e��)��o�8�-��5���{J�U���9���%�o
�l�Gy����{1��kO�w�[b�9��(.�'�����x,����>j�R[Z/t��z��%� ��J����%���Z��fA7/���w#�Lb�`������(o�t� n;���I��9�l�����kZ(�����"?~�-��k��c��2<�����HY�k��T���g����� �F�g�v���vM��n)w�B�6�����h�/�l��?=}�����w=�:���b�����)�qF��W��!���x�r{���:�mz ]|���e��\o3�������k��X~Q�YCk4�g�m���Q����+��54�����>s}zu�.Q�JW�o`����S��9q���r��;������5�qO�����L��g��4�
��-d��s]�u;���9��re#I�g���b�o�]8;����}7��n��9mh���3����~`��'��YC������
R'��{}Ok0��
����@� W��c�>�|QD\�F�I�Wg*�����j�y��� �a%�f����] oX�C��%���;�&C�����Z�����P�(���^{����}��Wk�k�X���/s����L�T�zx���:�<Rw.����c�W�}���������������e)�F2�`�I�����������g��fB��3�������k����kz��Zz:d1*���nG?�y~����w[�\��t�3�-����}�k����\=����w�����&��h��1.��w\��u���������{z��������t�h������u<[���h��v��:?�=�?�^�3I��;�T��F�����{��w]�����A�mk}z?r��O>C]�?o/�Y�_��\�#�c�U���hz� �2V������y���VkC��v��E� ��J��H�M�;����%��.�^�t�������
��_�u��*�~��v�D����k�6��K�0���HJ�qb��/��-����lgk����]L �����t���s���.��>_�C��W�����{Sq'�%U\�K�[U_"�k���������'lL�o����X�������bs9���V�*m(����������'��S�,>��7�^0�x �eZ�����>�c�1��|�B������|���k��Q�s8��s��>-}��5q��oN�_:���.���c*�j���9)�M{�Xd�N|4����m�i��1aQ���;9�`�eM;�������n�R��Mz����?�N��Kn+�T��J�goM��7u�K���.����� �����9��8�06���:*�-��q��}���y$.���K��e��x�9�K9,�U�c������
�M�qb<���N�^N�ni3:�:io@:o��c�V���5��� �a%�fD��~����/ #Y/<v�OD��}zh��*Zg���������<�J�4�:3mf� �4>����g4�P����L���W�cM'�>��������7��y�n�rzh.c�����I�T��_!���Oz�,���Z7!��h�$��T�L�>���6�2:.��*
dr��\#�%�i_�4h|���(a��@�I����Z��D��y�P���W�(��������k���.���mm]{�y�cmG�O�g��������d��Z'�����\��5�l[k��^�����5s�P���=9&����#�����m>db��Y�j|���:6{X�i{��l�����s�&5�\��c��e�\g�1����y�?�N�������oK��goM���xq#��b}�v9��h�nQG���:���x���&�q,�����t_�E]<��1�M��#��{#��}4�("�EH��k�{L������=#[�!M��?����pu^q����e���~�.��`�1���M �+q6#��k�-����tcT?�<*�Frk��7�>���'�\���]�z x(����q}N�yW�A�G�9�5����q��9� �`%�f�5��~�����'��E�Gv^
�G�
������gg��o�S�����'�7��y�������w�iu���]��
t_�<��� <:V�lF�\ ��8�$� w��O?��V�~-$ ���8��� ���X���*��� H� �&V�lF���Z<�����~�Z�cB�3J��7���$�k ���>C ���8��������tt�H����tp�������n��I����!�?���x�?��r����T[�������Ej{��/����>[-��X�i�� .:�^�YO���-��#'�R�- ����F�{,�9������?��>��1o� =�X�1��zzy~1��U����^��z�'[��Z�����s�Nbc�s������Fl2/W��^�z3L��}|���g(P ��5<��������~V���{��{L�'�L�kO�w ��a%�f�'�^O��|Co%��
��\{9����@�*L: �[&�>'���MJ�������^[���l���/�B&��~��F����(�~�m�o��&��������O'�����8������" l ���I5��xK�����I�`_y7�}�lV\qb�o!�iM[�1Z���k��F3�B��*:1m�����-���:w���������.a�>;z���v�����o�w���c}�v���i�:�����_���Y��������{kW�77��E��y��{����� `X����Z�+�����v<��Z��pg��PBB<u�7{�����LfH��^}}
t��;=TI?����*tr��?���?���/��?���L�}��������|N��^�R�/��pir�]������1n�on�u^�[�2�F����^7[�W�:w����������w [���s�8����>�V#���n�{����M[��b0v�����g�7����#�K���e���������� �!V�lF����
�a#<��7�����P���a�Y��DU��z�v�����P]�PYp���%���{�\ Y�a�����%�~��w%�F����4%�Htb�����-O��cx`����oW�r�U�Oe�7���
�T'��j�>���C?���]J7��-}���I?R?�3���Q��t�0��x@�O������'�(���"R&�H,�����1G�b~�y��.��u�y�+����������x\��������=����xnE���.�#�����#�g�����\g���B�I3����C����S=q����=�=,?g=I7�s}�������<6l;�
�;��]����;�d��eg�_g�D������?������W��s4cw����z1�O�;a�X��uX�^�����������B�n�&]8o5�3���p��;Ft���� `X��y���4I��C����:�L�}0�'���/v��@�{\f��rt���Tg)��^��V~����W���F������UrM&���Z���%�R�'?����ra������]�C�b���993���,�
����#?���x��_�~��9����j�q�����}���<��H�:��q�X|�"vz��$�$ ��x�����;��R�WAkU��l�r\b�����(=a
p��Z���>�v��X7�k��:�l�k�Y�2b�nJW�������]5�c*���s���m�3p�"�n��_�)�OoS�Xf����-�,c������1�{,���������B}���"����������s��uC9��$����_z�T�*�c��f���/:�j�����cC�Y'���P,��O1����Yo)��TG�S�������Q���{�o
�l�Gy�����_��kO�w ��a%�f���k�A�}h������`���UNeOG~���Mp�q�`��������I "y��F'��PR���E>~��[�d��@\��x�S��S����N������-q��A�U����������R����m��'%��_�
z�$�����$��J����@�wb��#�l��C�>z��
+�gZ�q=�mV,�\=^����7�;�����5�Mx��:y�(�
���70}G���)s��8x�e�Q�_o[�������~Z���&g��g��4�
��-d��s]�u;��$,����X�l$��L"�#[����g��W���fW�m�;�
���uF�Z��l?��S>��Pr=��A�d�u/��z��f����u�w �=`%�f�~[�.�������n-��]�e&=<�3��huB��Ce������cO�j��/o%k�k�X���/s����L�T�zx���:�qI��(�k����q�|����'����"�kR�����`s�w<��3�����NoNe;B��k�V�b1��������X3V,���}�k����\=����w�����&��h��1.��w\��u���������{z�������k��q�m!�x�0Ss-����`gL�e-Zg/���L�����-U�����������v�]7&f�v�uF�Z���\a���PW������k����q;��H�X`���=��1 ���8���M������%��.�^�t�������
��_�u��*�~��v�D�a�{|�M6�O6c��W1J������'��������_���c�>]]�� $:��O��t���s���.��>��l&�zu���O;�����&��oU}�L����?�6'���H�1���OqY%��lQ/v���5O��qY5�N{ �B��`�3�b?�>�y��� �L�r'v���p|��j�m�g�kl���}���t(�/D]��s�T���sR|��������h�'�Y�����c�6����wr�tM�j�yt(����us]���m�+}���Q�����V���-�N����{3n���X��]�9���A�m�Os<5q�al��'uTH[����s����H>\���
����(���s��rX\�z��9���3� ��a%�fD��~��-�q�n�������'"��>=4�G���Om���~��U�N���c����~ <=?�}E=v�9�o��>����}5�7�tb���?�-��k������`���*���2�8����$��=�����!� ������M?���${���������`��]��#�2�f�L�K��p 9O)v�D,s<;T���������6���A���6I�����#�)N�W�Aq�/&K,��h��v;>W�v�}�>��������fN��v���X<�WE���s��621�"��c/���z�v����a�������;�'^�M��8si��q��us���hoWz�����a����c��^�oK��goM���xq#��b}�v9��h�nQG���:���x���&�q,�����t�E]<��1�M��#���F���k�F�;�Hn�7�Z�s+%��g��V ���8����5���W�o��`����p��7�>���'�\��q �����ywk.>W_��]29�]]q����5����q��9� �`%�fo��n��A^b2~���27� v�^�nz�~��Mg��o�7m���:\�w`�*�i�}qg�V������@�U��{�k ��c%�fo� ��a%�f�5 �]���O����_�B� �k`%�fo� w!%�>��J��)�k ���8���������_���P���i�
6-%��� �����' ���8��������tt�H����tp�������n��I����!�?���x�?��r����T[�>�������������#�E����g�}�Z��������:�5d��
��GN��T[�F}�������M)^��(��u6�Q���2���� �x�uiE��������W��c<{1��y�l9�k���sR�{;�������G[���\��{�kSV�7��Zm�_��|���C��-7�t���M���=����1���r������T���c�|����r����nuN=����F�*�s�D�kmR�n1G�� f�lF�qr���|�����l3�n���*L:���G��l=�h�����%y��u������o�`�;^����������w�}��o����7�����^�:q4��������\��KJ��_I�ZP2mY�i��z��lO��p����Uo� �B�\Xg�������tM���F3�B��*:qm�����-���:w���������.a�>;z���v�����o�w���c}�v���I���o#��ku����|[�s�����b�����_������od����[A��U<r|.���^Aw��z�����Y�� u���j�����M����q��\���f�-�G��5�� @�J������]a]�����(_�{X7>��qO���53Ey�!��N��@U��C9}�h�.�\����t����x��O�P�k2����_����IT�zqT�������s�4�V���_d,��X1+�z�7pk��s�0������4���
����r�J���������W�l4�K�����3�y�]��������w�X��]=flj�L���?2V��:�O��a��gS.�]���>�=��1c��e���������Y�����q�|0�����d��������Ga�%�f�E "V�lF���� �Bn�X�E��`���}Xa�}��!�G=a;sH�a���p�����L�d}S!;6T7G�m��k����SR��~W�k�X��O�7�tb�����-OA�1��l�_�PF������,��������d;�v�S���J���k �.���]�6Fm��~�~8F�>�G�~ �xs
9q���5N�Q2�E�L����q��idgK������9X���1G���{.���� l��rT�T}��_<n��xH������o���!P�7��Qt��.��:����.:?r���1��u��I�+t�4cQ���,;��*�=E���~h�����s��ts9������q��\���c��s����|K�5:����O��YvV�u�I��o���-�{��c}�v9�h��@ea���m���~�/9.�7R_D���mr^x(�?).����[���e��z�����=�c ��[����%����9�C;y�z��������w,z��[�
�������p�:�������z������M�h�2��k=���u)�����l������1,�N{��&i����!oO���>