diff --git a/engine.c b/engine.c index afaae1f..0039961 100644 --- a/engine.c +++ b/engine.c @@ -641,7 +641,10 @@ ptrack_walkdir(const char *path, Oid tablespaceOid, Oid dbOid) { char subpath[MAXPGPATH * 2]; struct stat fst; - int sret; + int sret = 0; +#if SIMPLE_STAT + bool assumeDir = false; +#endif CHECK_FOR_INTERRUPTS(); @@ -651,7 +654,14 @@ ptrack_walkdir(const char *path, Oid tablespaceOid, Oid dbOid) snprintf(subpath, sizeof(subpath), "%s/%s", path, de->d_name); +#if SIMPLE_STAT + if (de->d_type == DT_REG) + sret = stat(subpath, &fst); + else + assumeDir = true; +#else sret = lstat(subpath, &fst); +#endif if (sret < 0) { @@ -661,7 +671,11 @@ ptrack_walkdir(const char *path, Oid tablespaceOid, Oid dbOid) continue; } +#if SIMPLE_STAT + if (!assumeDir) +#else if (S_ISREG(fst.st_mode)) +#endif #if CFS_SUPPORT ptrack_mark_file(dbOid, tablespaceOid, subpath, de->d_name, is_cfs); #else diff --git a/engine.h b/engine.h index 56777fc..588151c 100644 --- a/engine.h +++ b/engine.h @@ -49,6 +49,11 @@ #define CFS_SUPPORT 1 #endif +/* lstat optimization */ +#if defined(DT_REG) && PG_VERSION_NUM < 130000 +#define SIMPLE_STAT 1 +#endif + /* * Header of ptrack map. */ diff --git a/ptrack.c b/ptrack.c index 22a2acf..5dba6cd 100644 --- a/ptrack.c +++ b/ptrack.c @@ -306,7 +306,10 @@ ptrack_gather_filelist(List **filelist, char *path, Oid spcOid, Oid dbOid) { char subpath[MAXPGPATH * 2]; struct stat fst; - int sret; + int sret = 0; +#if SIMPLE_STAT + bool assumeDir = false; +#endif CHECK_FOR_INTERRUPTS(); @@ -317,8 +320,15 @@ ptrack_gather_filelist(List **filelist, char *path, Oid spcOid, Oid dbOid) continue; snprintf(subpath, sizeof(subpath), "%s/%s", path, de->d_name); - +#if SIMPLE_STAT + if (de->d_type == DT_REG) + sret = stat(subpath, &fst); + else + assumeDir = true; +#else sret = lstat(subpath, &fst); +#endif + if (sret < 0) { @@ -328,7 +338,11 @@ ptrack_gather_filelist(List **filelist, char *path, Oid spcOid, Oid dbOid) continue; } +#if SIMPLE_STAT + if (!assumeDir) +#else if (S_ISREG(fst.st_mode)) +#endif { if (fst.st_size == 0) { @@ -375,7 +389,12 @@ ptrack_gather_filelist(List **filelist, char *path, Oid spcOid, Oid dbOid) pfl->path, nodeRel(pfl->relnode)); } } +#if SIMPLE_STAT + else + { +#else else if (S_ISDIR(fst.st_mode)) +#endif { if (strspn(de->d_name + 1, "0123456789") == strlen(de->d_name + 1) && dbOid == InvalidOid) @@ -384,10 +403,12 @@ ptrack_gather_filelist(List **filelist, char *path, Oid spcOid, Oid dbOid) ptrack_gather_filelist(filelist, subpath, spcOid, InvalidOid); } /* TODO: is it enough to properly check symlink support? */ +#if !SIMPLE_STAT #if !defined(WIN32) || (PG_VERSION_NUM >= 160000) else if (S_ISLNK(fst.st_mode)) #else else if (pgwin32_is_junction(subpath)) +#endif #endif { /* @@ -397,6 +418,9 @@ ptrack_gather_filelist(List **filelist, char *path, Oid spcOid, Oid dbOid) if (strspn(de->d_name + 1, "0123456789") == strlen(de->d_name + 1)) ptrack_gather_filelist(filelist, subpath, atooid(de->d_name), InvalidOid); } +#if SIMPLE_STAT + } +#endif } FreeDir(dir); /* we ignore any error here */ pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy