cloudinary / cloudinary/cloudinary_gem

BlobKey, MirrorService and Sidekiq 8 are incompatible

Abierto
#573 3 comentarios 0 reacciones 1 asignado Asignado a @const-cloudinary Ver en GitHub
Lenguaje dominante
Ruby
Estrellas
420
Forks
285
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

# Bug report for Cloudinary Ruby SDK

## Describe the bug in a sentence or two.
When using the Cloudinary ActiveStorage service in a mirror with S3 and Sidekiq 8 as a job queue, I am getting errors of the form

> Job arguments to ActiveStorage::MirrorJob must be native JSON types, but "1xfiunhqeexf8h3pkdxucnby5eou" is a ActiveStorage::BlobKey

## Issue Type (Can be multiple)
- [ ] Build - Cannot install or import the SDK
- [ ] Performance - Performance issues
- [X] Behaviour - Functions are not working as expected (such as generate URL)
- [ ] Documentation - Inconsistency between the docs and behaviour
- [ ] Other (Specify)

## Steps to reproduce
- Use Sidekiq 8 with strict_args enabled (default)
- Define an S3 service and a Cloudinary Service in storage.yml
- Define a mirror as
```
mirror:
service: Mirror
primary: amazon
mirrors:
- cloudinary
```
- Attempt to upload a file
- ActiveStorage will attempt to enqueue ActiveStorage::MirrorJob which takes `key` as an arg. But because the Cloudinary gem is [redefining](https://github.com/cloudinary/cloudinary_gem/blob/master/lib/active_storage/service/cloudinary_service.rb#L11) the key as a `BlobKey` we get the above error from Sidekiq because BlobKey is not a native JSON type.

## Error screenshots or Stack Trace (if applicable)
lib/active_storage/service/mirror_service.rb:55

A minimal repro can be achieved with the following:

```
> s = ActiveStorage::Service::MirrorService.new(primary: nil, mirrors: [])
=> #
> k = ActiveStorage::BlobKey.new(key: "test")
=> "test"
> s.mirror_later(k, checksum: nil)
INFO 2025-05-15T14:47:39.511Z pid=955 tid=25v: Sidekiq 8.0.3 connecting to Redis with options {size: 10, pool_name: "internal", url: "redis://redis:6379/0"}
Failed enqueuing ActiveStorage::MirrorJob to Sidekiq(default): ArgumentError (Job arguments to ActiveStorage::MirrorJob must be native JSON types, but "test" is a ActiveStorage::BlobKey.
See https://github.com/sidekiq/sidekiq/wiki/Best-Practices
To disable this error, add `Sidekiq.strict_args!(false)` to your initializer.
```

This monkey patch to ActiveStorage can address the issue, but I dont know whether rails would want this in their core code when the expect the key to be a string anyway

```
module ActiveStorage
class Service::MirrorService < Service
def mirror_later(key, checksum:) # :nodoc:
ActiveStorage::MirrorJob.perform_later key.to_s, checksum: checksum
end
end
end
```

## Operating System
- [X] Linux
- [ ] Windows
- [ ] macOS
- [ ] All

## Environment and Libraries (fill in the version numbers)
- Cloudinary Ruby SDK version - 2.3.0
- Ruby Version - 3.4.3
- Rails Version - 7.2.2.1
- Other Libraries - ActiveStorage 7.2.2.1

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.