In some cases unlink reports 'no such file or directory' when the RRDP
repository is merged at the end of a RRDP sync. The problem is that some deleted files are in the temporary location and not part of the real repo. Because of this if unlink return ENOENT then try the alternate location. While there cleanup the code a bit more and make the rename() and unlink() case similar when it comes to the path generation bits. With this I no longer see the unlink errors. OK? -- :wq Claudio Index: repo.c =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/repo.c,v retrieving revision 1.3 diff -u -p -r1.3 repo.c --- repo.c 2 Apr 2021 05:16:29 -0000 1.3 +++ repo.c 7 Apr 2021 09:01:59 -0000 @@ -838,22 +838,37 @@ rrdp_merge_repo(struct rrdprepo *rr) /* XXX should delay deletes */ RB_FOREACH_SAFE(fp, filepath_tree, &rr->deleted, nfp) { - if ((fn = rrdp_filename(rr, fp->file, 0)) != NULL) { - if (unlink(fn) == -1) - warn("%s: unlink", fn); - free(fn); + fn = rrdp_filename(rr, fp->file, 1); + rfn = rrdp_filename(rr, fp->file, 0); + + if (fn == NULL || rfn == NULL) + errx(1, "bad filepath"); /* should not happen */ + + if (unlink(rfn) == -1) { + if (errno == ENOENT) { + if (unlink(fn) == -1) + warn("%s: unlink", fn); + } else + warn("%s: unlink", rfn); } + + free(rfn); + free(fn); filepath_put(&rr->deleted, fp); } RB_FOREACH_SAFE(fp, filepath_tree, &rr->added, nfp) { - if ((fn = rrdp_filename(rr, fp->file, 1)) != NULL && - (rfn = rrdp_filename(rr, fp->file, 0)) != NULL) { - repo_mkpath(rfn); - if (rename(fn, rfn) == -1) - warn("%s: link", rfn); - free(rfn); - } + fn = rrdp_filename(rr, fp->file, 1); + rfn = rrdp_filename(rr, fp->file, 0); + + if (fn == NULL || rfn == NULL) + errx(1, "bad filepath"); /* should not happen */ + + repo_mkpath(rfn); + if (rename(fn, rfn) == -1) + warn("%s: rename", rfn); + + free(rfn); free(fn); filepath_put(&rr->added, fp); } |
On Wed, Apr 07, 2021 at 12:50:15PM +0200, Claudio Jeker wrote:
> In some cases unlink reports 'no such file or directory' when the RRDP > repository is merged at the end of a RRDP sync. > The problem is that some deleted files are in the temporary location and > not part of the real repo. Because of this if unlink return ENOENT then > try the alternate location. > > While there cleanup the code a bit more and make the rename() and unlink() > case similar when it comes to the path generation bits. > > With this I no longer see the unlink errors. > OK? ok tb > -- > :wq Claudio > > Index: repo.c > =================================================================== > RCS file: /cvs/src/usr.sbin/rpki-client/repo.c,v > retrieving revision 1.3 > diff -u -p -r1.3 repo.c > --- repo.c 2 Apr 2021 05:16:29 -0000 1.3 > +++ repo.c 7 Apr 2021 09:01:59 -0000 > @@ -838,22 +838,37 @@ rrdp_merge_repo(struct rrdprepo *rr) > > /* XXX should delay deletes */ > RB_FOREACH_SAFE(fp, filepath_tree, &rr->deleted, nfp) { > - if ((fn = rrdp_filename(rr, fp->file, 0)) != NULL) { > - if (unlink(fn) == -1) > - warn("%s: unlink", fn); > - free(fn); > + fn = rrdp_filename(rr, fp->file, 1); > + rfn = rrdp_filename(rr, fp->file, 0); > + > + if (fn == NULL || rfn == NULL) > + errx(1, "bad filepath"); /* should not happen */ > + > + if (unlink(rfn) == -1) { > + if (errno == ENOENT) { > + if (unlink(fn) == -1) > + warn("%s: unlink", fn); > + } else > + warn("%s: unlink", rfn); > } > + > + free(rfn); > + free(fn); > filepath_put(&rr->deleted, fp); > } > > RB_FOREACH_SAFE(fp, filepath_tree, &rr->added, nfp) { > - if ((fn = rrdp_filename(rr, fp->file, 1)) != NULL && > - (rfn = rrdp_filename(rr, fp->file, 0)) != NULL) { > - repo_mkpath(rfn); > - if (rename(fn, rfn) == -1) > - warn("%s: link", rfn); > - free(rfn); > - } > + fn = rrdp_filename(rr, fp->file, 1); > + rfn = rrdp_filename(rr, fp->file, 0); > + > + if (fn == NULL || rfn == NULL) > + errx(1, "bad filepath"); /* should not happen */ > + > + repo_mkpath(rfn); > + if (rename(fn, rfn) == -1) > + warn("%s: rename", rfn); > + > + free(rfn); > free(fn); > filepath_put(&rr->added, fp); > } > |
Free forum by Nabble | Edit this page |