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
- Wait for the running import task to finish, or cancel it before starting a new one
- 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)