Skip to content

Commit

Permalink
feat: use background goroutine for indirectAsnStore initialization
Browse files Browse the repository at this point in the history
  • Loading branch information
aschmahmann committed Aug 25, 2020
1 parent 38b74d1 commit 02764ea
Showing 1 changed file with 15 additions and 4 deletions.
19 changes: 15 additions & 4 deletions asn.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
var Store *indirectAsnStore

func init() {
Store = &indirectAsnStore{}
Store = newIndirectAsnStore()
}

type networkWithAsn struct {
Expand Down Expand Up @@ -81,19 +81,30 @@ func newAsnStore() (*asnStore, error) {

type indirectAsnStore struct {
store *asnStore
doneLoading chan struct{}
}

// AsnForIPv6 returns the AS number for the given IPv6 address.
// If no mapping exists for the given IP, this function will
// return an empty ASN and a nil error.
func (a *indirectAsnStore) AsnForIPv6(ip net.IP) (string, error) {
if a.store == nil {
<-a.doneLoading
return a.store.AsnForIPv6(ip)
}

func newIndirectAsnStore() *indirectAsnStore {
a := &indirectAsnStore{
doneLoading: make(chan struct{}),
}

go func() {
store, err := newAsnStore()
if err != nil {
panic(err)
}
a.store = store
}
close(a.doneLoading)
}()

return a.store.AsnForIPv6(ip)
return a
}

0 comments on commit 02764ea

Please sign in to comment.