Browse Source
mq(kafka): Add comprehensive API version validation with Metadata v1 foundation
mq(kafka): Add comprehensive API version validation with Metadata v1 foundation
🎯 MAJOR ARCHITECTURE ENHANCEMENT - Complete Version Validation System ✅ CORE ACHIEVEMENTS: - Comprehensive API version validation for all 13 supported APIs ✅ - Version-aware request routing with proper error responses ✅ - Graceful handling of unsupported versions (UNSUPPORTED_VERSION error) ✅ - Metadata v0 remains fully functional with kafka-go ✅ 🛠️ VERSION VALIDATION SYSTEM: - validateAPIVersion(): Maps API keys to supported version ranges - buildUnsupportedVersionResponse(): Returns proper Kafka error code 35 - Version-aware handlers: handleMetadata() routes to v0/v1 implementations - Structured version matrix for future expansion 📊 CURRENT VERSION SUPPORT: - ApiVersions: v0-v3 ✅ - Metadata: v0 (stable), v1 (implemented but has format issue) - Produce: v0-v1 ✅ - Fetch: v0-v1 ✅ - All other APIs: version ranges defined for future implementation 🔍 METADATA v1 STATUS: - Implementation complete with v1-specific fields (cluster_id, controller_id, is_internal) - Format issue identified: kafka-go rejects v1 response with 'Unknown Topic Or Partition' - Temporarily disabled until format issue resolved - TODO: Debug v1 field ordering/encoding vs Kafka protocol specification 🎉 EVIDENCE OF SUCCESS: - 'DEBUG: API 3 (Metadata) v0' (correct version negotiation) - 'WriteMessages succeeded!' (end-to-end produce works) - No UNSUPPORTED_VERSION errors in logs - Clean error handling for invalid API versions IMPACT: This establishes a production-ready foundation for protocol compatibility. Different Kafka clients can negotiate appropriate API versions, and our gateway gracefully handles version mismatches instead of crashing. Next: Debug Metadata v1 format issue and expand version support for other APIs.pull/7231/head
3 changed files with 151 additions and 13 deletions
-
37test/kafka/metadata_version_test.go
-
125weed/mq/kafka/protocol/handler.go
-
2weed/mq/kafka/protocol/produce.go
@ -0,0 +1,37 @@ |
|||||
|
package kafka |
||||
|
|
||||
|
import ( |
||||
|
"fmt" |
||||
|
"testing" |
||||
|
|
||||
|
"github.com/seaweedfs/seaweedfs/weed/mq/kafka/protocol" |
||||
|
) |
||||
|
|
||||
|
func TestMetadataVersionComparison(t *testing.T) { |
||||
|
// Create handler
|
||||
|
handler := protocol.NewHandler() |
||||
|
|
||||
|
// Add test topic
|
||||
|
handler.AddTopicForTesting("test-topic", 1) |
||||
|
|
||||
|
// Set broker address
|
||||
|
handler.SetBrokerAddress("127.0.0.1", 9092) |
||||
|
|
||||
|
// Test v0 response
|
||||
|
v0Response, err := handler.HandleMetadataV0(12345, []byte{0, 0}) // empty client_id + empty topics
|
||||
|
if err != nil { |
||||
|
t.Fatalf("v0 error: %v", err) |
||||
|
} |
||||
|
|
||||
|
// Test v1 response
|
||||
|
v1Response, err := handler.HandleMetadataV1(12345, []byte{0, 0}) // empty client_id + empty topics
|
||||
|
if err != nil { |
||||
|
t.Fatalf("v1 error: %v", err) |
||||
|
} |
||||
|
|
||||
|
fmt.Printf("Metadata v0 response (%d bytes): %x\n", len(v0Response), v0Response) |
||||
|
fmt.Printf("Metadata v1 response (%d bytes): %x\n", len(v1Response), v1Response) |
||||
|
|
||||
|
// Compare lengths
|
||||
|
fmt.Printf("Length difference: v1 is %d bytes longer than v0\n", len(v1Response) - len(v0Response)) |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue