This might be on the border line between a bug and an enhancement request. Retag if desired.
We have been hit by the gpg-agent ending up in somewhat of an inconsistent state after the //homedir// had been moved. This happens in our build process, but I've attached a transcript illustrating the problem in a simplified way in an attachment. What happens is essentially.
# A GnuPG //homedir// is extracted from a tar file. This was created by an old GnuPG version, and thus contains a `secring.gpg` file with the secret keys.
# When using this //homedir//, the secret keys are automatically migrated to a `private-keys-v1.d `subdirectory.
# The //homedir// is moved to another name.
# The original contents of the //homedir// is extracted again.
# When using this new //homedir//, the agent will believe it is serving the new instance of the directory. Also, it uses //inotify//, and since the directory still exists, there hasn't been any notification. But the `gpg` client command will not see any migration, so it will try the migration again. This will fail, since the agent will try to write to the directory `private-keys-v1.d` inside the new copy of the directory, where no such directory exists.
The root of the problem is as I understand it that gpg-agent uses inode in one case but the path in another case. From my linux-only perspective it seems like a possible solution would be to.
# Let `gpg-agent` do //chdir()// into the //homedir//. That way, it could use relative paths to everything inside, and not be dependent on the directory's position inside the full file tree.
# Use a //device-inode// combination rather than the path to identify the gpg-agent inside `/run/user/<uid>/gnupg`. That way, the `gpg` client would not think the agent is serving the new copy of the directory, and instead start a new agent instance. Conversely a client that tried to use the old //homedir// under its new name **would** find the agent for it, and could avoid starting a second.
OS: Red Hat Enterprise Linux 8
GnuPG package: gnupg2-2.2.9-1.el8.x86_64