MCPcopy
hub / github.com/containerd/containerd / TestFetcherOpenParallel

Function TestFetcherOpenParallel

core/remotes/docker/fetcher_test.go:139–294  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

137}
138
139func TestFetcherOpenParallel(t *testing.T) {
140 size := int64(3 * 1024 * 1024)
141 content := make([]byte, size)
142 rand.New(rand.NewSource(1)).Read(content)
143 sendContentLength := true
144
145 f := dockerFetcher{
146 &dockerBase{
147 repository: "nonempty",
148 limiter: nil,
149 performances: transfer.ImageResolverPerformanceSettings{
150 ConcurrentLayerFetchBuffer: 0,
151 },
152 },
153 }
154
155 cfgConcurency := func(maxConcurrentDls, chunkSize int) {
156 f.dockerBase.performances.MaxConcurrentDownloads = maxConcurrentDls
157 f.dockerBase.performances.ConcurrentLayerFetchBuffer = chunkSize
158 limiter := semaphore.NewWeighted(int64(maxConcurrentDls))
159 f.dockerBase.limiter = limiter
160 }
161
162 ignoreContentRange := false
163 var failTimeoutOnceAfter atomic.Int64
164 failAfter := int64(0)
165 var forceRange []httpRange
166 s := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
167 rng, err := parseRange(r.Header.Get("Range"), size)
168 if errors.Is(err, errNoOverlap) {
169 err = nil
170 }
171 assert.NoError(t, err)
172 if ignoreContentRange {
173 rng = nil
174 }
175 if forceRange != nil {
176 rng = forceRange
177 }
178 if failAfter > 0 && rng[0].start > failAfter {
179 rw.WriteHeader(http.StatusInternalServerError)
180 return
181 }
182 timeoutOnceAfter := failTimeoutOnceAfter.Load()
183 if timeoutOnceAfter > 0 && rng[0].start > timeoutOnceAfter {
184 failTimeoutOnceAfter.Store(0)
185 rw.WriteHeader(http.StatusRequestTimeout)
186 return
187 }
188
189 if len(rng) == 0 {
190 if sendContentLength {
191 rw.Header().Set("content-length", strconv.Itoa(len(content)))
192 }
193 _, _ = rw.Write(content)
194 } else {
195 b := content[rng[0].start : rng[0].start+rng[0].length]
196 rw.Header().Set("content-range", rng[0].contentRange(size))

Callers

nothing calls this directly

Calls 15

openMethod · 0.95
parseRangeFunction · 0.85
LoadMethod · 0.80
HeaderMethod · 0.80
contentRangeMethod · 0.80
FatalMethod · 0.80
requestMethod · 0.80
ReadMethod · 0.65
GetMethod · 0.65
StoreMethod · 0.65
SetMethod · 0.65
WriteMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…