fix storage datasets creation
Some checks failed
CI / test-build (push) Has been cancelled

This commit is contained in:
2025-12-20 03:08:16 +00:00
parent 98bedf6487
commit b90c725cdb
2 changed files with 281 additions and 18 deletions

View File

@@ -281,13 +281,50 @@ func (a *App) handleCreateDataset(w http.ResponseWriter, r *http.Request) {
req.Options = make(map[string]string)
}
if err := a.zfs.CreateDataset(req.Name, req.Options); err != nil {
log.Printf("create dataset error: %v", err)
writeJSON(w, http.StatusInternalServerError, map[string]string{"error": err.Error()})
err := a.zfs.CreateDataset(req.Name, req.Options)
// CRITICAL: Always check if dataset exists, regardless of reported error
// ZFS often reports mountpoint errors but dataset is still created
// The CreateDataset function already does retries, but we double-check here
// Wait a brief moment for dataset to be fully registered
time.Sleep(300 * time.Millisecond)
datasets, getErr := a.zfs.ListDatasets("")
var datasetExists bool
if getErr == nil {
for _, ds := range datasets {
if ds.Name == req.Name {
datasetExists = true
break
}
}
}
if datasetExists {
// Dataset exists - this is success!
if err != nil {
log.Printf("info: dataset %s created successfully despite CreateDataset reporting error: %v", req.Name, err)
} else {
log.Printf("info: dataset %s created successfully", req.Name)
}
// Set cache-control headers
w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
w.Header().Set("Pragma", "no-cache")
w.Header().Set("Expires", "0")
writeJSON(w, http.StatusCreated, map[string]string{"message": "dataset created", "name": req.Name})
return
}
writeJSON(w, http.StatusCreated, map[string]string{"message": "dataset created", "name": req.Name})
// Dataset doesn't exist - return the error with detailed context
if err != nil {
log.Printf("error: dataset %s creation failed - CreateDataset error: %v, ListDatasets error: %v", req.Name, err, getErr)
writeError(w, errors.ErrInternal("failed to create dataset").WithDetails(err.Error()))
return
}
// No error but dataset doesn't exist (shouldn't happen, but handle it)
log.Printf("warning: dataset %s creation reported no error but dataset was not found", req.Name)
writeError(w, errors.ErrInternal(fmt.Sprintf("Dataset '%s' creation reported success but dataset was not found", req.Name)))
}
func (a *App) handleGetDataset(w http.ResponseWriter, r *http.Request) {