siyuan-note/siyuan · error

An Obsidian Vault import task is already running

Error message

An Obsidian Vault import task is already running

What it means

Error "An Obsidian Vault import task is already running" thrown in siyuan-note/siyuan.

Solutions

  1. Wait for the running import task to finish, or cancel it before starting a new one
  2. Restart the SiYuan kernel to clear stale task state

When it happens

Trigger: Thrown at kernel/model/import_obsidian.go:250 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of siyuan-note/siyuan@afa823b6b4 (2026-08-18). Data as JSON: /api/errors/ca6a7190264c15f3. Report an issue: GitHub.

Appendix: source

Thrown at kernel/model/import_obsidian.go:250

	errObsidianVaultUnsafePath      = errors.New("Obsidian Vault path is unsafe")
	errObsidianVaultConfigMissing   = errors.New("Obsidian Vault config directory is missing")
	errObsidianVaultMarkdownMissing = errors.New("Obsidian Vault has no readable Markdown")
	errObsidianSourceChanged        = errors.New("Obsidian source file changed")

	obsidianBlockIDPattern  = regexp.MustCompile(`(?m)(?:^|[ \t])\^([A-Za-z0-9-]+)[ \t]*$`)
	obsidianQuotePattern    = regexp.MustCompile(`^((?:[ \t]*>[ \t]?)+)(.*)$`)
	obsidianListItemPattern = regexp.MustCompile(`^([ \t]*(?:[-+*]|\d+[.)])[ \t]+)(.*)$`)
	obsidianFootnotePattern = regexp.MustCompile(`(?m)\[\^[^\]\r\n]+\]`)
)

func StartObsidianVaultAnalysis(localPath string) (*ObsidianVaultTask, error) {
	var replacedTaskID string
	obsidianTasksMu.Lock()
	if obsidianActive != "" {
		if active := obsidianTasks[obsidianActive]; active != nil && !isObsidianTerminalState(active.State) {
			if !isObsidianPreImportState(active.State) {
				obsidianTasksMu.Unlock()
				return nil, errors.New(Conf.Language(329))
			}
			if active.Cancel != nil {
				active.Cancel()
			}
			replacedTaskID = active.TaskID
			finishObsidianTaskLocked(active, ObsidianTaskStateCancelled, "Import cancelled", "")
		}
	}

	taskID := ast.NewNodeID()
	ctx, cancel := context.WithCancel(context.Background())
	task := &obsidianTask{TaskID: taskID, State: ObsidianTaskStateQueued, Message: "Waiting to analyze", Cancel: cancel}
	obsidianTasks[taskID] = task
	obsidianActive = taskID
	ret := snapshotObsidianTask(task)
	obsidianTasksMu.Unlock()

	if replacedTaskID != "" {

View on GitHub (pinned to afa823b6b4)