From 91659bb2bdd34057c36da0820d6f69b4b8fa51d5 Mon Sep 17 00:00:00 2001 From: Eric Fritz Date: Wed, 14 Oct 2020 17:29:51 -0500 Subject: [PATCH] codeintel: Clean up internal HTTP server setup (#14733) --- .../internal/server/handler.go | 39 ++++++------ .../internal/server/server.go | 50 ++-------------- .../internal/server/handler.go | 15 ----- .../internal/server/server.go | 55 ----------------- .../cmd/precise-code-intel-indexer-vm/main.go | 8 ++- .../internal/server/handler.go | 15 ++--- .../internal/server/server.go | 46 ++------------- .../internal/server/handler.go | 15 ----- .../internal/server/server.go | 55 ----------------- .../cmd/precise-code-intel-worker/main.go | 7 ++- internal/httpserver/server.go | 59 +++++++++++++++++++ 11 files changed, 100 insertions(+), 264 deletions(-) delete mode 100644 enterprise/cmd/precise-code-intel-indexer-vm/internal/server/handler.go delete mode 100644 enterprise/cmd/precise-code-intel-indexer-vm/internal/server/server.go delete mode 100644 enterprise/cmd/precise-code-intel-worker/internal/server/handler.go delete mode 100644 enterprise/cmd/precise-code-intel-worker/internal/server/server.go create mode 100644 internal/httpserver/server.go diff --git a/enterprise/cmd/precise-code-intel-bundle-manager/internal/server/handler.go b/enterprise/cmd/precise-code-intel-bundle-manager/internal/server/handler.go index 00f34965d5a..7d707897b59 100644 --- a/enterprise/cmd/precise-code-intel-bundle-manager/internal/server/handler.go +++ b/enterprise/cmd/precise-code-intel-bundle-manager/internal/server/handler.go @@ -26,28 +26,23 @@ import ( const DefaultMonikerResultPageSize = 100 const DefaultDiagnosticResultPageSize = 100 -func (s *Server) handler() http.Handler { - mux := mux.NewRouter() - mux.Path("/uploads/{id:[0-9]+}").Methods("GET").HandlerFunc(s.handleGetUpload) - mux.Path("/uploads/{id:[0-9]+}").Methods("POST").HandlerFunc(s.handlePostUpload) - mux.Path("/uploads/{id:[0-9]+}/{index:[0-9]+}").Methods("POST").HandlerFunc(s.handlePostUploadPart) - mux.Path("/uploads/{id:[0-9]+}/stitch").Methods("POST").HandlerFunc(s.handlePostUploadStitch) - mux.Path("/uploads/{id:[0-9]+}").Methods("DELETE").HandlerFunc(s.handleDeleteUpload) - mux.Path("/dbs/{id:[0-9]+}/{index:[0-9]+}").Methods("POST").HandlerFunc(s.handlePostDatabasePart) - mux.Path("/dbs/{id:[0-9]+}/stitch").Methods("POST").HandlerFunc(s.handlePostDatabaseStitch) - mux.Path("/dbs/{id:[0-9]+}/exists").Methods("GET").HandlerFunc(s.handleExists) - mux.Path("/dbs/{id:[0-9]+}/ranges").Methods("GET").HandlerFunc(s.handleRanges) - mux.Path("/dbs/{id:[0-9]+}/definitions").Methods("GET").HandlerFunc(s.handleDefinitions) - mux.Path("/dbs/{id:[0-9]+}/references").Methods("GET").HandlerFunc(s.handleReferences) - mux.Path("/dbs/{id:[0-9]+}/hover").Methods("GET").HandlerFunc(s.handleHover) - mux.Path("/dbs/{id:[0-9]+}/diagnostics").Methods("GET").HandlerFunc(s.handleDiagnostics) - mux.Path("/dbs/{id:[0-9]+}/monikersByPosition").Methods("GET").HandlerFunc(s.handleMonikersByPosition) - mux.Path("/dbs/{id:[0-9]+}/monikerResults").Methods("GET").HandlerFunc(s.handleMonikerResults) - mux.Path("/dbs/{id:[0-9]+}/packageInformation").Methods("GET").HandlerFunc(s.handlePackageInformation) - mux.HandleFunc("/healthz", func(w http.ResponseWriter, _ *http.Request) { - w.WriteHeader(http.StatusOK) - }) - return mux +func (s *Server) setupRoutes(router *mux.Router) { + router.Path("/uploads/{id:[0-9]+}").Methods("GET").HandlerFunc(s.handleGetUpload) + router.Path("/uploads/{id:[0-9]+}").Methods("POST").HandlerFunc(s.handlePostUpload) + router.Path("/uploads/{id:[0-9]+}/{index:[0-9]+}").Methods("POST").HandlerFunc(s.handlePostUploadPart) + router.Path("/uploads/{id:[0-9]+}/stitch").Methods("POST").HandlerFunc(s.handlePostUploadStitch) + router.Path("/uploads/{id:[0-9]+}").Methods("DELETE").HandlerFunc(s.handleDeleteUpload) + router.Path("/dbs/{id:[0-9]+}/{index:[0-9]+}").Methods("POST").HandlerFunc(s.handlePostDatabasePart) + router.Path("/dbs/{id:[0-9]+}/stitch").Methods("POST").HandlerFunc(s.handlePostDatabaseStitch) + router.Path("/dbs/{id:[0-9]+}/exists").Methods("GET").HandlerFunc(s.handleExists) + router.Path("/dbs/{id:[0-9]+}/ranges").Methods("GET").HandlerFunc(s.handleRanges) + router.Path("/dbs/{id:[0-9]+}/definitions").Methods("GET").HandlerFunc(s.handleDefinitions) + router.Path("/dbs/{id:[0-9]+}/references").Methods("GET").HandlerFunc(s.handleReferences) + router.Path("/dbs/{id:[0-9]+}/hover").Methods("GET").HandlerFunc(s.handleHover) + router.Path("/dbs/{id:[0-9]+}/diagnostics").Methods("GET").HandlerFunc(s.handleDiagnostics) + router.Path("/dbs/{id:[0-9]+}/monikersByPosition").Methods("GET").HandlerFunc(s.handleMonikersByPosition) + router.Path("/dbs/{id:[0-9]+}/monikerResults").Methods("GET").HandlerFunc(s.handleMonikerResults) + router.Path("/dbs/{id:[0-9]+}/packageInformation").Methods("GET").HandlerFunc(s.handlePackageInformation) } // GET /uploads/{id:[0-9]+} diff --git a/enterprise/cmd/precise-code-intel-bundle-manager/internal/server/server.go b/enterprise/cmd/precise-code-intel-bundle-manager/internal/server/server.go index d8f899c36e3..2780155ed14 100644 --- a/enterprise/cmd/precise-code-intel-bundle-manager/internal/server/server.go +++ b/enterprise/cmd/precise-code-intel-bundle-manager/internal/server/server.go @@ -1,20 +1,12 @@ package server import ( - "context" "database/sql" - "net" - "net/http" - "os" - "strconv" - "sync" - "github.com/inconshreveable/log15" "github.com/sourcegraph/sourcegraph/enterprise/internal/codeintel/bundles/persistence/cache" - "github.com/sourcegraph/sourcegraph/internal/env" "github.com/sourcegraph/sourcegraph/internal/goroutine" + "github.com/sourcegraph/sourcegraph/internal/httpserver" "github.com/sourcegraph/sourcegraph/internal/observation" - "github.com/sourcegraph/sourcegraph/internal/trace/ot" ) const Port = 3187 @@ -24,49 +16,15 @@ type Server struct { storeCache cache.StoreCache codeIntelDB *sql.DB observationContext *observation.Context - server *http.Server - once sync.Once } -var _ goroutine.BackgroundRoutine = &Server{} - -func New( - bundleDir string, - storeCache cache.StoreCache, - codeIntelDB *sql.DB, - observationContext *observation.Context, -) *Server { - host := "" - if env.InsecureDev { - host = "127.0.0.1" - } - - s := &Server{ +func New(bundleDir string, storeCache cache.StoreCache, codeIntelDB *sql.DB, observationContext *observation.Context) goroutine.BackgroundRoutine { + server := &Server{ bundleDir: bundleDir, storeCache: storeCache, codeIntelDB: codeIntelDB, observationContext: observationContext, } - s.server = &http.Server{ - Addr: net.JoinHostPort(host, strconv.FormatInt(int64(Port), 10)), - Handler: ot.Middleware(s.handler()), - } - - return s -} - -func (s *Server) Start() { - if err := s.server.ListenAndServe(); err != http.ErrServerClosed { - log15.Error("Failed to start server", "error", err) - os.Exit(1) - } -} - -func (s *Server) Stop() { - s.once.Do(func() { - if err := s.server.Shutdown(context.Background()); err != nil { - log15.Error("Failed to shutdown server", "error", err) - } - }) + return httpserver.New(Port, server.setupRoutes) } diff --git a/enterprise/cmd/precise-code-intel-indexer-vm/internal/server/handler.go b/enterprise/cmd/precise-code-intel-indexer-vm/internal/server/handler.go deleted file mode 100644 index 8adf810b90b..00000000000 --- a/enterprise/cmd/precise-code-intel-indexer-vm/internal/server/handler.go +++ /dev/null @@ -1,15 +0,0 @@ -package server - -import ( - "net/http" - - "github.com/gorilla/mux" -) - -func (s *Server) handler() http.Handler { - mux := mux.NewRouter() - mux.HandleFunc("/healthz", func(w http.ResponseWriter, _ *http.Request) { - w.WriteHeader(http.StatusOK) - }) - return mux -} diff --git a/enterprise/cmd/precise-code-intel-indexer-vm/internal/server/server.go b/enterprise/cmd/precise-code-intel-indexer-vm/internal/server/server.go deleted file mode 100644 index aa1a7ec9dd6..00000000000 --- a/enterprise/cmd/precise-code-intel-indexer-vm/internal/server/server.go +++ /dev/null @@ -1,55 +0,0 @@ -package server - -import ( - "context" - "net" - "net/http" - "os" - "strconv" - "sync" - - "github.com/inconshreveable/log15" - "github.com/sourcegraph/sourcegraph/internal/env" - "github.com/sourcegraph/sourcegraph/internal/goroutine" - "github.com/sourcegraph/sourcegraph/internal/trace/ot" -) - -const Port = 3190 - -type Server struct { - server *http.Server - once sync.Once -} - -var _ goroutine.BackgroundRoutine = &Server{} - -func New() *Server { - host := "" - if env.InsecureDev { - host = "127.0.0.1" - } - - s := &Server{} - - s.server = &http.Server{ - Addr: net.JoinHostPort(host, strconv.FormatInt(int64(Port), 10)), - Handler: ot.Middleware(s.handler()), - } - - return s -} - -func (s *Server) Start() { - if err := s.server.ListenAndServe(); err != http.ErrServerClosed { - log15.Error("Failed to start server", "error", err) - os.Exit(1) - } -} - -func (s *Server) Stop() { - s.once.Do(func() { - if err := s.server.Shutdown(context.Background()); err != nil { - log15.Error("Failed to shutdown server", "error", err) - } - }) -} diff --git a/enterprise/cmd/precise-code-intel-indexer-vm/main.go b/enterprise/cmd/precise-code-intel-indexer-vm/main.go index e3ced3dc22a..f5c78868b2f 100644 --- a/enterprise/cmd/precise-code-intel-indexer-vm/main.go +++ b/enterprise/cmd/precise-code-intel-indexer-vm/main.go @@ -4,22 +4,25 @@ import ( "context" "github.com/google/uuid" + "github.com/gorilla/mux" "github.com/inconshreveable/log15" "github.com/opentracing/opentracing-go" "github.com/prometheus/client_golang/prometheus" "github.com/sourcegraph/sourcegraph/enterprise/cmd/precise-code-intel-indexer-vm/internal/heartbeat" indexmanager "github.com/sourcegraph/sourcegraph/enterprise/cmd/precise-code-intel-indexer-vm/internal/index_manager" "github.com/sourcegraph/sourcegraph/enterprise/cmd/precise-code-intel-indexer-vm/internal/indexer" - "github.com/sourcegraph/sourcegraph/enterprise/cmd/precise-code-intel-indexer-vm/internal/server" queue "github.com/sourcegraph/sourcegraph/enterprise/internal/codeintel/queue/client" "github.com/sourcegraph/sourcegraph/internal/debugserver" "github.com/sourcegraph/sourcegraph/internal/env" "github.com/sourcegraph/sourcegraph/internal/goroutine" + "github.com/sourcegraph/sourcegraph/internal/httpserver" "github.com/sourcegraph/sourcegraph/internal/logging" "github.com/sourcegraph/sourcegraph/internal/observation" "github.com/sourcegraph/sourcegraph/internal/trace" ) +const Port = 3190 + func main() { env.Lock() env.HandleHelpFlag() @@ -59,7 +62,8 @@ func main() { internalProxyAuthToken, ) indexManager := indexmanager.New() - server := server.New() + + server := httpserver.New(Port, func(router *mux.Router) {}) heartbeater := heartbeat.NewHeartbeater(context.Background(), queueClient, indexManager, heartbeat.HeartbeaterOptions{ Interval: indexerHeartbeatInterval, }) diff --git a/enterprise/cmd/precise-code-intel-indexer/internal/server/handler.go b/enterprise/cmd/precise-code-intel-indexer/internal/server/handler.go index 733828a9029..e6524651d32 100644 --- a/enterprise/cmd/precise-code-intel-indexer/internal/server/handler.go +++ b/enterprise/cmd/precise-code-intel-indexer/internal/server/handler.go @@ -9,16 +9,11 @@ import ( "github.com/sourcegraph/sourcegraph/enterprise/internal/codeintel/queue/types" ) -func (s *Server) handler() http.Handler { - mux := mux.NewRouter() - mux.Path("/dequeue").Methods("POST").HandlerFunc(s.handleDequeue) - mux.Path("/setlog").Methods("POST").HandlerFunc(s.handleSetLogContents) - mux.Path("/complete").Methods("POST").HandlerFunc(s.handleComplete) - mux.Path("/heartbeat").Methods("POST").HandlerFunc(s.handleHeartbeat) - mux.HandleFunc("/healthz", func(w http.ResponseWriter, _ *http.Request) { - w.WriteHeader(http.StatusOK) - }) - return mux +func (s *Server) setupRoutes(router *mux.Router) { + router.Path("/dequeue").Methods("POST").HandlerFunc(s.handleDequeue) + router.Path("/setlog").Methods("POST").HandlerFunc(s.handleSetLogContents) + router.Path("/complete").Methods("POST").HandlerFunc(s.handleComplete) + router.Path("/heartbeat").Methods("POST").HandlerFunc(s.handleHeartbeat) } // POST /dequeue diff --git a/enterprise/cmd/precise-code-intel-indexer/internal/server/server.go b/enterprise/cmd/precise-code-intel-indexer/internal/server/server.go index 3961f952bbf..804ea85d5bc 100644 --- a/enterprise/cmd/precise-code-intel-indexer/internal/server/server.go +++ b/enterprise/cmd/precise-code-intel-indexer/internal/server/server.go @@ -1,59 +1,21 @@ package server import ( - "context" - "net" - "net/http" - "os" - "strconv" - "sync" - - "github.com/inconshreveable/log15" indexmanager "github.com/sourcegraph/sourcegraph/enterprise/cmd/precise-code-intel-indexer/internal/index_manager" - "github.com/sourcegraph/sourcegraph/internal/env" "github.com/sourcegraph/sourcegraph/internal/goroutine" - "github.com/sourcegraph/sourcegraph/internal/trace/ot" + "github.com/sourcegraph/sourcegraph/internal/httpserver" ) const Port = 3189 type Server struct { indexManager indexmanager.Manager - server *http.Server - once sync.Once } -var _ goroutine.BackgroundRoutine = &Server{} - -func New(indexManager indexmanager.Manager) *Server { - host := "" - if env.InsecureDev { - host = "127.0.0.1" - } - - s := &Server{ +func New(indexManager indexmanager.Manager) goroutine.BackgroundRoutine { + server := &Server{ indexManager: indexManager, } - s.server = &http.Server{ - Addr: net.JoinHostPort(host, strconv.FormatInt(int64(Port), 10)), - Handler: ot.Middleware(s.handler()), - } - - return s -} - -func (s *Server) Start() { - if err := s.server.ListenAndServe(); err != http.ErrServerClosed { - log15.Error("Failed to start server", "error", err) - os.Exit(1) - } -} - -func (s *Server) Stop() { - s.once.Do(func() { - if err := s.server.Shutdown(context.Background()); err != nil { - log15.Error("Failed to shutdown server", "error", err) - } - }) + return httpserver.New(Port, server.setupRoutes) } diff --git a/enterprise/cmd/precise-code-intel-worker/internal/server/handler.go b/enterprise/cmd/precise-code-intel-worker/internal/server/handler.go deleted file mode 100644 index 8adf810b90b..00000000000 --- a/enterprise/cmd/precise-code-intel-worker/internal/server/handler.go +++ /dev/null @@ -1,15 +0,0 @@ -package server - -import ( - "net/http" - - "github.com/gorilla/mux" -) - -func (s *Server) handler() http.Handler { - mux := mux.NewRouter() - mux.HandleFunc("/healthz", func(w http.ResponseWriter, _ *http.Request) { - w.WriteHeader(http.StatusOK) - }) - return mux -} diff --git a/enterprise/cmd/precise-code-intel-worker/internal/server/server.go b/enterprise/cmd/precise-code-intel-worker/internal/server/server.go deleted file mode 100644 index 886aba87766..00000000000 --- a/enterprise/cmd/precise-code-intel-worker/internal/server/server.go +++ /dev/null @@ -1,55 +0,0 @@ -package server - -import ( - "context" - "net" - "net/http" - "os" - "strconv" - "sync" - - "github.com/inconshreveable/log15" - "github.com/sourcegraph/sourcegraph/internal/env" - "github.com/sourcegraph/sourcegraph/internal/goroutine" - "github.com/sourcegraph/sourcegraph/internal/trace/ot" -) - -const Port = 3188 - -type Server struct { - server *http.Server - once sync.Once -} - -var _ goroutine.BackgroundRoutine = &Server{} - -func New() *Server { - host := "" - if env.InsecureDev { - host = "127.0.0.1" - } - - s := &Server{} - - s.server = &http.Server{ - Addr: net.JoinHostPort(host, strconv.FormatInt(int64(Port), 10)), - Handler: ot.Middleware(s.handler()), - } - - return s -} - -func (s *Server) Start() { - if err := s.server.ListenAndServe(); err != http.ErrServerClosed { - log15.Error("Failed to start server", "error", err) - os.Exit(1) - } -} - -func (s *Server) Stop() { - s.once.Do(func() { - if err := s.server.Shutdown(context.Background()); err != nil { - log15.Error("Failed to shutdown server", "error", err) - } - }) -} diff --git a/enterprise/cmd/precise-code-intel-worker/main.go b/enterprise/cmd/precise-code-intel-worker/main.go index dfeb4640995..d519f67bb4f 100644 --- a/enterprise/cmd/precise-code-intel-worker/main.go +++ b/enterprise/cmd/precise-code-intel-worker/main.go @@ -4,13 +4,13 @@ import ( "database/sql" "log" + "github.com/gorilla/mux" "github.com/inconshreveable/log15" "github.com/opentracing/opentracing-go" "github.com/prometheus/client_golang/prometheus" commitupdater "github.com/sourcegraph/sourcegraph/enterprise/cmd/precise-code-intel-worker/internal/commit-updater" "github.com/sourcegraph/sourcegraph/enterprise/cmd/precise-code-intel-worker/internal/metrics" "github.com/sourcegraph/sourcegraph/enterprise/cmd/precise-code-intel-worker/internal/resetter" - "github.com/sourcegraph/sourcegraph/enterprise/cmd/precise-code-intel-worker/internal/server" "github.com/sourcegraph/sourcegraph/enterprise/cmd/precise-code-intel-worker/internal/worker" bundles "github.com/sourcegraph/sourcegraph/enterprise/internal/codeintel/bundles/client" "github.com/sourcegraph/sourcegraph/enterprise/internal/codeintel/commits" @@ -21,6 +21,7 @@ import ( "github.com/sourcegraph/sourcegraph/internal/debugserver" "github.com/sourcegraph/sourcegraph/internal/env" "github.com/sourcegraph/sourcegraph/internal/goroutine" + "github.com/sourcegraph/sourcegraph/internal/httpserver" "github.com/sourcegraph/sourcegraph/internal/logging" "github.com/sourcegraph/sourcegraph/internal/observation" "github.com/sourcegraph/sourcegraph/internal/sqliteutil" @@ -28,6 +29,8 @@ import ( "github.com/sourcegraph/sourcegraph/internal/tracer" ) +const Port = 3188 + func main() { env.Lock() env.HandleHelpFlag() @@ -58,7 +61,7 @@ func main() { MustRegisterQueueMonitor(observationContext.Registerer, store) workerMetrics := metrics.NewWorkerMetrics(observationContext) resetterMetrics := resetter.NewResetterMetrics(prometheus.DefaultRegisterer) - server := server.New() + server := httpserver.New(Port, func(router *mux.Router) {}) uploadResetter := resetter.NewUploadResetter(store, resetInterval, resetterMetrics) commitUpdater := commitupdater.NewUpdater( store, diff --git a/internal/httpserver/server.go b/internal/httpserver/server.go new file mode 100644 index 00000000000..09129aa7210 --- /dev/null +++ b/internal/httpserver/server.go @@ -0,0 +1,59 @@ +package httpserver + +import ( + "context" + "net" + "net/http" + "os" + "strconv" + "sync" + + "github.com/gorilla/mux" + "github.com/inconshreveable/log15" + "github.com/sourcegraph/sourcegraph/internal/env" + "github.com/sourcegraph/sourcegraph/internal/goroutine" + "github.com/sourcegraph/sourcegraph/internal/trace/ot" +) + +type server struct { + server *http.Server + once sync.Once +} + +// New returns a BackgroundRoutine that maintains an HTTP server listening on the given +// port with a router configured with the given function. All servers will respond 200 +// to requests to /healthz. +func New(port int, setupRoutes func(router *mux.Router)) goroutine.BackgroundRoutine { + host := "" + if env.InsecureDev { + host = "127.0.0.1" + } + + router := mux.NewRouter() + setupRoutes(router) + router.HandleFunc("/healthz", func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + }) + + return &server{ + server: &http.Server{ + Addr: net.JoinHostPort(host, strconv.FormatInt(int64(port), 10)), + Handler: ot.Middleware(router), + }, + } +} + +func (s *server) Start() { + if err := s.server.ListenAndServe(); err != http.ErrServerClosed { + log15.Error("Failed to start server", "error", err) + os.Exit(1) + } +} + +func (s *server) Stop() { + s.once.Do(func() { + if err := s.server.Shutdown(context.Background()); err != nil { + log15.Error("Failed to shutdown server", "error", err) + } + }) +}