dgraph-io/dgraph · error

cannot read manifests at location %s

Error message

cannot read manifests at location %s

What it means

ProcessListBackups lists backup manifests at a given location. If ListBackupManifests fails to enumerate or read the manifests (storage backend error, bad credentials, missing location, malformed manifests), the failure is wrapped with the location so the user knows which URI could not be read.

Source

Thrown at worker/backup.go:434

	bp := NewBackupProcessor(nil, req)
	defer bp.Close()
	err = bp.CompleteBackup(ctx, &m)

	if err != nil {
		return err
	}

	backupSuccessful = true
	return nil
}

func ProcessListBackups(ctx context.Context, location string, creds *x.MinioCredentials,
	fullManifest bool) ([]*Manifest, error) {

	manifests, err := ListBackupManifests(location, creds, fullManifest)
	if err != nil {
		return nil, errors.Wrapf(err, "cannot read manifests at location %s", location)
	}

	return manifests, nil
}

// BackupProcessor handles the different stages of the backup process.
type BackupProcessor struct {
	// DB is the Badger pstore managed by this node.
	DB *badger.DB
	// Request stores the backup request containing the parameters for this backup.
	Request *pb.BackupRequest

	// txn is used for the iterators in the threadLocal
	txn     *badger.Txn
	threads []*threadLocal
}

type threadLocal struct {

View on GitHub (pinned to 759e242be6)

Solutions

  1. Check the wrapped inner error for the storage-level root cause
  2. Verify the location URI is correct and at least one backup exists there
  3. Confirm credentials have list/read permission on the bucket/prefix
  4. Test connectivity to the storage backend, then retry the listing

Example fix

// before
manifests, err := ProcessListBackups(ctx, "s3://backups/dgraph", creds, true)
// after
if err := validateBackupLocation(ctx, "s3://backups/dgraph", creds); err != nil {
    return fmt.Errorf("check location/credentials before listing: %w", err)
}
manifests, err := ProcessListBackups(ctx, "s3://backups/dgraph", creds, true)
Defensive patterns

Strategy: validation

Validate before calling

if !strings.HasPrefix(location, "s3://") && !strings.HasPrefix(location, "minio://") && !isLocalPath(location) {
    return errors.Errorf("invalid backup location %q", location)
}
// optionally probe with a lightweight list before full listing

Try / catch

manifests, err := ProcessListBackups(ctx, location, creds, full)
if err != nil && errors.Cause(err) != nil {
    glog.Errorf("cannot list at %s: %v (check creds/connectivity/bucket)", location, errors.Cause(err))
}

Prevention

When it happens

Trigger: Calling ProcessListBackups(ctx, location, creds, fullManifest) where ListBackupManifests returns an error: URI points to a nonexistent/empty location, credentials lack ListObjects permission, storage backend is unreachable, or manifest objects are corrupt/incomplete.

Common situations: Typo in s3:// or minio:// path; IAM role missing s3:ListBucket; listing backups before any backup was ever taken to that location; network partition to MinIO/S3; bucket region mismatch.

Related errors


AI-assisted analysis of dgraph-io/dgraph@759e242be6 (2026-09-01). Data as JSON: /api/errors/82e13c6ba1bf1c81. Report an issue: GitHub.