{"record":{"id":"ec972767d34c9917","repo":"dgraph-io/dgraph","slug":"no-backup-manifests-found-at-location-s","errorCode":null,"errorMessage":"no backup manifests found at location %s","messagePattern":"no backup manifests found at location (.+?)","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"worker/online_restore.go","lineNumber":265,"sourceCode":"\n\tmanifests, err := getManifestsToRestore(handler, uri, req)\n\tif err != nil {\n\t\treturn errors.Wrapf(err, \"cannot get backup manifests\")\n\t}\n\n\t// filter manifests that needs to be restored\n\tmfsToRestore := manifests[:0]\n\tfor _, m := range manifests {\n\t\tif (req.BackupNum == 0 || m.BackupNum <= req.BackupNum) &&\n\t\t\t(req.IncrementalFrom == 0 || m.BackupNum >= req.IncrementalFrom) {\n\n\t\t\tmfsToRestore = append(mfsToRestore, m)\n\t\t}\n\t}\n\tmanifests = mfsToRestore\n\n\tif len(manifests) == 0 {\n\t\treturn errors.Errorf(\"no backup manifests found at location %s\", req.Location)\n\t}\n\n\tlastManifest := manifests[0]\n\trestorePreds, ok := lastManifest.Groups[req.GroupId]\n\tif !ok {\n\t\treturn errors.Errorf(\"backup manifest does not contain information for group ID %d\", req.GroupId)\n\t}\n\n\t// When we change predicate names from {fromNamespace}-predicate to 0-predicate,\n\t// this is not straight forward. This is because, Zero has a knowledge of what\n\t// predicate belongs to what group. We need to ensure that while transforming predicate names,\n\t// we let the Zero know. The algorithm that we follow here is that,\n\t// the group that had the data at the time of backup, has the data after restore.\n\t// For example, if we restore namespace 1 and 1-email belongs to group 1, after restore,\n\t// 0-email would belong to group 1 as well.\n\n\t// There are two types of predicates in a namespace:\n","sourceCodeStart":247,"sourceCodeEnd":283,"githubUrl":"https://github.com/dgraph-io/dgraph/blob/759e242be62c91f8d084da06ad0c8d21256d9c07/worker/online_restore.go#L247-L283","documentation":"Returned by handleRestoreProposal (worker/online_restore.go:265). Manifests were fetched but after filtering to [IncrementalFrom, BackupNum] the list is empty, so there is nothing to restore at req.Location. It means the backup set at that location does not intersect the requested backup number range.","triggerScenarios":"Restore request with backupNum/incrementalFrom values that don't match any backup at the location (e.g. BackupNum=5 but only 3 backups exist); restoring incremental backups without their full backup in the same location; pointing at a folder containing only data files, no manifests.","commonSituations":"Pointing restore at a partial copy of the backup folder where the full backup manifest was excluded; incrementalFrom/backupNum mistyped; restoring only incremental backups into a fresh cluster; location pointing to a subfolder of a single backup rather than the backup-set root.","solutions":["List the manifests at the location and set backupNum/incrementalFrom to values present there (or omit them to restore everything).","Ensure the location includes the full backup plus all incrementals to restore; always restore from the backup-set root folder.","If the desired backup range is missing, re-run dgraph backup to regenerate a complete set before restoring."],"exampleFix":"// before\n{\"location\": \"s3://bucket/backups\", \"backupNum\": 9, \"incrementalFrom\": 7}  // only backups 1-3 exist\n// after\n{\"location\": \"s3://bucket/backups\"}  // restore all, or use existing numbers\n{\"location\": \"s3://bucket/backups\", \"backupNum\": 3}","handlingStrategy":"validation","validationCode":"// Check that requested backup numbers exist in the backup set\n// (list manifests first; restore with numbers <= highest available)\nif requestedBackupNum > highestManifestBackupNum {\n    return errors.New(\"backupNum not present in backup set\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always copy the full backup set (full + incrementals) to the restore location.","Omit backupNum/incrementalFrom to restore everything unless you know the range exists.","Never restore incrementals alone into a fresh cluster.","Read manifest.json files to confirm available backup numbers before choosing a range."],"tags":["dgraph","restore","backup-numbers","configuration"],"backgroundTag":"no-backup-manifests-found","analyzedSha":"759e242be62c91f8d084da06ad0c8d21256d9c07","analyzedAt":"2026-09-01T14:42:12.034Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}