From 0f8932f4ef95549a3fefa030f9e2009c5ea59455 Mon Sep 17 00:00:00 2001 From: Callum Waters Date: Tue, 7 Sep 2021 12:02:16 +0200 Subject: [PATCH] light: fix early erroring (#6905) --- light/client.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/light/client.go b/light/client.go index 525d21457..51330c77c 100644 --- a/light/client.go +++ b/light/client.go @@ -239,7 +239,7 @@ func NewClientFromTrustedStore( } // Validate the number of witnesses. - if len(c.witnesses) < 1 { + if len(c.witnesses) == 0 { return nil, ErrNoWitnesses } @@ -1001,14 +1001,14 @@ func (c *Client) lightBlockFromPrimary(ctx context.Context, height int64) (*type case provider.ErrNoResponse, provider.ErrLightBlockNotFound, provider.ErrHeightTooHigh: // we find a new witness to replace the primary - c.logger.Debug("error from light block request from primary, replacing...", + c.logger.Info("error from light block request from primary, replacing...", "error", err, "height", height, "primary", c.primary) return c.findNewPrimary(ctx, height, false) default: // The light client has most likely received either provider.ErrUnreliableProvider or provider.ErrBadLightBlock // These errors mean that the light client should drop the primary and try with another provider instead - c.logger.Error("error from light block request from primary, removing...", + c.logger.Info("error from light block request from primary, removing...", "error", err, "height", height, "primary", c.primary) return c.findNewPrimary(ctx, height, true) } @@ -1046,7 +1046,7 @@ func (c *Client) findNewPrimary(ctx context.Context, height int64, remove bool) c.providerMutex.Lock() defer c.providerMutex.Unlock() - if len(c.witnesses) <= 1 { + if len(c.witnesses) == 0 { return nil, ErrNoWitnesses } @@ -1117,6 +1117,11 @@ func (c *Client) findNewPrimary(ctx context.Context, height int64, remove bool) } } + // remove witnesses marked as bad. Removal is done in descending order + if err := c.removeWitnesses(witnessesToRemove); err != nil { + c.logger.Error("failed to remove witnesses", "err", err, "witnessesToRemove", witnessesToRemove) + } + return nil, lastError } @@ -1129,7 +1134,7 @@ func (c *Client) compareFirstHeaderWithWitnesses(ctx context.Context, h *types.S c.providerMutex.Lock() defer c.providerMutex.Unlock() - if len(c.witnesses) < 1 { + if len(c.witnesses) == 0 { return ErrNoWitnesses } @@ -1171,7 +1176,7 @@ and remove witness. Otherwise, use the different primary`, e.WitnessIndex), "wit // remove witnesses that have misbehaved if err := c.removeWitnesses(witnessesToRemove); err != nil { - return err + c.logger.Error("failed to remove witnesses", "err", err, "witnessesToRemove", witnessesToRemove) } return nil