fixed data race in core.Connection.Close(). 61/35861/2
authorSergey Elantsev <elantsev.s@yandex.ru>
Fri, 1 Apr 2022 19:43:40 +0000 (22:43 +0300)
committerOndrej Fabry <ofabry@cisco.com>
Thu, 5 May 2022 01:29:15 +0000 (01:29 +0000)
commit945b7c7ae69c414ef851f85596be4edeb1d9290e
tree9aaa14e1461dbd6ea4b175215bd1844f3672c40e
parent4a4094e6cdc7f5d9e5a470ccf82df1c780c7e224
fixed data race in core.Connection.Close().

The problem is triggered by the following events:
1. VPP stops.
2. core.Connection.healthCheckLoop() detects it and calls disconnectVPP(),
   which does close healthCheckDone channel for the first time.
   At this point Connection becomes unusable - re-entrance to
   connectLoop() will return immediately because of a closed
   healthCheckDone channel.
   But, the race is that connection may set c.vppConnected = 1
   before terminating the connect loop.
3. User calls Connection.Close(), who seed c.vppConnected = 1,
   and tries to close already closed channel, which leads to a panic.

This commit fixes this race by telling disconnectVPP() whether
it is a terminal stop triggered via Close(), or a temporary one
from connectLoop().

Change-Id: I555149da35ca3dc2b606bad59f2101266c0ef6b9
Signed-off-by: Sergey Elantsev <elantsev.s@yandex.ru>
core/connection.go
core/connection_test.go