You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@arrow.apache.org by "Paul Nienaber (CW)" <pa...@dremio.com.INVALID> on 2023/02/23 21:10:48 UTC

C++ build (Protobuf visibility) issues

Hi,

We're working on an extension to part of the Arrow protocol, and running
into very unexpected (and so far very hard to diagnose) build issues
relating to how Protobuf generated classes are exposed.

For example the existing code (arrow/flight/sql/server.cc) uses some of the
Protobuf types unqualified (no namespace etc.):

arrow::Result<ActionCancelQueryRequest> ParseActionCancelQueryRequest(

However newly-added Protobuf message types used in the same manner result
in the compiler (clang/MacOS) suggesting using the namespace-qualified name
which is obviously not the convention:

Proto:
message ActionCloseSessionRequest {
  option (experimental) = true;
}

arrow/flight/sql/server.cc:
arrow::Result<ActionCloseSessionRequest> ParseActionCloseSessionRequest(

->

[...]/git/arrow/cpp/src/arrow/flight/sql/server.cc:274:15: error: unknown
type name 'ActionCloseSessionRequest'; did you mean
'protocol::sql::ActionCloseSessionRequest'?

Is there some Protobuf or preprocessor/build system magic going on that I'm
missing that is obscuring anything other than whitelisted symbols (e.g.
ParseActionCancelQueryRequest being visible)?

Cheers
Paul

Re: C++ build (Protobuf visibility) issues

Posted by David Li <li...@apache.org>.
In this case, there are plain C++ classes written for each of the Protobuf classes [1]. The Protobuf classes are always used qualified.

We don't expose Protobuf in the public API, so these 'duplicate' classes are necessary.

[1]: https://github.com/apache/arrow/blob/29553fd679ec3c114ae6e1eef8e279e55ce55a18/cpp/src/arrow/flight/sql/server.h#L191-L194

On Thu, Feb 23, 2023, at 16:10, Paul Nienaber (CW) wrote:
> Hi,
>
> We're working on an extension to part of the Arrow protocol, and running
> into very unexpected (and so far very hard to diagnose) build issues
> relating to how Protobuf generated classes are exposed.
>
> For example the existing code (arrow/flight/sql/server.cc) uses some of the
> Protobuf types unqualified (no namespace etc.):
>
> arrow::Result<ActionCancelQueryRequest> ParseActionCancelQueryRequest(
>
> However newly-added Protobuf message types used in the same manner result
> in the compiler (clang/MacOS) suggesting using the namespace-qualified name
> which is obviously not the convention:
>
> Proto:
> message ActionCloseSessionRequest {
>   option (experimental) = true;
> }
>
> arrow/flight/sql/server.cc:
> arrow::Result<ActionCloseSessionRequest> ParseActionCloseSessionRequest(
>
> ->
>
> [...]/git/arrow/cpp/src/arrow/flight/sql/server.cc:274:15: error: unknown
> type name 'ActionCloseSessionRequest'; did you mean
> 'protocol::sql::ActionCloseSessionRequest'?
>
> Is there some Protobuf or preprocessor/build system magic going on that I'm
> missing that is obscuring anything other than whitelisted symbols (e.g.
> ParseActionCancelQueryRequest being visible)?
>
> Cheers
> Paul