feat(updater): Configurable min ratio

- `UPDATER_MIN_RATIO` variable
- `-minratio` flag for CLI operation
This commit is contained in:
Quentin McGaw
2022-06-12 14:03:00 +00:00
parent 1ea15a1a13
commit 9898387579
11 changed files with 61 additions and 12 deletions

View File

@@ -13,7 +13,7 @@ import (
)
type Updater interface {
UpdateServers(ctx context.Context, providers []string) (err error)
UpdateServers(ctx context.Context, providers []string, minRatio float64) (err error)
}
type Loop struct {
@@ -97,7 +97,7 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) {
runWg.Add(1)
go func() {
defer runWg.Done()
err := l.updater.UpdateServers(updateCtx, settings.Providers)
err := l.updater.UpdateServers(updateCtx, settings.Providers, settings.MinRatio)
if err != nil {
if updateCtx.Err() == nil {
errorCh <- err

View File

@@ -12,10 +12,11 @@ type Provider interface {
FetchServers(ctx context.Context, minServers int) (servers []models.Server, err error)
}
func (u *Updater) updateProvider(ctx context.Context, provider Provider) (err error) {
func (u *Updater) updateProvider(ctx context.Context, provider Provider,
minRatio float64) (err error) {
providerName := provider.Name()
existingServersCount := u.storage.GetServersCount(providerName)
minServers := getMinServers(existingServersCount)
minServers := int(minRatio * float64(existingServersCount))
servers, err := provider.FetchServers(ctx, minServers)
if err != nil {
return fmt.Errorf("cannot get servers: %w", err)
@@ -35,8 +36,3 @@ func (u *Updater) updateProvider(ctx context.Context, provider Provider) (err er
}
return nil
}
func getMinServers(existingServersCount int) (minServers int) {
const minRatio = 0.8
return int(minRatio * float64(existingServersCount))
}

View File

@@ -37,7 +37,8 @@ func New(httpClient *http.Client, storage Storage,
}
}
func (u *Updater) UpdateServers(ctx context.Context, providers []string) (err error) {
func (u *Updater) UpdateServers(ctx context.Context, providers []string,
minRatio float64) (err error) {
caser := cases.Title(language.English)
for _, providerName := range providers {
u.logger.Info("updating " + caser.String(providerName) + " servers...")
@@ -45,7 +46,7 @@ func (u *Updater) UpdateServers(ctx context.Context, providers []string) (err er
fetcher := u.providers.Get(providerName)
// TODO support servers offering only TCP or only UDP
// for NordVPN and PureVPN
err := u.updateProvider(ctx, fetcher)
err := u.updateProvider(ctx, fetcher, minRatio)
if err == nil {
continue
}