mirror of https://github.com/postgres/postgres
parent
dfc6649c4d
commit
b952f0ef9b
@ -0,0 +1,138 @@ |
||||
#ifndef TEST_VERSION |
||||
|
||||
#undef rename |
||||
#undef unlink |
||||
|
||||
int pgrename(const char *from, const char *to) |
||||
{ |
||||
int loops = 0; |
||||
|
||||
while (!MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING)) |
||||
{ |
||||
if (GetLastError() != ERROR_ACCESS_DENIED) |
||||
/* set errno? */ |
||||
return -1; |
||||
Sleep(100); /* ms */ |
||||
if (loops == 10) |
||||
#ifndef FRONTEND |
||||
elog(LOG, "Unable to rename %s to %s, continuing to try", from, to); |
||||
#else |
||||
fprintf(stderr, "Unable to rename %s to %s, continuing to try\n", from, to); |
||||
#endif |
||||
loops++; |
||||
} |
||||
|
||||
if (loops > 10) |
||||
#ifndef FRONTEND |
||||
elog(LOG, "Completed rename of %s to %s", from, to); |
||||
#else |
||||
fprintf(stderr, "Completed rename of %s to %s\n", from, to); |
||||
#endif |
||||
return 0; |
||||
} |
||||
|
||||
|
||||
int pgunlink(const char *path) |
||||
{ |
||||
int loops = 0; |
||||
|
||||
while (unlink(path)) |
||||
{ |
||||
if (errno != EACCES) |
||||
/* set errno? */ |
||||
return -1; |
||||
Sleep(100); /* ms */ |
||||
if (loops == 10) |
||||
#ifndef FRONTEND |
||||
elog(LOG, "Unable to unlink %s, continuing to try", path); |
||||
#else |
||||
fprintf(stderr, "Unable to unlink %s, continuing to try\n", path); |
||||
#endif |
||||
loops++; |
||||
} |
||||
|
||||
if (loops > 10) |
||||
#ifndef FRONTEND |
||||
elog(LOG, "Completed unlink of %s", path); |
||||
#else |
||||
fprintf(stderr, "Completed unlink of %s\n", path); |
||||
#endif |
||||
return 0; |
||||
} |
||||
|
||||
|
||||
#else |
||||
|
||||
|
||||
/*
|
||||
* Illustrates problem with Win32 rename() and unlink() |
||||
* under concurrent access. |
||||
* |
||||
* Run with arg '1', then less than 5 seconds later, run with |
||||
* arg '2' (rename) or '3'(unlink) to see the problem. |
||||
*/ |
||||
|
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#include <errno.h> |
||||
#include <windows.h> |
||||
|
||||
#define halt(str) \ |
||||
do { \
|
||||
fputs(str, stderr); \
|
||||
exit(1); \
|
||||
} while (0) |
||||
|
||||
int |
||||
main(int argc, char* argv[]) |
||||
{ |
||||
FILE *fd; |
||||
|
||||
if (argc != 2) |
||||
halt("Arg must be '1' (test), '2' (rename), or '3' (unlink)\n" |
||||
"Run '1' first, then less than 5 seconds later, run\n" |
||||
"'2' to test rename, or '3' to test unlink.\n"); |
||||
|
||||
if (atoi(argv[1]) == 1) |
||||
{ |
||||
if ((fd = fopen("/rtest.txt", "w")) == NULL) |
||||
halt("Can not create file\n"); |
||||
fclose(fd); |
||||
if ((fd = fopen("/rtest.txt", "r")) == NULL) |
||||
halt("Can not open file\n"); |
||||
Sleep(5000); |
||||
} |
||||
else if (atoi(argv[1]) == 2) |
||||
{ |
||||
unlink("/rtest.new"); |
||||
if ((fd = fopen("/rtest.new", "w")) == NULL) |
||||
halt("Can not create file\n"); |
||||
fclose(fd); |
||||
while (!MoveFileEx("/rtest.new", "/rtest.txt", MOVEFILE_REPLACE_EXISTING)) |
||||
{ |
||||
if (GetLastError() != ERROR_ACCESS_DENIED) |
||||
halt("Unknown failure\n"); |
||||
else |
||||
fprintf(stderr, "move failed\n"); |
||||
Sleep(500); |
||||
} |
||||
halt("move successful\n"); |
||||
} |
||||
else if (atoi(argv[1]) == 3) |
||||
{ |
||||
while (unlink("/rtest.txt")) |
||||
{ |
||||
if (errno != EACCES) |
||||
halt("Unknown failure\n"); |
||||
else |
||||
fprintf(stderr, "unlink failed\n"); |
||||
Sleep(500); |
||||
} |
||||
halt("unlink successful\n"); |
||||
} |
||||
else
|
||||
halt("invalid arg\n"); |
||||
|
||||
return 0; |
||||
} |
||||
#endif |
||||
Loading…
Reference in new issue