Federico Mariani created CAMEL-24156:
----------------------------------------
Summary: camel-aws2 - Umbrella: high-severity findings from July
2026 review (S3, SQS, SNS, Kinesis, DDB)
Key: CAMEL-24156
URL: https://issues.apache.org/jira/browse/CAMEL-24156
Project: Camel
Issue Type: Bug
Components: camel-aws
Reporter: Federico Mariani
Attachments: camel-aws-review-2026-07.md
Umbrella for the high-severity findings of a deep code review of camel-aws2-s3,
-sqs, -sns, -kinesis (incl. firehose) and -ddb (incl. ddbstream) on main
(4.22.0-SNAPSHOT). The full findings document (with failure scenarios and
suggested fixes per item) is attached. The two critical findings are tracked
separately with failing reproducer tests attached: the S3 streaming truncation
and the DDB Streams resharding data loss.
Individual findings can be split out into their own issues as they are picked
up.
*camel-aws2-s3*
# {{AWS2S3Producer:645}} — {{operation=getObject&ignoreBody=true}} leaks the
ResponseInputStream; connection pool exhausted after ~50 exchanges (CAMEL-21116
follow-up).
# {{AWS2S3Producer:222-305}} — {{processMultiPart}} computes the dynamic bucket
name ({{CamelAwsS3OverrideBucketName}} / simple expressions) but builds all
four multipart requests with the raw configured bucket; behavior silently
diverges by payload size.
# {{AWS2S3Producer:187-217}} — FileInputStream opened for File bodies is never
closed on the {{contentLength < partSize}} shortcut; one fd leaked per small
file in multiPartUpload mode.
*camel-aws2-sqs*
# {{Sqs2Producer:270-300}} — per-message {{DelaySeconds}} is applied even when
{{delayQueue=true}}; on FIFO queues every send fails with
InvalidParameterValue, on standard queues the queue-level option is defeated.
*camel-aws2-sns*
# {{Sns2Endpoint:147-150}} — auto-created FIFO topics never get
{{ContentBasedDeduplication}}, so
{{messageDeduplicationIdStrategy=useContentBasedDeduplication}} makes every
publish fail (SQS twin handles this correctly).
*camel-aws2-kinesis*
# {{Kinesis2Configuration:71}} — {{shardClosed}} default is only declared in
the annotation; the field is null and {{handleClosedShard}} NPEs on the first
shard rotation with default config.
# {{Kinesis2Consumer:176-297}} — expired shard iterators are never invalidated
(no ExpiredIteratorException handling in the module); any >5-minute gap stalls
the consumer permanently.
# {{KinesisResumeAction:62-67}} + {{KinesisResumeStrategy:60-63}} — resume
support broken for multi-shard streams: evalEntry overwrites the request with
every cache entry, KinesisOffset values hit a String cast (ClassCastException),
and the single registry action is mutated concurrently from parallelStream.
# {{KinesisConnection:38-64}} + {{Kinesis2Endpoint:80-93}} — the component-wide
connection caches the first endpoint's client for all endpoints (second
endpoint's region/credentials silently ignored) and {{doStop}} closes the
shared client without resetting the cache.
# {{KclKinesis2Consumer:193-232}} — KCL consumer never checkpoints during
processing, swallows all processing Throwables (not even logged with stack
trace), then checkpoints unconditionally at shutdown — data loss on failure,
mass reprocessing on crash.
# {{KclKinesis2Consumer:94-133}} — session-credentials branch is unreachable
({{accessKey && secretKey && sessionToken}} tested after {{accessKey &&
secretKey}}); KCL DynamoDB/CloudWatch clients fail with STS temporary
credentials.
*camel-aws2-ddb (ddbstream)*
# {{Ddb2StreamConsumer:65,93}} + {{ShardIteratorHandler:77-86}} — internal
iterator map returned by reference and structurally modified during poll
iteration -> ConcurrentModificationException whenever a shard retires while >=2
shards are tracked.
# {{ShardIteratorHandler:55-57}} — DescribeStream pagination
({{lastEvaluatedShardId}}) ignored; streams with >100 shards silently lose
partitions.
# {{ShardIteratorHandler:88-92}} — expired-iterator recovery sends
{{AFTER_SEQUENCE_NUMBER}} with null sequence when no record was seen; consumer
permanently stuck failing.
*camel-aws2-ddb (transformer)*
# {{Ddb2JsonDataTypeTransformer:197-247}} — Long/BigInteger/BigDecimal values
(e.g. epoch millis) and numeric arrays are stored as DynamoDB String/StringSet
types instead of N/NS (CAMEL-22038 only fixed scalar Double).
_This issue was researched and filed by Claude Code (AI) on behalf of Federico
Mariani (fmariani). Full findings document from the review is attached to the
umbrella issues._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)