static void DispatchRpc(RpcClient rpcClient, IntPtr rpc, Protos.Request req) { Task.Run(async() => { var start = Stopwatch.StartNew(); var res = new Protos.Response(); try { res = await HandleRpc(rpcClient, req, req.Type); } catch (Exception e) { res = GetErrorResponse("PIT-500", e.Message); var innerMostException = e; while (innerMostException.InnerException != null) { innerMostException = innerMostException.InnerException; } Logger.Error("Exception thrown in handler: {0}", innerMostException.Message); #if NPITAYA_DEBUG Logger.Error("StackTrace: {0}", e.StackTrace); #endif } finally { start.Stop(); _metricsReporter?.ObserveHistogram(RPC_LATENCY_METRIC, (float)start.Elapsed.TotalSeconds, null); unsafe { byte[] responseData = res.ToByteArray(); Int32 responseLen = responseData.Length; fixed(byte *p = responseData) { IntPtr err = pitaya_rpc_respond(rpc, (IntPtr)p, responseLen); if (err != IntPtr.Zero) { pitaya_error_drop(err); Logger.Error("Failed to respond to rpc"); } } } } }); }
static void DispatchRpc(RpcClient rpcClient, IntPtr rpc, Protos.Request req) { Task.Run(async() => { var res = new Protos.Response(); try { res = await HandleRpc(rpcClient, req, req.Type); } catch (Exception e) { res = GetErrorResponse("PIT-500", e.Message); var innerMostException = e; while (innerMostException.InnerException != null) { innerMostException = innerMostException.InnerException; } Logger.Error("Exception thrown in handler: {0}", innerMostException.Message); #if NPITAYA_DEBUG Logger.Error("StackTrace: {0}", e.StackTrace); #endif } finally { unsafe { byte[] responseData = res.ToByteArray(); Int32 responseLen = responseData.Length; fixed(byte *p = responseData) { IntPtr err = pitaya_rpc_respond(rpc, (IntPtr)p, responseLen); if (err != IntPtr.Zero) { pitaya_error_drop(err); Logger.Error("Failed to respond to rpc"); } } } } }); }