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

  1. Check the wrapped cause: for duplicate-key errors, treat the page as already created and retry the read (or add an upsert/OnConflict path).
  2. Retry the GetIndex call after transient DB failures.
  3. Verify migrations and constraints on the pages table.
  4. 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

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


AI-assisted analysis of Tencent/WeKnora@988cbb0330 (2026-09-02). Data as JSON: /api/errors/d282dd2900e0ed7f. Report an issue: GitHub.