snapshot of https://github.com/seaweedfs/seaweedfs.git (master, 2026-09-16; blobs > 131072B omitted)
Some checks failed
go: build dev binaries / cleanup (push) Successful in 4s
Codespell / Check for spelling errors (push) Failing after 3s
docker: build dev containers / build-rust-binaries (amd64, x86_64-unknown-linux-musl) (push) Failing after 3s
docker: build dev containers / build-dev-containers (push) Has been skipped
docker: build dev containers / build-rust-binaries (arm64, true, aarch64-unknown-linux-musl) (push) Failing after 3s
End to End / FUSE Mount (push) Failing after 2s
EC Integration Tests / EC Integration Tests (push) Failing after 30s
FUSE DLM Integration Tests / FUSE DLM Integration Tests (push) Failing after 3s
FUSE Volume Server Failover Tests / FUSE Volume Server Failover (push) Failing after 3s
FUSE Integration Tests / FUSE Integration Testing (push) Failing after 2s
FUSE P2P Peer Chunk Sharing Integration Tests / FUSE P2P Peer Chunk Sharing (push) Failing after 3s
go: build binary / Go Vet (push) Failing after 2s
go: build binary / Go Vet 32-bit (push) Failing after 3s
go: build binary / Build (push) Failing after 4s
go: build binary / Build cross-platform (freebsd/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (darwin/arm64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/arm64) (push) Failing after 3s
go: build binary / Test (push) Failing after 2s
go: build binary / Test 32-bit (push) Failing after 3s
helm: lint and test charts / lint-test (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (11) (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (17) (push) Failing after 3s
go: build dev binaries / build_dev_linux_windows (amd64, linux) (push) Failing after 2s
go: build dev binaries / build_dev_linux_windows (amd64, windows) (push) Failing after 3s
go: build dev binaries / build_dev_darwin (amd64, darwin) (push) Has been skipped
go: build dev binaries / build_dev_darwin (arm64, darwin) (push) Has been skipped
Java Client Unit Tests / Java Unit Tests (11) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (17) (push) Failing after 2s
Java Client Unit Tests / Java Unit Tests (21) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (8) (push) Failing after 3s
Kafka Quick Test (Load Test with Schema Registry) / Kafka Client Load Test (Quick) (push) Failing after 3s
Kafka Gateway Tests / Kafka Unit Tests (unit-tests-1) (push) Failing after 11s
Kafka Gateway Tests / Kafka Integration Tests (Critical) (integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka End-to-End Tests (with SMQ) (e2e-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Consumer Group Tests (Highly Isolated) (consumer-group-1) (push) Failing after 2s
Kafka Gateway Tests / Kafka Client Compatibility (with SMQ) (client-compat-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka SMQ Integration Tests (Full Stack) (smq-integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Protocol Tests (Isolated) (protocol-1) (push) Failing after 3s
KMS Tests / KMS Provider Integration Tests (push) Failing after 2s
KMS Tests / S3 KMS End-to-End Tests (push) Failing after 3s
Master Cold Start Tests / Master Cold Start Tests (push) Failing after 4s
Metadata Subscribe Integration Tests / Metadata Subscribe Integration Tests (push) Failing after 3s
Multi-Master Tests / Multi-Master Failover Tests (push) Failing after 3s
Performance / CPU and Heap Profile (push) Failing after 2s
Performance / S3 Read/Write Benchmark (rust volume) (push) Failing after 3s
pjdfstest POSIX Compliance / pjdfstest (push) Failing after 2s
Plugin Worker Integration Tests / Plugin Worker: erasure_coding (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: vacuum (push) Failing after 3s
Rust Volume Server Tests / Rust Integration Tests (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 1) (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 1) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 3) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Distributed Tests (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Performance Tests (push) Failing after 3s
Performance / Throughput Benchmark (go volume) (push) Failing after 3s
Performance / Throughput Benchmark (rust volume) (push) Failing after 2s
Performance / S3 Read/Write Benchmark (go volume) (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: volume_balance (push) Failing after 3s
PostgreSQL Gateway Tests / PostgreSQL Basic Tests (push) Failing after 3s
Rust Volume Server Tests / Rust Unit Tests (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 3) (push) Failing after 3s
Rust Plugin Worker Tests / Rust Plugin Worker Build and Unit Tests (push) Failing after 3s
rust: build dev volume server binaries / cleanup (push) Successful in 3s
S3 ETag and ACL Tests / S3 ETag + ACL Integration Tests (push) Failing after 3s
S3 IAM Integration Tests / IAM Unit Tests (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (advanced) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (basic) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (group) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (policy-enforcement) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (sts) (push) Failing after 4s
S3 Keycloak Integration Tests / S3 Keycloak Integration Tests (push) Failing after 3s
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.11) (push) Failing after 3s
S3 PyArrow Parquet Tests / Go Unit Tests (Implicit Directory) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.12) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-amd64, x86_64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-arm64, aarch64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-linux (linux-amd64, x86_64-unknown-linux-gnu) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.9) (push) Has been cancelled
S3 Proxy Signature Tests / S3 Proxy Signature Verification Tests (push) Has been cancelled
S3 SDK V2 Route Disambiguation Tests / S3 SDK V2 Routing Tests (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (quick) (push) Has been cancelled
S3 SSE Tests / S3 SSE Compatibility Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Metadata Persistence Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Copy Operations Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Multipart Upload Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Performance Test (push) Has been cancelled
S3 SSE Tests / S3 Volume Encryption Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (comprehensive) (push) Has been cancelled
Spark Integration Tests / Spark Integration Tests (push) Failing after 2s
Telemetry Integration Tests / telemetry-integration-test (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 1) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 1) (push) Failing after 3s
Ceph S3 tests / Basic S3 tests (KV store) (push) Has been cancelled
Ceph S3 tests / S3 Versioning & Object Lock tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Unit Tests (push) Failing after 3s
Ceph S3 tests / S3 CORS tests (push) Has been cancelled
Ceph S3 tests / SeaweedFS Custom S3 Copy tests (push) Has been cancelled
Ceph S3 tests / Basic S3 tests (SQL store) (push) Has been cancelled
test s3 over https using aws-cli / awscli-tests (push) Has been cancelled
TLS Rotation Integration Tests / TLS Rotation Integration Tests (push) Has been cancelled
Vacuum Integration Tests / Vacuum Integration Tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Variables Integration Tests (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (advanced-policy) (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (basic-policy) (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (contextual-policy) (push) Failing after 4s
S3 Policy Integration Tests / Trusted Proxy Detection Tests (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Shell Integration Tests (push) Failing after 3s
Samba on FUSE Integration / samba-integration (push) Failing after 2s
SFTP Integration Tests / SFTP Integration Testing (push) Failing after 3s
terraform: validate and test modules / fmt, validate, plan-level tests (push) Failing after 3s
terraform: validate and test modules / local cluster smoke test (real weed) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 3) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 2) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 2) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 3) (push) Failing after 5s
mount: windows conformance / WinFsp conformance (push) Has been cancelled
mount: windows / Mount on Windows (push) Has been cancelled
Some checks failed
go: build dev binaries / cleanup (push) Successful in 4s
Codespell / Check for spelling errors (push) Failing after 3s
docker: build dev containers / build-rust-binaries (amd64, x86_64-unknown-linux-musl) (push) Failing after 3s
docker: build dev containers / build-dev-containers (push) Has been skipped
docker: build dev containers / build-rust-binaries (arm64, true, aarch64-unknown-linux-musl) (push) Failing after 3s
End to End / FUSE Mount (push) Failing after 2s
EC Integration Tests / EC Integration Tests (push) Failing after 30s
FUSE DLM Integration Tests / FUSE DLM Integration Tests (push) Failing after 3s
FUSE Volume Server Failover Tests / FUSE Volume Server Failover (push) Failing after 3s
FUSE Integration Tests / FUSE Integration Testing (push) Failing after 2s
FUSE P2P Peer Chunk Sharing Integration Tests / FUSE P2P Peer Chunk Sharing (push) Failing after 3s
go: build binary / Go Vet (push) Failing after 2s
go: build binary / Go Vet 32-bit (push) Failing after 3s
go: build binary / Build (push) Failing after 4s
go: build binary / Build cross-platform (freebsd/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (darwin/arm64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/arm64) (push) Failing after 3s
go: build binary / Test (push) Failing after 2s
go: build binary / Test 32-bit (push) Failing after 3s
helm: lint and test charts / lint-test (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (11) (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (17) (push) Failing after 3s
go: build dev binaries / build_dev_linux_windows (amd64, linux) (push) Failing after 2s
go: build dev binaries / build_dev_linux_windows (amd64, windows) (push) Failing after 3s
go: build dev binaries / build_dev_darwin (amd64, darwin) (push) Has been skipped
go: build dev binaries / build_dev_darwin (arm64, darwin) (push) Has been skipped
Java Client Unit Tests / Java Unit Tests (11) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (17) (push) Failing after 2s
Java Client Unit Tests / Java Unit Tests (21) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (8) (push) Failing after 3s
Kafka Quick Test (Load Test with Schema Registry) / Kafka Client Load Test (Quick) (push) Failing after 3s
Kafka Gateway Tests / Kafka Unit Tests (unit-tests-1) (push) Failing after 11s
Kafka Gateway Tests / Kafka Integration Tests (Critical) (integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka End-to-End Tests (with SMQ) (e2e-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Consumer Group Tests (Highly Isolated) (consumer-group-1) (push) Failing after 2s
Kafka Gateway Tests / Kafka Client Compatibility (with SMQ) (client-compat-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka SMQ Integration Tests (Full Stack) (smq-integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Protocol Tests (Isolated) (protocol-1) (push) Failing after 3s
KMS Tests / KMS Provider Integration Tests (push) Failing after 2s
KMS Tests / S3 KMS End-to-End Tests (push) Failing after 3s
Master Cold Start Tests / Master Cold Start Tests (push) Failing after 4s
Metadata Subscribe Integration Tests / Metadata Subscribe Integration Tests (push) Failing after 3s
Multi-Master Tests / Multi-Master Failover Tests (push) Failing after 3s
Performance / CPU and Heap Profile (push) Failing after 2s
Performance / S3 Read/Write Benchmark (rust volume) (push) Failing after 3s
pjdfstest POSIX Compliance / pjdfstest (push) Failing after 2s
Plugin Worker Integration Tests / Plugin Worker: erasure_coding (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: vacuum (push) Failing after 3s
Rust Volume Server Tests / Rust Integration Tests (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 1) (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 1) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 3) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Distributed Tests (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Performance Tests (push) Failing after 3s
Performance / Throughput Benchmark (go volume) (push) Failing after 3s
Performance / Throughput Benchmark (rust volume) (push) Failing after 2s
Performance / S3 Read/Write Benchmark (go volume) (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: volume_balance (push) Failing after 3s
PostgreSQL Gateway Tests / PostgreSQL Basic Tests (push) Failing after 3s
Rust Volume Server Tests / Rust Unit Tests (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 3) (push) Failing after 3s
Rust Plugin Worker Tests / Rust Plugin Worker Build and Unit Tests (push) Failing after 3s
rust: build dev volume server binaries / cleanup (push) Successful in 3s
S3 ETag and ACL Tests / S3 ETag + ACL Integration Tests (push) Failing after 3s
S3 IAM Integration Tests / IAM Unit Tests (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (advanced) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (basic) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (group) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (policy-enforcement) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (sts) (push) Failing after 4s
S3 Keycloak Integration Tests / S3 Keycloak Integration Tests (push) Failing after 3s
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.11) (push) Failing after 3s
S3 PyArrow Parquet Tests / Go Unit Tests (Implicit Directory) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.12) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-amd64, x86_64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-arm64, aarch64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-linux (linux-amd64, x86_64-unknown-linux-gnu) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.9) (push) Has been cancelled
S3 Proxy Signature Tests / S3 Proxy Signature Verification Tests (push) Has been cancelled
S3 SDK V2 Route Disambiguation Tests / S3 SDK V2 Routing Tests (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (quick) (push) Has been cancelled
S3 SSE Tests / S3 SSE Compatibility Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Metadata Persistence Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Copy Operations Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Multipart Upload Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Performance Test (push) Has been cancelled
S3 SSE Tests / S3 Volume Encryption Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (comprehensive) (push) Has been cancelled
Spark Integration Tests / Spark Integration Tests (push) Failing after 2s
Telemetry Integration Tests / telemetry-integration-test (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 1) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 1) (push) Failing after 3s
Ceph S3 tests / Basic S3 tests (KV store) (push) Has been cancelled
Ceph S3 tests / S3 Versioning & Object Lock tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Unit Tests (push) Failing after 3s
Ceph S3 tests / S3 CORS tests (push) Has been cancelled
Ceph S3 tests / SeaweedFS Custom S3 Copy tests (push) Has been cancelled
Ceph S3 tests / Basic S3 tests (SQL store) (push) Has been cancelled
test s3 over https using aws-cli / awscli-tests (push) Has been cancelled
TLS Rotation Integration Tests / TLS Rotation Integration Tests (push) Has been cancelled
Vacuum Integration Tests / Vacuum Integration Tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Variables Integration Tests (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (advanced-policy) (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (basic-policy) (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (contextual-policy) (push) Failing after 4s
S3 Policy Integration Tests / Trusted Proxy Detection Tests (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Shell Integration Tests (push) Failing after 3s
Samba on FUSE Integration / samba-integration (push) Failing after 2s
SFTP Integration Tests / SFTP Integration Testing (push) Failing after 3s
terraform: validate and test modules / fmt, validate, plan-level tests (push) Failing after 3s
terraform: validate and test modules / local cluster smoke test (real weed) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 3) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 2) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 2) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 3) (push) Failing after 5s
mount: windows conformance / WinFsp conformance (push) Has been cancelled
mount: windows / Mount on Windows (push) Has been cancelled
This commit is contained in:
340
weed/mq/kafka/integration/broker_client_restart_test.go
Normal file
340
weed/mq/kafka/integration/broker_client_restart_test.go
Normal file
@@ -0,0 +1,340 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/seaweedfs/seaweedfs/weed/pb/mq_pb"
|
||||
"google.golang.org/grpc/metadata"
|
||||
)
|
||||
|
||||
// MockSubscribeStream implements mq_pb.SeaweedMessaging_SubscribeMessageClient for testing
|
||||
type MockSubscribeStream struct {
|
||||
sendCalls []interface{}
|
||||
closed bool
|
||||
}
|
||||
|
||||
func (m *MockSubscribeStream) Send(req *mq_pb.SubscribeMessageRequest) error {
|
||||
m.sendCalls = append(m.sendCalls, req)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *MockSubscribeStream) Recv() (*mq_pb.SubscribeMessageResponse, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (m *MockSubscribeStream) CloseSend() error {
|
||||
m.closed = true
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *MockSubscribeStream) Header() (metadata.MD, error) { return nil, nil }
|
||||
func (m *MockSubscribeStream) Trailer() metadata.MD { return nil }
|
||||
func (m *MockSubscribeStream) Context() context.Context { return context.Background() }
|
||||
func (m *MockSubscribeStream) SendMsg(m2 interface{}) error { return nil }
|
||||
func (m *MockSubscribeStream) RecvMsg(m2 interface{}) error { return nil }
|
||||
|
||||
// TestNeedsRestart tests the NeedsRestart logic
|
||||
func TestNeedsRestart(t *testing.T) {
|
||||
bc := &BrokerClient{}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
session *BrokerSubscriberSession
|
||||
requestedOffset int64
|
||||
want bool
|
||||
reason string
|
||||
}{
|
||||
{
|
||||
name: "Stream is nil - needs restart",
|
||||
session: &BrokerSubscriberSession{
|
||||
Topic: "test-topic",
|
||||
Partition: 0,
|
||||
StartOffset: 100,
|
||||
Stream: nil,
|
||||
},
|
||||
requestedOffset: 100,
|
||||
want: true,
|
||||
reason: "Stream is nil",
|
||||
},
|
||||
{
|
||||
name: "Offset in cache - no restart needed",
|
||||
session: &BrokerSubscriberSession{
|
||||
Topic: "test-topic",
|
||||
Partition: 0,
|
||||
StartOffset: 100,
|
||||
Stream: &MockSubscribeStream{},
|
||||
Ctx: context.Background(),
|
||||
consumedRecords: []*SeaweedRecord{
|
||||
{Offset: 95},
|
||||
{Offset: 96},
|
||||
{Offset: 97},
|
||||
{Offset: 98},
|
||||
{Offset: 99},
|
||||
},
|
||||
},
|
||||
requestedOffset: 97,
|
||||
want: false,
|
||||
reason: "Offset 97 is in cache [95-99]",
|
||||
},
|
||||
{
|
||||
name: "Offset before current - needs restart",
|
||||
session: &BrokerSubscriberSession{
|
||||
Topic: "test-topic",
|
||||
Partition: 0,
|
||||
StartOffset: 100,
|
||||
Stream: &MockSubscribeStream{},
|
||||
Ctx: context.Background(),
|
||||
},
|
||||
requestedOffset: 50,
|
||||
want: true,
|
||||
reason: "Requested offset 50 < current 100",
|
||||
},
|
||||
{
|
||||
name: "Large gap ahead - needs restart",
|
||||
session: &BrokerSubscriberSession{
|
||||
Topic: "test-topic",
|
||||
Partition: 0,
|
||||
StartOffset: 100,
|
||||
Stream: &MockSubscribeStream{},
|
||||
Ctx: context.Background(),
|
||||
},
|
||||
requestedOffset: 2000,
|
||||
want: true,
|
||||
reason: "Gap of 1900 is > 1000",
|
||||
},
|
||||
{
|
||||
name: "Small gap ahead - no restart needed",
|
||||
session: &BrokerSubscriberSession{
|
||||
Topic: "test-topic",
|
||||
Partition: 0,
|
||||
StartOffset: 100,
|
||||
Stream: &MockSubscribeStream{},
|
||||
Ctx: context.Background(),
|
||||
},
|
||||
requestedOffset: 150,
|
||||
want: false,
|
||||
reason: "Gap of 50 is < 1000",
|
||||
},
|
||||
{
|
||||
name: "Exact match - no restart needed",
|
||||
session: &BrokerSubscriberSession{
|
||||
Topic: "test-topic",
|
||||
Partition: 0,
|
||||
StartOffset: 100,
|
||||
Stream: &MockSubscribeStream{},
|
||||
Ctx: context.Background(),
|
||||
},
|
||||
requestedOffset: 100,
|
||||
want: false,
|
||||
reason: "Exact match with current offset",
|
||||
},
|
||||
{
|
||||
name: "Context is nil - needs restart",
|
||||
session: &BrokerSubscriberSession{
|
||||
Topic: "test-topic",
|
||||
Partition: 0,
|
||||
StartOffset: 100,
|
||||
Stream: &MockSubscribeStream{},
|
||||
Ctx: nil,
|
||||
},
|
||||
requestedOffset: 100,
|
||||
want: true,
|
||||
reason: "Context is nil",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := bc.NeedsRestart(tt.session, tt.requestedOffset)
|
||||
if got != tt.want {
|
||||
t.Errorf("NeedsRestart() = %v, want %v (reason: %s)", got, tt.want, tt.reason)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// TestNeedsRestart_CacheLogic tests cache-based restart decisions
|
||||
func TestNeedsRestart_CacheLogic(t *testing.T) {
|
||||
bc := &BrokerClient{}
|
||||
|
||||
// Create session with cache containing offsets 100-109
|
||||
session := &BrokerSubscriberSession{
|
||||
Topic: "test-topic",
|
||||
Partition: 0,
|
||||
StartOffset: 110,
|
||||
Stream: &MockSubscribeStream{},
|
||||
Ctx: context.Background(),
|
||||
consumedRecords: []*SeaweedRecord{
|
||||
{Offset: 100}, {Offset: 101}, {Offset: 102}, {Offset: 103}, {Offset: 104},
|
||||
{Offset: 105}, {Offset: 106}, {Offset: 107}, {Offset: 108}, {Offset: 109},
|
||||
},
|
||||
}
|
||||
|
||||
testCases := []struct {
|
||||
offset int64
|
||||
want bool
|
||||
desc string
|
||||
}{
|
||||
{100, false, "First offset in cache"},
|
||||
{105, false, "Middle offset in cache"},
|
||||
{109, false, "Last offset in cache"},
|
||||
{99, true, "Before cache start"},
|
||||
{110, false, "Current position"},
|
||||
{111, false, "One ahead"},
|
||||
{1200, true, "Large gap > 1000"},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.desc, func(t *testing.T) {
|
||||
got := bc.NeedsRestart(session, tc.offset)
|
||||
if got != tc.want {
|
||||
t.Errorf("NeedsRestart(offset=%d) = %v, want %v (%s)", tc.offset, got, tc.want, tc.desc)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// TestNeedsRestart_EmptyCache tests behavior with empty cache
|
||||
func TestNeedsRestart_EmptyCache(t *testing.T) {
|
||||
bc := &BrokerClient{}
|
||||
|
||||
session := &BrokerSubscriberSession{
|
||||
Topic: "test-topic",
|
||||
Partition: 0,
|
||||
StartOffset: 100,
|
||||
Stream: &MockSubscribeStream{},
|
||||
Ctx: context.Background(),
|
||||
consumedRecords: nil, // Empty cache
|
||||
}
|
||||
|
||||
tests := []struct {
|
||||
offset int64
|
||||
want bool
|
||||
desc string
|
||||
}{
|
||||
{50, true, "Before current"},
|
||||
{100, false, "At current"},
|
||||
{150, false, "Small gap ahead"},
|
||||
{1200, true, "Large gap ahead"},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.desc, func(t *testing.T) {
|
||||
got := bc.NeedsRestart(session, tt.offset)
|
||||
if got != tt.want {
|
||||
t.Errorf("NeedsRestart(offset=%d) = %v, want %v (%s)", tt.offset, got, tt.want, tt.desc)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// TestNeedsRestart_ThreadSafety tests concurrent access
|
||||
func TestNeedsRestart_ThreadSafety(t *testing.T) {
|
||||
bc := &BrokerClient{}
|
||||
|
||||
session := &BrokerSubscriberSession{
|
||||
Topic: "test-topic",
|
||||
Partition: 0,
|
||||
StartOffset: 100,
|
||||
Stream: &MockSubscribeStream{},
|
||||
Ctx: context.Background(),
|
||||
}
|
||||
|
||||
// Run many concurrent checks
|
||||
done := make(chan bool)
|
||||
for i := 0; i < 100; i++ {
|
||||
go func(offset int64) {
|
||||
bc.NeedsRestart(session, offset)
|
||||
done <- true
|
||||
}(int64(i))
|
||||
}
|
||||
|
||||
// Wait for all to complete
|
||||
for i := 0; i < 100; i++ {
|
||||
<-done
|
||||
}
|
||||
|
||||
// Test passes if no panic/race condition
|
||||
}
|
||||
|
||||
// TestRestartSubscriber_StateManagement tests session state management
|
||||
func TestRestartSubscriber_StateManagement(t *testing.T) {
|
||||
oldStream := &MockSubscribeStream{}
|
||||
oldCtx, oldCancel := context.WithCancel(context.Background())
|
||||
|
||||
session := &BrokerSubscriberSession{
|
||||
Topic: "test-topic",
|
||||
Partition: 0,
|
||||
StartOffset: 100,
|
||||
Stream: oldStream,
|
||||
Ctx: oldCtx,
|
||||
Cancel: oldCancel,
|
||||
consumedRecords: []*SeaweedRecord{
|
||||
{Offset: 100, Key: []byte("key100"), Value: []byte("value100")},
|
||||
{Offset: 101, Key: []byte("key101"), Value: []byte("value101")},
|
||||
{Offset: 102, Key: []byte("key102"), Value: []byte("value102")},
|
||||
},
|
||||
nextOffsetToRead: 103,
|
||||
}
|
||||
|
||||
// Verify initial state
|
||||
if len(session.consumedRecords) != 3 {
|
||||
t.Errorf("Initial cache size = %d, want 3", len(session.consumedRecords))
|
||||
}
|
||||
if session.nextOffsetToRead != 103 {
|
||||
t.Errorf("Initial nextOffsetToRead = %d, want 103", session.nextOffsetToRead)
|
||||
}
|
||||
if session.StartOffset != 100 {
|
||||
t.Errorf("Initial StartOffset = %d, want 100", session.StartOffset)
|
||||
}
|
||||
|
||||
// Note: Full RestartSubscriber testing requires gRPC mocking
|
||||
// These tests verify the core state management and NeedsRestart logic
|
||||
}
|
||||
|
||||
// BenchmarkNeedsRestart_CacheHit benchmarks cache hit performance
|
||||
func BenchmarkNeedsRestart_CacheHit(b *testing.B) {
|
||||
bc := &BrokerClient{}
|
||||
|
||||
session := &BrokerSubscriberSession{
|
||||
Topic: "test-topic",
|
||||
Partition: 0,
|
||||
StartOffset: 1000,
|
||||
Stream: &MockSubscribeStream{},
|
||||
Ctx: context.Background(),
|
||||
consumedRecords: make([]*SeaweedRecord, 100),
|
||||
}
|
||||
|
||||
for i := 0; i < 100; i++ {
|
||||
session.consumedRecords[i] = &SeaweedRecord{Offset: int64(i)}
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
bc.NeedsRestart(session, 50) // Hit cache
|
||||
}
|
||||
}
|
||||
|
||||
// BenchmarkNeedsRestart_CacheMiss benchmarks cache miss performance
|
||||
func BenchmarkNeedsRestart_CacheMiss(b *testing.B) {
|
||||
bc := &BrokerClient{}
|
||||
|
||||
session := &BrokerSubscriberSession{
|
||||
Topic: "test-topic",
|
||||
Partition: 0,
|
||||
StartOffset: 1000,
|
||||
Stream: &MockSubscribeStream{},
|
||||
Ctx: context.Background(),
|
||||
consumedRecords: make([]*SeaweedRecord, 100),
|
||||
}
|
||||
|
||||
for i := 0; i < 100; i++ {
|
||||
session.consumedRecords[i] = &SeaweedRecord{Offset: int64(i)}
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
bc.NeedsRestart(session, 500) // Miss cache (within gap threshold)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user