xds: resolver handle good update after getting an error (#3374)
This commit is contained in:
@ -171,7 +171,7 @@ func (r *xdsResolver) run() {
|
|||||||
case update := <-r.updateCh:
|
case update := <-r.updateCh:
|
||||||
if update.err != nil {
|
if update.err != nil {
|
||||||
r.cc.ReportError(update.err)
|
r.cc.ReportError(update.err)
|
||||||
return
|
continue
|
||||||
}
|
}
|
||||||
sc := fmt.Sprintf(jsonFormatSC, update.su.Cluster)
|
sc := fmt.Sprintf(jsonFormatSC, update.su.Cluster)
|
||||||
r.cc.UpdateState(resolver.State{
|
r.cc.UpdateState(resolver.State{
|
||||||
|
@ -324,3 +324,50 @@ func TestXDSResolverGoodServiceUpdate(t *testing.T) {
|
|||||||
t.Fatalf("ClientConn.UpdateState received error in service config: %v", rState.ServiceConfig.Err)
|
t.Fatalf("ClientConn.UpdateState received error in service config: %v", rState.ServiceConfig.Err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestXDSResolverUpdates tests the cases where the resolver gets a good update
|
||||||
|
// after an error, and an error after the good update.
|
||||||
|
func TestXDSResolverGoodUpdateAfterError(t *testing.T) {
|
||||||
|
xdsC := fakeclient.NewClient()
|
||||||
|
xdsR, tcc, cancel := testSetup(t, setupOpts{
|
||||||
|
config: &validConfig,
|
||||||
|
xdsClientFunc: func(_ xdsclient.Options) (xdsClientInterface, error) { return xdsC, nil },
|
||||||
|
})
|
||||||
|
defer func() {
|
||||||
|
cancel()
|
||||||
|
xdsR.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
waitForWatchService(t, xdsC, targetStr)
|
||||||
|
|
||||||
|
// Invoke the watchAPI callback with a bad service update and wait for the
|
||||||
|
// ReportError method to be called on the ClientConn.
|
||||||
|
suErr := errors.New("bad serviceupdate")
|
||||||
|
xdsC.InvokeWatchServiceCallback("", suErr)
|
||||||
|
if gotErrVal, gotErr := tcc.errorCh.Receive(); gotErr != nil || gotErrVal != suErr {
|
||||||
|
t.Fatalf("ClientConn.ReportError() received %v, want %v", gotErrVal, suErr)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invoke the watchAPI callback with a good service update and wait for the
|
||||||
|
// UpdateState method to be called on the ClientConn.
|
||||||
|
xdsC.InvokeWatchServiceCallback(cluster, nil)
|
||||||
|
gotState, err := tcc.stateCh.Receive()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("ClientConn.UpdateState returned error: %v", err)
|
||||||
|
}
|
||||||
|
rState := gotState.(resolver.State)
|
||||||
|
if gotClient := rState.Attributes.Value(xdsinternal.XDSClientID); gotClient != xdsC {
|
||||||
|
t.Fatalf("ClientConn.UpdateState got xdsClient: %v, want %v", gotClient, xdsC)
|
||||||
|
}
|
||||||
|
if err := rState.ServiceConfig.Err; err != nil {
|
||||||
|
t.Fatalf("ClientConn.UpdateState received error in service config: %v", rState.ServiceConfig.Err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invoke the watchAPI callback with a bad service update and wait for the
|
||||||
|
// ReportError method to be called on the ClientConn.
|
||||||
|
suErr2 := errors.New("bad serviceupdate 2")
|
||||||
|
xdsC.InvokeWatchServiceCallback("", suErr2)
|
||||||
|
if gotErrVal, gotErr := tcc.errorCh.Receive(); gotErr != nil || gotErrVal != suErr2 {
|
||||||
|
t.Fatalf("ClientConn.ReportError() received %v, want %v", gotErrVal, suErr2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user