indigophox commented on code in PR #40071:
URL: https://github.com/apache/arrow/pull/40071#discussion_r1491914342


##########
cpp/src/arrow/flight/transport/grpc/grpc_server.cc:
##########
@@ -465,62 +573,84 @@ class GrpcServiceHandler final : public 
FlightService::Service {
   ::grpc::Status DoGet(ServerContext* context, const pb::Ticket* request,
                        ServerWriter<pb::FlightData>* writer) {
     GrpcServerCallContext flight_context(context);
-    GRPC_RETURN_NOT_GRPC_OK(CheckAuth(FlightMethod::DoGet, context, 
flight_context));
+    GRPC_CALL_THEN_RETURN_NOT_GRPC_OK(
+        addMiddlewareHeaders(context, flight_context),
+        CheckAuth(FlightMethod::DoGet, context, flight_context, true));
 
-    CHECK_ARG_NOT_NULL(flight_context, request, "ticket cannot be null");
+    CHECK_ARG_NOT_NULL_WITH_CALL(flight_context, request, "ticket cannot be 
null",
+                                 addMiddlewareHeaders(context, 
flight_context));
 
     Ticket ticket;
-    SERVICE_RETURN_NOT_OK(flight_context, internal::FromProto(*request, 
&ticket));
+    SERVICE_CALL_THEN_RETURN_NOT_OK(flight_context,
+                                    addMiddlewareHeaders(context, 
flight_context),
+                                    internal::FromProto(*request, &ticket));
 
-    GetDataStream stream(writer);
-    RETURN_WITH_MIDDLEWARE(flight_context,
-                           impl_->DoGet(flight_context, std::move(ticket), 
&stream));
+    GetDataStream stream(writer,
+                         [&]() { addMiddlewareHeaders(context, 
flight_context); });
+    RETURN_WITH_CALL_AND_MIDDLEWARE(
+        flight_context, stream.TryCallOnceBeforeWrite(),
+        impl_->DoGet(flight_context, std::move(ticket), &stream));
   }
 
   ::grpc::Status DoPut(
       ServerContext* context,
       ::grpc::ServerReaderWriter<pb::PutResult, pb::FlightData>* reader) {
     GrpcServerCallContext flight_context(context);
-    GRPC_RETURN_NOT_GRPC_OK(CheckAuth(FlightMethod::DoPut, context, 
flight_context));
+    GRPC_CALL_THEN_RETURN_NOT_GRPC_OK(
+        addMiddlewareHeaders(context, flight_context),
+        CheckAuth(FlightMethod::DoPut, context, flight_context, true));
 
-    PutDataStream stream(reader);
-    RETURN_WITH_MIDDLEWARE(flight_context, impl_->DoPut(flight_context, 
&stream));
+    PutDataStream stream(reader,
+                         [&]() { addMiddlewareHeaders(context, 
flight_context); });
+    RETURN_WITH_CALL_AND_MIDDLEWARE(flight_context, 
stream.TryCallOnceBeforeWrite(),
+                                    impl_->DoPut(flight_context, &stream));
   }
 
   ::grpc::Status DoExchange(
       ServerContext* context,
       ::grpc::ServerReaderWriter<pb::FlightData, pb::FlightData>* stream) {
     GrpcServerCallContext flight_context(context);
-    GRPC_RETURN_NOT_GRPC_OK(CheckAuth(FlightMethod::DoExchange, context, 
flight_context));
+    GRPC_CALL_THEN_RETURN_NOT_GRPC_OK(
+        addMiddlewareHeaders(context, flight_context),
+        CheckAuth(FlightMethod::DoExchange, context, flight_context, true));
 
-    ExchangeDataStream data_stream(stream);
-    RETURN_WITH_MIDDLEWARE(flight_context,
-                           impl_->DoExchange(flight_context, &data_stream));
+    ExchangeDataStream data_stream(
+        stream, [&]() { addMiddlewareHeaders(context, flight_context); });
+    RETURN_WITH_CALL_AND_MIDDLEWARE(flight_context, 
data_stream.TryCallOnceBeforeWrite(),
+                                    impl_->DoExchange(flight_context, 
&data_stream));
   }
 
   ::grpc::Status ListActions(ServerContext* context, const pb::Empty* request,
                              ServerWriter<pb::ActionType>* writer) {
     GrpcServerCallContext flight_context(context);
-    GRPC_RETURN_NOT_GRPC_OK(
-        CheckAuth(FlightMethod::ListActions, context, flight_context));
+    GRPC_CALL_THEN_RETURN_NOT_GRPC_OK(
+        addMiddlewareHeaders(context, flight_context),
+        CheckAuth(FlightMethod::ListActions, context, flight_context, true));
     // Retrieve the listing from the implementation
     std::vector<ActionType> types;
-    SERVICE_RETURN_NOT_OK(flight_context,
-                          impl_->base()->ListActions(flight_context, &types));
+    auto res = impl_->base()->ListActions(flight_context, &types);
+    addMiddlewareHeaders(context, flight_context);
+    SERVICE_RETURN_NOT_OK(flight_context, res);
     RETURN_WITH_MIDDLEWARE(flight_context, WriteStream<ActionType>(types, 
writer));
   }
 
   ::grpc::Status DoAction(ServerContext* context, const pb::Action* request,
                           ServerWriter<pb::Result>* writer) {
     GrpcServerCallContext flight_context(context);
-    GRPC_RETURN_NOT_GRPC_OK(CheckAuth(FlightMethod::DoAction, context, 
flight_context));
-    CHECK_ARG_NOT_NULL(flight_context, request, "Action cannot be null");
+    GRPC_CALL_THEN_RETURN_NOT_GRPC_OK(
+        addMiddlewareHeaders(context, flight_context),

Review Comment:
   Ack.
   
   Related, what do you think about a change of the macro naming to something 
more like `GRPC_ON_GRPC_NOT_OK_CALL_THEN_RETURN` as this is getting kind of 
backwards and impossible to read, and especially starting with 
`SERVICE_CALL_[...]` just parses as if "service call" is what's being talked 
about, vs `SERVICE_ON_NOT_OK_CALL_THEN_RETURN` i.e. semantically 
<TYPE>_ON_<CONDITION>_<DO_WHAT>.  Not that I'm sure I want to chainsaw the 
macros any more than I have :)



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to