Giter VIP home page Giter VIP logo

Comments (6)

mwitkow avatar mwitkow commented on May 9, 2024

@feliksik In order to use the grpc_retry CallOptions within your code invocations, you need to use either the UnaryClient or ServerClient interceptors when you instantiate the connection (on grpc.Dial)

These interceptors are the things that actually drive the calling logic, and the CallOptions are just per-call overrides.

You spotted a bug that I have no immediate way of fixing. You see, the CallOptions interface in grpc itself has private methods. Which means one needs to resort to a hack:

  • the grpc_retry.CallOption anonymously implements the grpc.CallOption interface. However it doesn't implement the private before and after functions, because it can't.
  • the interceptors strip out these grpc_retry.CallOptions before passing them to the grpc.invoker call which relies on before and after being implemented.

As such, the code panics. Sadly there are two ways around this:

  • either make the grpc_retry.CallOption use one of the Headers, Failfast, Peer or Trailers grpc.CallOptions as parents, and thus potentially disable the ability to use one of them by the user
  • or work with upstream to implent grpc.CallOptions.Noop. I'll file a bug.

from go-grpc-middleware.

mwitkow avatar mwitkow commented on May 9, 2024

Let's see what upstream responds, this is a snippet of a test that will make it fail:

func (s *RetrySuite) TestCallOptionsDontPanicWithoutMiddleware() {
	s.srv.resetFailingConfiguration(3, codes.DataLoss, noSleep) // see retriable_errors
	nonMiddlewareClient := s.NewClient()
	_, err := nonMiddlewareClient.Ping(s.SimpleCtx(), goodPing,
		grpc_retry.WithMax(5),
		//grpc_retry.WithBackoff(grpc_retry.BackoffLinear(1*time.Millisecond)),
		//grpc_retry.WithCodes(codes.Aborted, codes.InvalidArgument),
		//grpc_retry.WithPerRetryTimeout(30*time.Millisecond),
	)
	require.NoError(s.T(), err, "the third invocation should succeed")
}

from go-grpc-middleware.

feliksik avatar feliksik commented on May 9, 2024

Thanks for the clear response! I'll just make sure to use an interceptor in Dial() then.

When the NoopOption would be implemented upstream, I'm still not sure how the internals work to apply the grpc_retry.WithMax(5) magically to the correct interceptor... but I can work around that.

from go-grpc-middleware.

mwitkow avatar mwitkow commented on May 9, 2024

When the NoopOption is implemented, you will still need to have an interceptor implemented. A simple option is not going to be enough.

from go-grpc-middleware.

mwitkow avatar mwitkow commented on May 9, 2024

So it seems upstream has a PR for it:
grpc/grpc-go#1244

So there's hope for a proper fix! :)

from go-grpc-middleware.

mwitkow avatar mwitkow commented on May 9, 2024

Yup, there's a fix for it upstream, and we'll wait for the 1.4 gRPC Go release.

from go-grpc-middleware.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.