Job A (deploy to functional test) is upstream of job B (run functional tests).
We need job A to block while its downstream job builds - otherwise a deployment while the functional tests are running will fail job B.
We need job B to block while its upstream job builds - otherwise trying to run the tests while the deployment is running will fail.
Unfortunately, if you configure A to block on downstream builds and B to block on upstream builds and A and B are scheduled at the same time they both block each other and are queued indefinitely, requiring manual intervention to clear the deadlock.
In this situation job A should build and B should remain blocked until A completes.