static inline int si_recoverindex(si *i, sr *r, sdsnapshot *s) { sitrack track; si_trackinit(&track); ssbuf buf; ss_bufinit(&buf); int rc; if (sd_snapshot_is(s)) { rc = si_tracksnapshot(&track, r, i, s); if (ssunlikely(rc == -1)) goto error; } rc = si_trackdir(&track, r, i); if (ssunlikely(rc == -1)) goto error; if (ssunlikely(track.count == 0)) return 1; rc = si_trackvalidate(&track, &buf, r, i); if (ssunlikely(rc == -1)) goto error; rc = si_recovercomplete(&track, r, i, &buf); if (ssunlikely(rc == -1)) goto error; /* set actual metrics */ if (track.nsn > r->seq->nsn) r->seq->nsn = track.nsn; if (track.lsn > r->seq->lsn) r->seq->lsn = track.lsn; si_recoversize(i); ss_buffree(&buf, r->a); return 0; error: ss_buffree(&buf, r->a); si_trackfree(&track, r); return -1; }
static inline int si_recoverindex(si *i, sr *r) { int rc = si_recoverdrop(i); if (srunlikely(rc)) return 0; sitrack track; si_trackinit(&track); srbuf buf; sr_bufinit(&buf); rc = si_trackdir(&track, r, i); if (srunlikely(rc == -1)) goto error; if (srunlikely(track.count == 0)) { sr_malfunction(r->e, "corrupted database repository: %s", i->conf->path); goto error; } rc = si_trackvalidate(&track, &buf, r, i); if (srunlikely(rc == -1)) goto error; rc = si_recovercomplete(&track, r, i, &buf); if (srunlikely(rc == -1)) goto error; /* set actual metrics */ if (track.nsn > r->seq->nsn) r->seq->nsn = track.nsn; if (track.lsn > r->seq->lsn) r->seq->lsn = track.lsn; sr_buffree(&buf, r->a); return 0; error: sr_buffree(&buf, r->a); si_trackfree(&track, r); return -1; }