restart: parallelize reconcile()
The only shared variable `m.client` is thread-safe, so we can safely parallelize the loops. Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
This commit is contained in:
		@@ -19,6 +19,7 @@ package monitor
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/containerd/containerd"
 | 
			
		||||
@@ -164,19 +165,33 @@ func (m *monitor) reconcile(ctx context.Context) error {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	var wgNSLoop sync.WaitGroup
 | 
			
		||||
	for _, name := range ns {
 | 
			
		||||
		ctx = namespaces.WithNamespace(ctx, name)
 | 
			
		||||
		name := name
 | 
			
		||||
		wgNSLoop.Add(1)
 | 
			
		||||
		go func() {
 | 
			
		||||
			defer wgNSLoop.Done()
 | 
			
		||||
			ctx := namespaces.WithNamespace(ctx, name)
 | 
			
		||||
			changes, err := m.monitor(ctx)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				logrus.WithError(err).Error("monitor for changes")
 | 
			
		||||
			continue
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			var wgChangesLoop sync.WaitGroup
 | 
			
		||||
			for _, c := range changes {
 | 
			
		||||
				c := c
 | 
			
		||||
				wgChangesLoop.Add(1)
 | 
			
		||||
				go func() {
 | 
			
		||||
					defer wgChangesLoop.Done()
 | 
			
		||||
					if err := c.apply(ctx, m.client); err != nil {
 | 
			
		||||
						logrus.WithError(err).Error("apply change")
 | 
			
		||||
					}
 | 
			
		||||
				}()
 | 
			
		||||
			}
 | 
			
		||||
			wgChangesLoop.Wait()
 | 
			
		||||
		}()
 | 
			
		||||
	}
 | 
			
		||||
	wgNSLoop.Wait()
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user