This issue is resolved in VMware NSX-T Data Center for vSphere 6.4.3.
Firewall Publish Section API is invoked (by either Service Composer, DFW UI or REST API)
This API internally calls into SimpleTaskManager, which creates a new Job in the database for each cluster-id which needs rule update. Then the cache is updated for cluster-id to job-id mappings.
Note that at this point, the job object is just created in the database and it will not start execution until this transaction is committed to the database. After transaction commits, a thread will be allocated for this job to execute. Once the job starts executing, this entry is removed from the cache.
Next time publish is triggered, the cache in the SimpleTaskManager is referred for any existing entry for given cluster-id. If an entry is found, no new job is created, instead, just a counter is updated and the flow returns. The entry in the cache means that there already a job created to publish rules on this cluster, which is yet to start and it will take care of publishing rules for this cluster-id.
The exception that is seen in the vsm.logs, resulted in rolling back of the transaction and the job objects created in the database were also rolled back, but the job-ids still remained in the cache, resulting in cache corruption. From this point onwards, whenever there will be a publish request for any of these clusters (have corrupt entry in the cache), only the counter will be incremented and no new task will be scheduled. The end result is that the IP for the VM is never pushed down to the address set local to ESXi.
The only option to recover from this situation is to restart the NSX Manager, which resets the cache.