{"record":{"id":"69e9c9708aec0daf","repo":"vitessio/vitess","slug":"w-q-69e9c9","errorCode":null,"errorMessage":"%w %q","messagePattern":"%w %q","errorType":"error_code","errorClass":"errUnsupportedCompressionEngine","httpStatus":null,"severity":"error","filePath":"go/vt/mysqlctl/xtrabackupengine.go","lineNumber":743,"sourceCode":"\t\tif compressed {\n\t\t\tvar decompressor io.ReadCloser\n\t\t\tdeCompressionEngine := bm.CompressionEngine\n\t\t\tif deCompressionEngine == \"\" {\n\t\t\t\t// For backward compatibility. Incase if Manifest is from N-1 binary\n\t\t\t\t// then we assign the default value of compressionEngine.\n\t\t\t\tdeCompressionEngine = PgzipCompressor\n\t\t\t}\n\t\t\texternalDecompressorCmd := resolveExternalDecompressor(bm.ExternalDecompressor)\n\t\t\tif externalDecompressorCmd != \"\" {\n\t\t\t\tif deCompressionEngine == ExternalCompressor {\n\t\t\t\t\tdeCompressionEngine = externalDecompressorCmd\n\t\t\t\t\tdecompressor, err = newExternalDecompressor(ctx, deCompressionEngine, reader, logger)\n\t\t\t\t} else {\n\t\t\t\t\tdecompressor, err = newBuiltinDecompressor(deCompressionEngine, reader, logger)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif deCompressionEngine == ExternalCompressor {\n\t\t\t\t\treturn fmt.Errorf(\"%w %q\", errUnsupportedCompressionEngine, ExternalCompressor)\n\t\t\t\t}\n\t\t\t\tdecompressor, err = newBuiltinDecompressor(deCompressionEngine, reader, logger)\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\treturn vterrors.Wrap(err, \"can't create decompressor\")\n\t\t\t}\n\t\t\tsrcDecompressors = append(srcDecompressors, ioutil.NewTimeoutCloser(ctx, decompressor, closeTimeout))\n\t\t\treader = decompressor\n\t\t}\n\n\t\tsrcReaders = append(srcReaders, reader)\n\t}\n\tdefer func() {\n\t\tfor _, decompressor := range srcDecompressors {\n\t\t\tif cerr := decompressor.Close(); cerr != nil {\n\t\t\t\tlogger.Errorf(\"failed to close decompressor: %v\", cerr)\n\t\t\t}\n\t\t}","sourceCodeStart":725,"sourceCodeEnd":761,"githubUrl":"https://github.com/vitessio/vitess/blob/01a25a7d176f94613b8d59d799f438380a8760e4/go/vt/mysqlctl/xtrabackupengine.go#L725-L761","documentation":"During XtraBackup restore, extractFiles validates the requested backup's compression engine. If the backup manifest indicates a non-compressed backup (no compression engine) but the external compressor engine is selected, it fails with errUnsupportedCompressionEngine wrapped with the engine name, since there is nothing for an external decompressor to decompress.","triggerScenarios":"Restoring from a backup whose BackupManifest has no CompressionEngineName while the tablet's restore configuration specifies the external compressor engine (restore_from_backup with ExternalCompressor).","commonSituations":"Backup was taken without compression but tablet flags/config changed to expect external compression; operator switched --compression-engine / restore flags between backup generations; mixed-version clusters where older backups were uncompressed.","solutions":["Remove the external-compressor setting from the restore configuration so the builtin path (or no decompression) is used.","Take a new backup with the intended compression engine, then restore from it.","Pick a backup manifest whose compression engine matches the configured restore engine.","Verify the compression flags on the tablet (e.g. backup_engine_implementation/compression settings) match how the backup was actually taken."],"exampleFix":"// before: restore config forces external compressor on uncompressed backup\nrestoring with ExternalCompressor -> errUnsupportedCompressionEngine\n// after: align engine with backup\n// unset external compression or take backup with --compression-engine=external","handlingStrategy":"validation","validationCode":"if manifest.CompressionEngineName == \"\" && restoreConfig.CompressionEngine == \"external\" {\n  return errors.New(\"backup is uncompressed; remove external compressor setting\")\n}","typeGuard":"func backupIsCompressed(m *backupstorage.BackupManifest) bool { return m.CompressionEngineName != \"\" }","tryCatchPattern":"if err := restore(ctx); err != nil {\n  if errors.Is(err, mysqlctl.ErrUnsupportedCompressionEngine) {\n    log.Warn(\"fallback: retry restore without external compression\")\n  }\n}","preventionTips":["Keep backup compression settings stable across backup and restore","Record the compression engine used when taking each backup","Test restores from old backups after changing compression flags"],"tags":["backup","restore","compression","xtrabackup"],"backgroundTag":"unsupported-compression-engine","analyzedSha":"01a25a7d176f94613b8d59d799f438380a8760e4","analyzedAt":"2026-09-01T17:28:30.605Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}