John Boiles created THRIFT-4447:
-----------------------------------
Summary: Golang: Panic on p.c.Call when using deprecated
initializers
Key: THRIFT-4447
URL: https://issues.apache.org/jira/browse/THRIFT-4447
Project: Thrift
Issue Type: Bug
Components: Go - Compiler
Affects Versions: 0.11.0
Reporter: John Boiles
Latest thrift:master can cause panics when using deprecated `New*ClientFactory`
and `New*ClientProtocol` functions. This happens because both the Client and
the BaseClient have an instance of a {{thrift.TClient}}. The deprecated methods
initialize the BaseClient's TClient, but other methods use the Client's
{{TClient}}.
For example, current thrift master generates structs like this
{code}
type MyServiceClient struct {
c thrift.TClient
*MyServiceBaseClient
}
type MyServiceBaseClient struct {
c thrift.TClient
}
{code}
And also a method like this:
{code}
func NewMyServiceClientFactory(t thrift.TTransport, f thrift.TProtocolFactory)
*MyServiceClient {
return &MyServiceClient{MyServiceBaseClient:
NewMyServiceBaseClientFactory(t, f)}
}
{code}
If that method is used, later calls to service methods will panic, since
{{p.c}} is nil (the actual client was stored in {{p.BaseMyServiceClient.c}}).
{code}
func (p *MyServiceClient) DoStuff(ctx context.Context, request *DoStuffRequest)
(r *DoStuffResponse, err error) {
var _args139 DoStuffArgs
_args139.Request = request
var _result140 DoStuffResult
if err = p.c.Call(ctx, "do_stuff", &_args139, &_result140); err != nil
{ // PANIC
...
{code}
In progress fix here :https://github.com/apache/thrift/pull/1461. The fix in
this PR merely sets both instances of {{TClient}} (which is what happens in the
non-deprecated {{New*Client}} function).
This patch currently fails {{make -k check}} however, since
{{src/tutorial/tutorial.go}} tries to access a different package's version of
the BaseClient.
{code}
src/tutorial/tutorial.go:477:33: bc.c undefined (cannot refer to unexported
field or method c)
{code}
The fix for that test could possibly be to expose the BaseClient's instance of
{{c}} (by making it a capital and thus exported {{C}}), or adding an accessor
method {{C()}} or {{Client()}}.
Possibly a better fix would be to either remove these deprecated methods, or
figure out which {{TClient}} is the correct one to set.
I'm not sure which is preferred, so I'm hoping to get some feedback/input here.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)