Use CAS to Put consul state, and reacquire locks when necessary #14930
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Consul locks favor liveness, and when a client can't maintain it's session the lock is automatically released.
Since it isn't possible for Terraform to ensure that a lock is not lost at any point during execution, the only option is to attempt to reacquire the lock. When a consul lock is taken, start a goroutine to monitor the lock status channel and attempt to reacquire the lock immediately if it is lost.
This also converts the state Put operation to a CAS, which ensures that the state is always consistent, regardless of the state of the lock.
fixes #14312