SupremeA
SupremeA

Reputation: 1621

Rails Sidekiq ERROR: can't find object

I have several sidekiq workers in my rails 4 app and can't figure out why the processes are failing. I am passing the User_id to the worker as a string but it can't seem to find the user. But when I search the same id in my console it finds the user. What am i doing wrong? Here is my code.

Controller.rb

  def update
   @user = current_user
    if @user.bill.update_attributes(bill_params)
      RandomWorker.perform_async(@user.id.to_s)
      redirect_to users_dashboard_path, :notice => "Payment Informaton Updated"
    else
      ...  
    end
  end

Randomworker.rb

  def perform(user_id)
    user_id = user_id["$oid"] unless user_id.is_a?(String)
    user = User.find(user_id)
    user.process.update_report 
    user.process.save
  end

My error comes back as

RandomWorker  "575a..." Mongoid::Errors::DocumentNotFound: message: Document(s) not found for class User with id(s) 575a.... summary: When calling User.find with an id or array of ids, each parameter...

--EDIT--

My db config file is as shown:

development:
 adapter: sqlite3
 database: db/development.sqlite3
 pool: 5
 timeout: 5000

production:
 adapter: sqlite3
 database: db/production.sqlite3
 pool: 25
 timeout: 5000

And my mongoid.yml

development:
   # Configure available database clients. (required)
     clients:
   # Defines the default client. (required)
       default:
   # Defines the name of the default database that Mongoid can connect to.
   # (required).
         database: development_db
   # Provides the hosts the default client can connect to. Must be an array
   # of host:port pairs. (required)
         hosts:
            - localhost:27017
         options:

Upvotes: 2

Views: 1221

Answers (2)

SupremeA
SupremeA

Reputation: 1621

I found a solution. I had to put a monkeypatch in the sidekiq initalizer to treat the user.id as json. Apparently, mongoid struggles with this with sidekiq and although I struggled to find some documentation on it I stumbed across the answer in another unrelated question. Have to_json return a mongoid as a string

I added this in the initalizer and it seems to have fixed the issue

class BSON::ObjectId
  def as_json
    self.to_s
  end
end

Upvotes: 2

oreoluwa
oreoluwa

Reputation: 5633

I'd advise that you include the Sidekiq::Web to view the enqueued jobs on a web interface so you can see the parameters and possibly the failures triggered.

However, this is an error I also faced a while ago too, which quite frustrated me for a while because of the number of emails I received from my error notifier(Bugsnag).

I've not found the best solution yet, but I imagine that the database was being locked for reading or some records weren't committed before attempting to use them.

Sidekiq's documentation says in your model use, after_commit :perform_sidekiq_job, on: :create.

However, I've not really tried that because I found another approach, the flip side to my new approach is that my jobs are executed much later, at times about 10minutes later.

RandomWorker.perform_in(5.seconds, user_id)

This is less likely to fail with the Sidekiq::retry option.

Read more here

Upvotes: 1

Related Questions