diff --git a/appview/repo/artifact.go b/appview/repo/artifact.go index 1dd39eb5..06dd4aec 100644 --- a/appview/repo/artifact.go +++ b/appview/repo/artifact.go @@ -22,7 +22,6 @@ import ( comatproto "github.com/bluesky-social/indigo/api/atproto" "github.com/bluesky-social/indigo/atproto/syntax" lexutil "github.com/bluesky-social/indigo/lex/util" - indigoxrpc "github.com/bluesky-social/indigo/xrpc" "github.com/dustin/go-humanize" "github.com/go-chi/chi/v5" "github.com/go-git/go-git/v5/plumbing" @@ -308,7 +307,7 @@ func (rp *Repo) resolveTag(ctx context.Context, f *models.Repo, tagParam string) return nil, err } - xrpcc := &indigoxrpc.Client{Host: rp.config.KnotMirror.Url} + xrpcc := rp.knotMirrorXRPCClient() xrpcBytes, err := tangled.GitTempListTags(ctx, xrpcc, "", 0, f.RepoDid) if err != nil { diff --git a/appview/repo/blob.go b/appview/repo/blob.go index d1bd951e..bc2f6f1a 100644 --- a/appview/repo/blob.go +++ b/appview/repo/blob.go @@ -21,8 +21,6 @@ import ( "tangled.org/core/types" xrpcclient "tangled.org/core/xrpc/xrpcclient" - "github.com/bluesky-social/indigo/util" - indigoxrpc "github.com/bluesky-social/indigo/xrpc" "github.com/go-chi/chi/v5" enry "github.com/go-enry/go-enry/v2" "github.com/go-git/go-git/v5/plumbing" @@ -60,7 +58,7 @@ func (rp *Repo) Blob(w http.ResponseWriter, r *http.Request) { ctx := r.Context() - xrpcc := &indigoxrpc.Client{Host: rp.config.KnotMirror.Url} + xrpcc := rp.knotMirrorXRPCClient() resp, err := tangled.GitTempGetEntry(ctx, xrpcc, filePath, ref, f.RepoDid) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC git.getEntry", "xrpcerr", xrpcerr, "err", err) @@ -97,7 +95,7 @@ func (rp *Repo) Blob(w http.ResponseWriter, r *http.Request) { if err != nil { return models.BlobView{}, err } - blobResp, err := util.RobustHTTPClient().Do(blobReq) + blobResp, err := rp.knotMirrorXRPCClient().Client.Do(blobReq) if err != nil { return models.BlobView{}, err } @@ -253,7 +251,7 @@ func (rp *Repo) RepoBlobRaw(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) return } - resp, err := util.RobustHTTPClient().Do(req) + resp, err := rp.knotMirrorXRPCClient().Client.Do(req) if err != nil || resp.StatusCode != http.StatusOK { w.WriteHeader(http.StatusBadGateway) return diff --git a/appview/repo/branches.go b/appview/repo/branches.go index f6705915..ac3c3179 100644 --- a/appview/repo/branches.go +++ b/appview/repo/branches.go @@ -10,8 +10,6 @@ import ( "tangled.org/core/appview/pages" "tangled.org/core/types" xrpcclient "tangled.org/core/xrpc/xrpcclient" - - indigoxrpc "github.com/bluesky-social/indigo/xrpc" ) func (rp *Repo) Branches(w http.ResponseWriter, r *http.Request) { @@ -21,7 +19,7 @@ func (rp *Repo) Branches(w http.ResponseWriter, r *http.Request) { l.Error("failed to get repo and knot", "err", err) return } - xrpcc := &indigoxrpc.Client{Host: rp.config.KnotMirror.Url} + xrpcc := rp.knotMirrorXRPCClient() xrpcBytes, err := tangled.GitTempListBranches(r.Context(), xrpcc, "", 0, f.RepoDid) if err != nil { diff --git a/appview/repo/compare.go b/appview/repo/compare.go index 5b6442e0..0d319b39 100644 --- a/appview/repo/compare.go +++ b/appview/repo/compare.go @@ -30,7 +30,7 @@ func (rp *Repo) CompareNew(w http.ResponseWriter, r *http.Request) { return } - xrpcc := &indigoxrpc.Client{Host: rp.config.KnotMirror.Url} + xrpcc := rp.knotMirrorXRPCClient() branchBytes, err := tangled.GitTempListBranches(r.Context(), xrpcc, "", 0, f.RepoDid) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { diff --git a/appview/repo/feed.go b/appview/repo/feed.go index d3644c8e..ec78ed7d 100644 --- a/appview/repo/feed.go +++ b/appview/repo/feed.go @@ -18,7 +18,6 @@ import ( "github.com/bluesky-social/indigo/atproto/identity" "github.com/bluesky-social/indigo/atproto/syntax" - indigoxrpc "github.com/bluesky-social/indigo/xrpc" "github.com/gorilla/feeds" ) @@ -207,7 +206,7 @@ func (rp *Repo) createIssueItem(ctx context.Context, issue models.Issue, ownerSl } func (rp *Repo) createCommitItems(ctx context.Context, repo *models.Repo, ownerSlashRepo string) ([]*feeds.Item, error) { - xrpcc := &indigoxrpc.Client{Host: rp.config.KnotMirror.Url} + xrpcc := rp.knotMirrorXRPCClient() xrpcBytes, err := tangled.GitTempListCommits(ctx, xrpcc, "", 100, "", repo.RepoDid) if err != nil { @@ -246,7 +245,7 @@ func (rp *Repo) createCommitItems(ctx context.Context, repo *models.Repo, ownerS } func (rp *Repo) createTagItems(ctx context.Context, repo *models.Repo, ownerSlashRepo string) ([]*feeds.Item, error) { - xrpcc := &indigoxrpc.Client{Host: rp.config.KnotMirror.Url} + xrpcc := rp.knotMirrorXRPCClient() tagBytes, err := tangled.GitTempListTags(ctx, xrpcc, "", 100, repo.RepoDid) if err != nil { diff --git a/appview/repo/index.go b/appview/repo/index.go index 8abb4350..9aef7ce1 100644 --- a/appview/repo/index.go +++ b/appview/repo/index.go @@ -16,7 +16,6 @@ import ( "encoding/json" "github.com/bluesky-social/indigo/atproto/syntax" - indigoxrpc "github.com/bluesky-social/indigo/xrpc" "github.com/go-git/go-git/v5/plumbing" "tangled.org/core/api/tangled" "tangled.org/core/appview/commitverify" @@ -232,10 +231,7 @@ func (rp *Repo) getLanguageInfo( ref string, ) ([]*tangled.GitTempListLanguages_Language, error) { // non-fatal, fetch langs from knotmirror via XRPC - xrpcc := &indigoxrpc.Client{ - Host: rp.config.KnotMirror.Url, - Client: http.DefaultClient, - } + xrpcc := rp.knotMirrorXRPCClient() out, err := tangled.GitTempListLanguages(ctx, xrpcc, ref, repoId.String()) if err != nil { return nil, fmt.Errorf("calling knotmirror git.listLanguages: %w", err) @@ -283,7 +279,7 @@ func makeLanguageStats(langs []*tangled.GitTempListLanguages_Language) []types.R // buildIndexResponse creates a RepoIndexResponse by combining multiple xrpc calls in parallel func (rp *Repo) buildIndexResponse(ctx context.Context, repo *models.Repo, ref string) (*types.RepoIndexResponse, error) { - xrpcc := &indigoxrpc.Client{Host: rp.config.KnotMirror.Url} + xrpcc := rp.knotMirrorXRPCClient() branchesBytes, err := tangled.GitTempListBranches(ctx, xrpcc, "", 0, repo.RepoDid) if err != nil { diff --git a/appview/repo/knotmirror_client.go b/appview/repo/knotmirror_client.go new file mode 100644 index 00000000..4673ff35 --- /dev/null +++ b/appview/repo/knotmirror_client.go @@ -0,0 +1,20 @@ +package repo + +import ( + "github.com/bluesky-social/indigo/util" + indigoxrpc "github.com/bluesky-social/indigo/xrpc" +) + +// newKnotMirrorXRPCClient is created once per Repo service. A nil +// indigoxrpc.Client creates a new RobustHTTPClient for each XRPC call, which +// also creates a new transport and defeats connection reuse. +func newKnotMirrorXRPCClient(host string) *indigoxrpc.Client { + return &indigoxrpc.Client{ + Host: host, + Client: util.RobustHTTPClient(), + } +} + +func (rp *Repo) knotMirrorXRPCClient() *indigoxrpc.Client { + return rp.knotMirrorXRPC +} diff --git a/appview/repo/log.go b/appview/repo/log.go index 25fb360f..cf7a8929 100644 --- a/appview/repo/log.go +++ b/appview/repo/log.go @@ -100,7 +100,7 @@ func (rp *Repo) Log(w http.ResponseWriter, r *http.Request) { ref := chi.URLParam(r, "ref") ref, _ = url.PathUnescape(ref) - xrpcc := &indigoxrpc.Client{Host: rp.config.KnotMirror.Url} + xrpcc := rp.knotMirrorXRPCClient() limit := int64(60) cursor := "" diff --git a/appview/repo/repo.go b/appview/repo/repo.go index 7cffd930..a989858b 100644 --- a/appview/repo/repo.go +++ b/appview/repo/repo.go @@ -40,7 +40,7 @@ import ( "github.com/bluesky-social/indigo/atproto/atclient" "github.com/bluesky-social/indigo/atproto/syntax" lexutil "github.com/bluesky-social/indigo/lex/util" - + indigoxrpc "github.com/bluesky-social/indigo/xrpc" "github.com/go-chi/chi/v5" ) @@ -59,6 +59,8 @@ type Repo struct { cfClient *cloudflare.Client ogreClient *ogre.Client codesearch *codesearch.CodeSearch + + knotMirrorXRPC *indigoxrpc.Client } func New( @@ -89,6 +91,8 @@ func New( cfClient: cfClient, ogreClient: ogre.NewClient(config.Ogre.Host), codesearch: codesearch, + + knotMirrorXRPC: newKnotMirrorXRPCClient(config.KnotMirror.Url), } } diff --git a/appview/repo/settings.go b/appview/repo/settings.go index 2bdae1c4..d93f9aaf 100644 --- a/appview/repo/settings.go +++ b/appview/repo/settings.go @@ -383,7 +383,7 @@ func (rp *Repo) generalSettings(w http.ResponseWriter, r *http.Request) { f, err := rp.repoResolver.Resolve(r) user := rp.oauth.GetMultiAccountUser(r) - xrpcc := &indigoxrpc.Client{Host: rp.config.KnotMirror.Url} + xrpcc := rp.knotMirrorXRPCClient() xrpcBytes, err := tangled.GitTempListBranches(r.Context(), xrpcc, "", 0, f.RepoDid) var result types.RepoBranchesResponse diff --git a/appview/repo/tags.go b/appview/repo/tags.go index ae751ae9..4acfe8ce 100644 --- a/appview/repo/tags.go +++ b/appview/repo/tags.go @@ -15,7 +15,6 @@ import ( "tangled.org/core/types" xrpcclient "tangled.org/core/xrpc/xrpcclient" - indigoxrpc "github.com/bluesky-social/indigo/xrpc" "github.com/go-chi/chi/v5" "github.com/go-git/go-git/v5/plumbing" ) @@ -27,7 +26,7 @@ func (rp *Repo) Tags(w http.ResponseWriter, r *http.Request) { l.Error("failed to get repo and knot", "err", err) return } - xrpcc := &indigoxrpc.Client{Host: rp.config.KnotMirror.Url} + xrpcc := rp.knotMirrorXRPCClient() xrpcBytes, err := tangled.GitTempListTags(r.Context(), xrpcc, "", 0, f.RepoDid) if err != nil { l.Error("failed to call XRPC repo.tags", "err", err) @@ -89,7 +88,7 @@ func (rp *Repo) Tag(w http.ResponseWriter, r *http.Request) { return } - xrpcc := &indigoxrpc.Client{Host: rp.config.KnotMirror.Url} + xrpcc := rp.knotMirrorXRPCClient() xrpcBytes, err := tangled.GitTempGetTag(r.Context(), xrpcc, f.RepoDid, tag) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { diff --git a/appview/repo/tree.go b/appview/repo/tree.go index f54fbbda..16807c59 100644 --- a/appview/repo/tree.go +++ b/appview/repo/tree.go @@ -16,7 +16,6 @@ import ( "tangled.org/core/types" xrpcclient "tangled.org/core/xrpc/xrpcclient" - indigoxrpc "github.com/bluesky-social/indigo/xrpc" "github.com/go-chi/chi/v5" "github.com/go-git/go-git/v5/plumbing" ) @@ -36,7 +35,7 @@ func (rp *Repo) Tree(w http.ResponseWriter, r *http.Request) { treePath, _ = url.PathUnescape(treePath) treePath = strings.TrimSuffix(treePath, "/") - xrpcc := &indigoxrpc.Client{Host: rp.config.KnotMirror.Url} + xrpcc := rp.knotMirrorXRPCClient() xrpcResp, err := tangled.GitTempGetTree(r.Context(), xrpcc, treePath, ref, f.RepoDid) if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { l.Error("failed to call XRPC repo.tree", "xrpcerr", xrpcerr, "err", err)