Currently the logic is such that if there is already a block (or compact block) in flight, and another block is announced, it will request a full block rather than a compact block. Example debug.log:-
2016-12-11 03:22:21.176293 recv new best header 000000000000000000d090b379d076118bbb4f670777faef98106fc911239a51 (442881) age=46s peer=15
2016-12-11 03:22:21.176420 send getdata cmpctblock 000000000000000000d090b379d076118bbb4f670777faef98106fc911239a51 (442881) peer=15
2016-12-11 03:22:21.176477 send sendcmpct (announce) ver=1 peer=15
2016-12-11 03:22:21.177076 recv new best header 00000000000000000038f3546709d33649f48339a54fe67c55cc4e568704d7d7 (442882) age=7s peer=15
2016-12-11 03:22:21.177210 send getdata block 00000000000000000038f3546709d33649f48339a54fe67c55cc4e568704d7d7 (442882) peer=15
In this example, the 2nd announced block could also have been requested as a compact block.
Currently the logic is such that if there is already a block (or compact block) in flight, and another block is announced, it will request a full block rather than a compact block. Example debug.log:-
In this example, the 2nd announced block could also have been requested as a compact block.