I am not familiar with that log message so maybe somebody else can help there.
On the latency, it's worth having a clear picture of the transaction flow and where latency will occur.
For the client submitting tx1:
- Client gets endorsements from peers for tx1, which involves the peers executing the transaction but not updating the ledger.
- Client assembles the proposal and endorsements into a transaction and sends to the orderer, then (by default) blocks waiting for the transaction to be committed on peers.
- Orderer waits for enough transactions to fill a block or for a block-cutting timeout (whichever comes first).
- Orderer commits a block and distributes to peers.
- Peers receive the block and update their copy of the ledger.
- Peers emit a block event (including the chaincode event for tx1).
- Client receive block events and unblocks the call to transaction.submit().
For the client submitting tx2, the contract event listener receives the contract event emitted by tx1 at the last step of the tx1 flow above. This triggers a new transaction submit, which duplicates the first flow.
There is distributed work on going in the flow so there is going to be some latency. Under low loads, the pause before the orderer commits a block is often the largest chunk of this end-to-end latency. You can tune the orderer configuration to minimise the delay. However, under load the block tend to be cut quicker as the orderer fills the blocks before reaching the block cutting timeout so, provided the system is not overloaded, both throughput and latency often improve under load.
A more fundamental question to consider is whether you really need the second separate transaction triggered by the contract event emitted from the first transaction. If the two things must always happen together, can you do all the work in a single transaction? Or at least do a chaincode-to-chaincode call as part of the first transaction so both transaction functions are executed and committed as one?