Skip to content

Commit

Permalink
Maintain order of registry files to help with dependency resolution
Browse files Browse the repository at this point in the history
  • Loading branch information
sudorandom committed Oct 13, 2024
1 parent aa6a968 commit 21860de
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 9 deletions.
1 change: 1 addition & 0 deletions .goreleaser.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ dockers:
build_flag_templates:
- "--pull"
- "--platform=linux/amd64"
goarch: amd64
- image_templates:
- "docker.io/sudorandom/fauxrpc:{{ .Tag }}-arm64"
- "docker.io/sudorandom/fauxrpc:{{ .Tag }}"
Expand Down
6 changes: 2 additions & 4 deletions cmd/fauxrpc/cmd_registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,9 @@ func (c *RegistryAddCmd) Run(globals *Globals) error {
return err
}
}
files := theRegistry.Files()
filespb := make([]*descriptorpb.FileDescriptorProto, 0, files.NumFiles())
files.RangeFiles(func(fd protoreflect.FileDescriptor) bool {
filespb := make([]*descriptorpb.FileDescriptorProto, 0, theRegistry.NumFiles())
theRegistry.ForEachFile(func(fd protoreflect.FileDescriptor) {
filespb = append(filespb, protodesc.ToFileDescriptorProto(fd))
return true
})
client := newRegistryClient(c.Addr)
if _, err := client.AddDescriptors(context.Background(), connect.NewRequest(&registryv1.AddDescriptorsRequest{
Expand Down
45 changes: 40 additions & 5 deletions private/registry/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"errors"
"log/slog"
"strings"
"sync"

"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/reflect/protoregistry"
Expand All @@ -18,32 +19,44 @@ type ServiceRegistry interface {
ForEachService(cb func(protoreflect.ServiceDescriptor))
ServiceCount() int
Files() *protoregistry.Files
NumFiles() int
}

type serviceRegistry struct {
services map[string]protoreflect.ServiceDescriptor
files *protoregistry.Files
services map[string]protoreflect.ServiceDescriptor
filesOrdered []protoreflect.FileDescriptor
files *protoregistry.Files
lock *sync.RWMutex
}

func NewServiceRegistry() (*serviceRegistry, error) {
r := &serviceRegistry{
services: map[string]protoreflect.ServiceDescriptor{},
files: new(protoregistry.Files),
services: map[string]protoreflect.ServiceDescriptor{},
files: new(protoregistry.Files),
filesOrdered: []protoreflect.FileDescriptor{},
lock: &sync.RWMutex{},
}
return r, AddServicesFromGlobal(r)
}

func (r *serviceRegistry) Reset() error {
r.lock.Lock()
defer r.lock.Unlock()
r.services = map[string]protoreflect.ServiceDescriptor{}
r.files = new(protoregistry.Files)
r.filesOrdered = []protoreflect.FileDescriptor{}
return AddServicesFromGlobal(r)
}

func (r *serviceRegistry) Get(name string) protoreflect.ServiceDescriptor {
r.lock.RLock()
defer r.lock.RUnlock()
return r.services[name]
}

func (r *serviceRegistry) AddFile(fd protoreflect.FileDescriptor) error {
r.lock.Lock()
defer r.lock.Unlock()
slog.Debug("AddFile", "name", fd.FullName(), "path", fd.Path())
if _, err := r.files.FindFileByPath(fd.Path()); err == nil {
return nil
Expand All @@ -56,6 +69,7 @@ func (r *serviceRegistry) AddFile(fd protoreflect.FileDescriptor) error {
}
return err
}
r.filesOrdered = append(r.filesOrdered, fd)

svcs := fd.Services()
for i := 0; i < svcs.Len(); i++ {
Expand All @@ -70,19 +84,40 @@ func (r *serviceRegistry) addService(sd protoreflect.ServiceDescriptor) {
}

func (r *serviceRegistry) ServiceCount() int {
r.lock.RLock()
defer r.lock.RUnlock()
return len(r.services)
}

func (r *serviceRegistry) ForEachService(cb func(protoreflect.ServiceDescriptor)) {
for _, service := range r.services {
r.lock.RLock()
services := r.services
r.lock.RUnlock()
for _, service := range services {
cb(service)
}
}
func (r *serviceRegistry) ForEachFile(cb func(protoreflect.FileDescriptor)) {
r.lock.RLock()
filesOrdered := r.filesOrdered
r.lock.RUnlock()
for _, fd := range filesOrdered {
cb(fd)
}
}

func (r *serviceRegistry) Files() *protoregistry.Files {
r.lock.RLock()
defer r.lock.RUnlock()
return r.files
}

func (r *serviceRegistry) NumFiles() int {
r.lock.RLock()
defer r.lock.RUnlock()
return len(r.filesOrdered)
}

func looksLikeBSR(path string) bool {
return strings.HasPrefix(path, "buf.build/")
}

0 comments on commit 21860de

Please sign in to comment.