88
99 "github.com/puzpuzpuz/xsync/v3"
1010 "github.com/samber/lo"
11- lop "github.com/samber/lo/parallel"
1211 log "github.com/sirupsen/logrus"
12+ "golang.org/x/sync/semaphore"
1313)
1414
1515type ContainerStore struct {
@@ -43,7 +43,10 @@ func NewContainerStore(ctx context.Context, client Client) *ContainerStore {
4343 return s
4444}
4545
46- var ErrContainerNotFound = errors .New ("container not found" )
46+ var (
47+ ErrContainerNotFound = errors .New ("container not found" )
48+ maxFetchParallelism = int64 (30 )
49+ )
4750
4851func (s * ContainerStore ) checkConnectivity () error {
4952 if s .connected .CompareAndSwap (false , true ) {
@@ -69,14 +72,26 @@ func (s *ContainerStore) checkConnectivity() error {
6972 return item .State == "running"
7073 })
7174
72- chunks := lo . Chunk ( running , 100 )
75+ sem := semaphore . NewWeighted ( maxFetchParallelism )
7376
74- for _ , chunk := range chunks {
75- lop .ForEach (chunk , func (c Container , _ int ) {
76- container , _ := s .client .FindContainer (c .ID )
77- s .containers .Store (c .ID , & container )
78- })
77+ for i , c := range running {
78+ if err := sem .Acquire (s .ctx , 1 ); err != nil {
79+ log .Errorf ("failed to acquire semaphore: %v" , err )
80+ break
81+ }
82+ go func (c Container , i int ) {
83+ defer sem .Release (1 )
84+ if container , err := s .client .FindContainer (c .ID ); err == nil {
85+ s .containers .Store (c .ID , & container )
86+ }
87+ }(c , i )
7988 }
89+
90+ if err := sem .Acquire (s .ctx , maxFetchParallelism ); err != nil {
91+ log .Errorf ("failed to acquire semaphore: %v" , err )
92+ }
93+
94+ log .Debugf ("finished initializing container store with %d containers" , len (containers ))
8095 }
8196 }
8297
0 commit comments