Tencent/WeKnora · error
create default %s page: %w
Error message
create default %s page: %w
What it means
After constructing the default page, createDefaultPage persists it via s.repo.Create. Failure is wrapped as 'create default <slug> page: %w'. This means seeding the default index page failed at the storage layer.
Source
Thrown at internal/application/service/wiki_page.go:1273
return nil, fmt.Errorf("get knowledge base: %w", err)
}
page := &types.WikiPage{
ID: uuid.New().String(),
TenantID: kb.TenantID,
KnowledgeBaseID: kbID,
Slug: slug,
Title: title,
PageType: pageType,
Status: types.WikiPageStatusPublished,
Content: content,
Summary: title,
Version: 1,
}
normalizeWikiHierarchy(page)
if err := s.repo.Create(ctx, page); err != nil {
return nil, fmt.Errorf("create default %s page: %w", slug, err)
}
return page, nil
}
func normalizeWikiHierarchy(page *types.WikiPage) {
if page == nil {
return
}
page.ParentSlug = strings.TrimSpace(page.ParentSlug)
cleanPath := types.StringArray(types.CleanWikiCategoryPath(page.CategoryPath))
page.CategoryPath = cleanPath
page.Depth = len(cleanPath)
display := strings.TrimSpace(page.Title)
if display == "" {
display = strings.TrimSpace(page.Slug)
}View on GitHub (pinned to 988cbb0330)
Solutions
- Check the wrapped cause: for duplicate-key errors, treat the page as already created and retry the read (or add an upsert/OnConflict path).
- Retry the GetIndex call after transient DB failures.
- Verify migrations and constraints on the pages table.
- Serialize or idempotently guard default-page seeding to avoid concurrent-create races.
Example fix
// before
if err := s.repo.Create(ctx, page); err != nil {
return nil, fmt.Errorf("create default %s page: %w", slug, err)
}
// after
if err := s.repo.Create(ctx, page); err != nil {
if existing, getErr := s.repo.GetBySlug(ctx, page.KnowledgeBaseID, slug); getErr == nil {
return existing, nil // lost race; page already exists
}
return nil, fmt.Errorf("create default %s page: %w", slug, err)
} Defensive patterns
Strategy: retry
Try / catch
page, err := svc.GetIndex(ctx, kbID)
if err != nil && strings.Contains(err.Error(), "create default") {
if isDuplicateKey(err) {
page, err = svc.GetIndex(ctx, kbID) // lost race; re-read
} else if isTransient(err) {
time.Sleep(backoff)
page, err = svc.GetIndex(ctx, kbID)
}
} Prevention
- Make default-page seeding idempotent (upsert or get-or-create)
- Avoid concurrent first-access storms by warming default pages after KB creation
- Keep pages-table constraints and migrations current
- Retry with backoff on transient storage errors
When it happens
Trigger: GetIndex triggering default-page creation when repo.Create fails — unique constraint on slug/ID, DB connection failure, read-only replica, or context cancellation.
Common situations: Two concurrent first requests racing to create the same default page (duplicate key); database out of disk or locked; schema mismatch after migration; wrong tenant configuration.
Related errors
- failed to create chunk: %w
- list %s pages: %w
- create wiki page issue: %w
- reload MCP OAuth token after concurrent refresh: %w
- reload MCP OAuth token before refresh: %w
AI-assisted analysis of Tencent/WeKnora@988cbb0330 (2026-09-02).
Data as JSON: /api/errors/d282dd2900e0ed7f.
Report an issue: GitHub.