Hi all,

I've been working on some patches recently that required adding a new
protocol and some RPC calls that will be used entirely internally to
HDFS -- i.e the types and functions are never exposed to clients. The
process to do this involved:
1) Add a new .proto file MyProtocol.proto with the types and the
service definition
2) Add a new empty Java interface MyProtocolPB.java which adds the
ProtocolInfo and KerberosInfo annotations
3) Add a new Java interface MyProtocol.java which duplicates the same
methods I defined in the protobuf service
4) For each new type, create a new Java class which duplicates the
fields, getters, and setters from the protobuf messages
5) Create a Client-Side Translator and Server-Side Translator class,
each containing a wrapper method for each of the calls
6) Create a PBHelper class which contains two convert() methods for
each of the new types

Given that we have many protocols that we never intend to expose, I
see little benefit to adding the indirection layer here. It only makes
the task of modifying the protocols quite onerous and full of
duplicate boilerplate code.
I'd like to propose that, when adding protocols that are meant to be
HDFS-private, we drop steps 3-6 and use the protobuf RPC engine
directly. Doing this doesn't force our hand or limit our options in
the future -- should we want to add an alternate mechanism one can
always add the indirection layer down the road.

Thoughts?

-Todd
-- 
Todd Lipcon
Software Engineer, Cloudera

Reply via email to