kbobyrev updated this revision to Diff 280846. kbobyrev marked 3 inline comments as done. kbobyrev added a comment.
Move back to duplicated code. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D84499/new/ https://reviews.llvm.org/D84499 Files: clang-tools-extra/clangd/index/remote/Client.cpp clang-tools-extra/clangd/index/remote/server/Server.cpp
Index: clang-tools-extra/clangd/index/remote/server/Server.cpp =================================================================== --- clang-tools-extra/clangd/index/remote/server/Server.cpp +++ clang-tools-extra/clangd/index/remote/server/Server.cpp @@ -6,9 +6,13 @@ // //===----------------------------------------------------------------------===// +#include "Index.pb.h" #include "index/Index.h" #include "index/Serialization.h" +#include "index/Symbol.h" #include "index/remote/marshalling/Marshalling.h" +#include "support/Logger.h" +#include "support/Trace.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Path.h" @@ -16,6 +20,7 @@ #include <grpc++/grpc++.h> #include <grpc++/health_check_service_interface.h> +#include <type_traits> #include "Index.grpc.pb.h" @@ -35,6 +40,16 @@ llvm::cl::opt<std::string> IndexRoot(llvm::cl::desc("<PROJECT ROOT>"), llvm::cl::Positional, llvm::cl::Required); +llvm::cl::opt<std::string> TraceFile( + "trace-file", + llvm::cl::desc("Path to the file where tracer logs will be stored")); + +llvm::cl::opt<bool> PrettyPrint{ + "pretty", + llvm::cl::desc("Pretty-print JSON output in the trace"), + llvm::cl::init(false), +}; + llvm::cl::opt<std::string> ServerAddress( "server-address", llvm::cl::init("0.0.0.0:50051"), llvm::cl::desc("Address of the invoked server. Defaults to 0.0.0.0:50051")); @@ -59,6 +74,7 @@ grpc::Status Lookup(grpc::ServerContext *Context, const LookupRequest *Request, grpc::ServerWriter<LookupReply> *Reply) override { + trace::Span Tracer(LookupRequest::descriptor()->name()); clangd::LookupRequest Req; for (const auto &ID : Request->ids()) { auto SID = SymbolID::fromStr(StringRef(ID)); @@ -66,58 +82,83 @@ return grpc::Status::CANCELLED; Req.IDs.insert(*SID); } - Index->lookup(Req, [&](const clangd::Symbol &Sym) { - auto SerializedSymbol = ProtobufMarshaller->toProtobuf(Sym); - if (!SerializedSymbol) + unsigned Sent = 0; + unsigned FailedToSend = 0; + Index->lookup(Req, [&](const auto &Item) { + auto SerializedItem = ProtobufMarshaller->toProtobuf(Item); + if (!SerializedItem) { + ++FailedToSend; return; + } LookupReply NextMessage; - *NextMessage.mutable_stream_result() = *SerializedSymbol; + *NextMessage.mutable_stream_result() = *SerializedItem; Reply->Write(NextMessage); + ++Sent; }); LookupReply LastMessage; LastMessage.set_final_result(true); Reply->Write(LastMessage); + SPAN_ATTACH(Tracer, "Sent", Sent); + SPAN_ATTACH(Tracer, "Failed to send", FailedToSend); return grpc::Status::OK; } grpc::Status FuzzyFind(grpc::ServerContext *Context, const FuzzyFindRequest *Request, grpc::ServerWriter<FuzzyFindReply> *Reply) override { + trace::Span Tracer(LookupRequest::descriptor()->name()); const auto Req = ProtobufMarshaller->fromProtobuf(Request); - bool HasMore = Index->fuzzyFind(Req, [&](const clangd::Symbol &Sym) { - auto SerializedSymbol = ProtobufMarshaller->toProtobuf(Sym); - if (!SerializedSymbol) + unsigned Sent = 0; + unsigned FailedToSend = 0; + bool HasMore = Index->fuzzyFind(Req, [&](const auto &Item) { + auto SerializedItem = ProtobufMarshaller->toProtobuf(Item); + if (!SerializedItem) { + ++FailedToSend; return; + } FuzzyFindReply NextMessage; - *NextMessage.mutable_stream_result() = *SerializedSymbol; + *NextMessage.mutable_stream_result() = *SerializedItem; Reply->Write(NextMessage); + ++Sent; }); FuzzyFindReply LastMessage; LastMessage.set_final_result(HasMore); Reply->Write(LastMessage); + SPAN_ATTACH(Tracer, "Sent", Sent); + SPAN_ATTACH(Tracer, "Failed to send", FailedToSend); return grpc::Status::OK; } grpc::Status Refs(grpc::ServerContext *Context, const RefsRequest *Request, grpc::ServerWriter<RefsReply> *Reply) override { + trace::Span Tracer(LookupRequest::descriptor()->name()); clangd::RefsRequest Req; for (const auto &ID : Request->ids()) { auto SID = SymbolID::fromStr(StringRef(ID)); - if (!SID) + if (!SID) { + elog("Refs request cancelled: invalid SymbolID {1}", SID.takeError()); return grpc::Status::CANCELLED; + } Req.IDs.insert(*SID); } - bool HasMore = Index->refs(Req, [&](const clangd::Ref &Reference) { - auto SerializedRef = ProtobufMarshaller->toProtobuf(Reference); - if (!SerializedRef) + unsigned Sent = 0; + unsigned FailedToSend = 0; + bool HasMore = Index->refs(Req, [&](const auto &Item) { + auto SerializedItem = ProtobufMarshaller->toProtobuf(Item); + if (!SerializedItem) { + ++FailedToSend; return; + } RefsReply NextMessage; - *NextMessage.mutable_stream_result() = *SerializedRef; + *NextMessage.mutable_stream_result() = *SerializedItem; Reply->Write(NextMessage); + ++Sent; }); RefsReply LastMessage; LastMessage.set_final_result(HasMore); Reply->Write(LastMessage); + SPAN_ATTACH(Tracer, "Sent", Sent); + SPAN_ATTACH(Tracer, "Failed to send", FailedToSend); return grpc::Status::OK; } @@ -154,6 +195,29 @@ return -1; } + llvm::Optional<llvm::raw_fd_ostream> TracerStream; + std::unique_ptr<clang::clangd::trace::EventTracer> Tracer; + if (!TraceFile.empty()) { + std::error_code EC; + TracerStream.emplace(TraceFile, EC, + llvm::sys::fs::FA_Read | llvm::sys::fs::FA_Write); + if (EC) { + TracerStream.reset(); + llvm::errs() << "Error while opening trace file " << TraceFile << ": " + << EC.message(); + } else { + // FIXME(kirillbobyrev): Also create metrics tracer to track latency and + // accumulate other request statistics. + Tracer = clang::clangd::trace::createJSONTracer(*TracerStream, + /*PrettyPrint=*/false); + llvm::outs() << "Successfully created a tracer.\n"; + } + } + + llvm::Optional<clang::clangd::trace::Session> TracingSession; + if (Tracer) + TracingSession.emplace(*Tracer); + std::unique_ptr<clang::clangd::SymbolIndex> Index = openIndex(IndexPath); if (!Index) { Index: clang-tools-extra/clangd/index/remote/Client.cpp =================================================================== --- clang-tools-extra/clangd/index/remote/Client.cpp +++ clang-tools-extra/clangd/index/remote/Client.cpp @@ -37,12 +37,15 @@ bool FinalResult = false; trace::Span Tracer(RequestT::descriptor()->name()); const auto RPCRequest = ProtobufMarshaller->toProtobuf(Request); + SPAN_ATTACH(Tracer, "Request", RPCRequest.DebugString()); grpc::ClientContext Context; std::chrono::system_clock::time_point Deadline = std::chrono::system_clock::now() + DeadlineWaitingTime; Context.set_deadline(Deadline); auto Reader = (Stub.get()->*RPCCall)(&Context, RPCRequest); ReplyT Reply; + unsigned Successful = 0; + unsigned FailedToParse = 0; while (Reader->Read(&Reply)) { if (!Reply.has_stream_result()) { FinalResult = Reply.final_result(); @@ -51,11 +54,15 @@ auto Response = ProtobufMarshaller->fromProtobuf(Reply.stream_result()); if (!Response) { elog("Received invalid {0}", ReplyT::descriptor()->name()); + ++FailedToParse; continue; } Callback(*Response); + ++Successful; } - SPAN_ATTACH(Tracer, "status", Reader->Finish().ok()); + SPAN_ATTACH(Tracer, "Status", Reader->Finish().ok()); + SPAN_ATTACH(Tracer, "Successful", Successful); + SPAN_ATTACH(Tracer, "Failed to parse", FailedToParse); return FinalResult; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits