On 14/06/2018 20:34, Howard Chu wrote: > Hallvard Breien Furuseth wrote: >> Wait, what? The child didn't write any pids to the table. If >> there are pids for it to clear, something is wrong. That can be: > > No, there most likely aren't PIDs for it to clear. But most importantly, > it must not clear using env->me_pid since that is still the parent's PID. > >> - The pid is from an older run, and the system reused the pid. If we >>   code for this, it should be to clear such pids during mdb_env_open. >>   It gets very arbitrary to clear them when the user does env_close() >>   in the child and the child happens to have the that reused pid. > > No. If the system reused the PID then that means the previous owner of > that PID is dead already anyway.
Right... > If there are any table entries under > that PID there's no problem removing them. The problem is that it's arbitrary. Something is exiting without clearing its pid slots, and 0.001% of the time this code will catch it. Better to skip this cleanup, or to always do it - but "always" belongs in env_open(). If a new env is seeing its pid in use, then it can safely clean it out. Last we talked about that, I liked it and you did not:-) >> - The child opened a new MDB_env with the same path, and closes the >>   parent's env afterwards. Don't Do That, users. But what to do in >>   this situation, if we are to have code for it, is to do nothing with >>   the lockfile. Not close it either, since closing it will lose the >>   lock for the env which was opened in the child. > > That's a completely different case. This ITS is specifically about a > process with an open environment that subsequently forks. No, I mean: Parent, pid P: open env A. Child, pid Q: - open and start using env B with the same path. - close env A, while B is still open. With the new code, this clears pid Q - i.e. B's pids. But lmdb.h already lists that as a "don't do that", because it also removes B's lock on the lockfile.
