cfb1f93d48
Virtual members already merge concurrently, but each rpm member fetches primary/filelists/other one after another, and each deb member its Packages files the same way. On large virtuals the slowest member's serial chain pushes the merge past dnf's 30s timeout. - add `parallel_fetch` (default false) to virtuals: model, v2 API, migration 0007 - fetch a member's index files concurrently (up to 4) when set; first error still fails the member - thread the flag through rpm and deb member fetches Reviewed-on: #165 Co-authored-by: unkin-agent <unkin-agent@unkin.net> Co-committed-by: unkin-agent <unkin-agent@unkin.net>
57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
package v2
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"git.unkin.net/unkin/artifactapi/internal/database"
|
|
)
|
|
|
|
func TestVirtualParallelFetchRoundTrip(t *testing.T) {
|
|
if testDSN == "" {
|
|
t.Skip("Docker unavailable")
|
|
}
|
|
db, err := database.New(testDSN)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer db.Close()
|
|
h := NewVirtualsHandler(db).Routes()
|
|
parallel := func() bool {
|
|
t.Helper()
|
|
w := httptest.NewRecorder()
|
|
h.ServeHTTP(w, httptest.NewRequest("GET", "/vpf", nil))
|
|
var got map[string]any
|
|
if err := json.Unmarshal(w.Body.Bytes(), &got); err != nil || w.Code != 200 {
|
|
t.Fatalf("get = %d %s", w.Code, w.Body)
|
|
}
|
|
v, ok := got["parallel_fetch"].(bool)
|
|
if !ok {
|
|
t.Fatalf("parallel_fetch missing from %s", w.Body)
|
|
}
|
|
return v
|
|
}
|
|
const body = `"package_type":"rpm","members":["a"]`
|
|
|
|
steps := []struct {
|
|
method, path, json string
|
|
want bool
|
|
}{
|
|
{"POST", "/", `{"name":"vpf",` + body + `}`, false},
|
|
{"PUT", "/vpf", `{` + body + `,"parallel_fetch":true}`, true},
|
|
{"PUT", "/vpf", `{` + body + `,"parallel_fetch":false}`, false},
|
|
}
|
|
for i, s := range steps {
|
|
if c := do(t, h, s.method, s.path, s.json); c/100 != 2 {
|
|
t.Fatalf("step %d %s %s = %d", i, s.method, s.path, c)
|
|
}
|
|
if got := parallel(); got != s.want {
|
|
t.Errorf("step %d: parallel_fetch = %v, want %v", i, got, s.want)
|
|
}
|
|
}
|
|
if c := do(t, h, "DELETE", "/vpf", ""); c != 204 {
|
|
t.Fatalf("delete = %d", c)
|
|
}
|
|
}
|