carrierwave-postgresql icon indicating copy to clipboard operation
carrierwave-postgresql copied to clipboard

lo_unlink failed

Open yevhene opened this issue 9 years ago • 9 comments

After I delete model from DB, carrierwave-postgresql tries to call lo_unlink but there is no object with this oid in db already.

I am usin ActiveAdmin. It can be related.

PG::Error - lo_unlink failed:
  carrierwave-postgresql (0.1.5) lib/carrierwave/storage/postgresql_lo.rb:34:in `delete'
  carrierwave (0.10.0) lib/carrierwave/uploader/remove.rb:15:in `block in remove!'
  carrierwave (0.10.0) lib/carrierwave/uploader/callbacks.rb:17:in `with_callbacks'
  carrierwave (0.10.0) lib/carrierwave/uploader/remove.rb:14:in `remove!'
  carrierwave (0.10.0) lib/carrierwave/uploader/versions.rb:289:in `block in remove_versions!'
  carrierwave (0.10.0) lib/carrierwave/uploader/versions.rb:289:in `remove_versions!'
  carrierwave (0.10.0) lib/carrierwave/uploader/callbacks.rb:18:in `block in with_callbacks'
  carrierwave (0.10.0) lib/carrierwave/uploader/callbacks.rb:18:in `with_callbacks'
  carrierwave (0.10.0) lib/carrierwave/uploader/remove.rb:14:in `remove!'
  carrierwave (0.10.0) lib/carrierwave/mount.rb:392:in `remove!'
  carrierwave (0.10.0) lib/carrierwave/mount.rb:195:in `remove_image!'
  carrierwave (0.10.0) lib/carrierwave/orm/activerecord.rb:49:in `remove_image!'
  activesupport (4.2.4) lib/active_support/callbacks.rb:432:in `block in make_lambda'
  activesupport (4.2.4) lib/active_support/callbacks.rb:253:in `block in conditional'
  activesupport (4.2.4) lib/active_support/callbacks.rb:506:in `block in call'
  activesupport (4.2.4) lib/active_support/callbacks.rb:506:in `call'
  activesupport (4.2.4) lib/active_support/callbacks.rb:92:in `__run_callbacks__'
  activesupport (4.2.4) lib/active_support/callbacks.rb:778:in `_run_commit_callbacks'
  activerecord (4.2.4) lib/active_record/transactions.rb:314:in `committed!'
  activerecord (4.2.4) lib/active_record/connection_adapters/abstract/transaction.rb:89:in `commit_records'
  activerecord (4.2.4) lib/active_record/connection_adapters/abstract/transaction.rb:153:in `commit'
  activerecord (4.2.4) lib/active_record/connection_adapters/abstract/transaction.rb:175:in `commit_transaction'
  activerecord (4.2.4) lib/active_record/connection_adapters/abstract/transaction.rb:194:in `within_new_transaction'
  activerecord (4.2.4) lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `transaction'
  activerecord (4.2.4) lib/active_record/transactions.rb:220:in `transaction'
  activerecord (4.2.4) lib/active_record/transactions.rb:348:in `with_transaction_returning_status'
  activerecord (4.2.4) lib/active_record/transactions.rb:281:in `destroy'
   () home/yevhene/.rvm/gems/ruby-2.2.3@footstock/bundler/gems/activeadmin-06bf79c58216/lib/active_admin/resource_controller/data_access.rb:190:in `block in destroy_resource'
  activesupport (4.2.4) lib/active_support/core_ext/object/try.rb:77:in `try!'
  activesupport (4.2.4) lib/active_support/core_ext/object/try.rb:63:in `try'
   () home/yevhene/.rvm/gems/ruby-2.2.3@footstock/bundler/gems/activeadmin-06bf79c58216/lib/active_admin/callbacks.rb:79:in `block (2 levels) in define_active_admin_callbacks'
   () home/yevhene/.rvm/gems/ruby-2.2.3@footstock/bundler/gems/activeadmin-06bf79c58216/lib/active_admin/resource_controller/data_access.rb:189:in `destroy_resource'
  inherited_resources (1.6.0) lib/inherited_resources/actions.rb:58:in `destroy'
  actionpack (4.2.4) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
  actionpack (4.2.4) lib/abstract_controller/base.rb:198:in `process_action'
  actionpack (4.2.4) lib/action_controller/metal/rendering.rb:10:in `process_action'
  actionpack (4.2.4) lib/abstract_controller/callbacks.rb:20:in `block in process_action'
  activesupport (4.2.4) lib/active_support/callbacks.rb:117:in `call'
  activesupport (4.2.4) lib/active_support/callbacks.rb:555:in `block (2 levels) in compile'
  activesupport (4.2.4) lib/active_support/callbacks.rb:505:in `call'
  activesupport (4.2.4) lib/active_support/callbacks.rb:92:in `__run_callbacks__'
  activesupport (4.2.4) lib/active_support/callbacks.rb:778:in `_run_process_action_callbacks'
  activesupport (4.2.4) lib/active_support/callbacks.rb:81:in `run_callbacks'
  actionpack (4.2.4) lib/abstract_controller/callbacks.rb:19:in `process_action'
  actionpack (4.2.4) lib/action_controller/metal/rescue.rb:29:in `process_action'
  actionpack (4.2.4) lib/action_controller/metal/instrumentation.rb:32:in `block in process_action'
  activesupport (4.2.4) lib/active_support/notifications.rb:164:in `block in instrument'
  activesupport (4.2.4) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
  activesupport (4.2.4) lib/active_support/notifications.rb:164:in `instrument'
  actionpack (4.2.4) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
  actionpack (4.2.4) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
  activerecord (4.2.4) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
  actionpack (4.2.4) lib/abstract_controller/base.rb:137:in `process'
  actionview (4.2.4) lib/action_view/rendering.rb:30:in `process'
  actionpack (4.2.4) lib/action_controller/metal.rb:196:in `dispatch'
  actionpack (4.2.4) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
  actionpack (4.2.4) lib/action_controller/metal.rb:237:in `block in action'
  actionpack (4.2.4) lib/action_dispatch/routing/route_set.rb:76:in `dispatch'
  actionpack (4.2.4) lib/action_dispatch/routing/route_set.rb:45:in `serve'
  actionpack (4.2.4) lib/action_dispatch/journey/router.rb:43:in `block in serve'
  actionpack (4.2.4) lib/action_dispatch/journey/router.rb:30:in `serve'
  actionpack (4.2.4) lib/action_dispatch/routing/route_set.rb:821:in `call'
  bullet (4.14.7) lib/bullet/rack.rb:10:in `call'
  warden (1.2.3) lib/warden/manager.rb:35:in `block in call'
  warden (1.2.3) lib/warden/manager.rb:34:in `call'
  rack (1.6.4) lib/rack/etag.rb:24:in `call'
  rack (1.6.4) lib/rack/conditionalget.rb:38:in `call'
  rack (1.6.4) lib/rack/head.rb:13:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/flash.rb:260:in `call'
  rack (1.6.4) lib/rack/session/abstract/id.rb:225:in `context'
  rack (1.6.4) lib/rack/session/abstract/id.rb:220:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/cookies.rb:560:in `call'
  activerecord (4.2.4) lib/active_record/query_cache.rb:36:in `call'
  activerecord (4.2.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:653:in `call'
  activerecord (4.2.4) lib/active_record/migration.rb:377:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
  activesupport (4.2.4) lib/active_support/callbacks.rb:88:in `__run_callbacks__'
  activesupport (4.2.4) lib/active_support/callbacks.rb:778:in `_run_call_callbacks'
  activesupport (4.2.4) lib/active_support/callbacks.rb:81:in `run_callbacks'
  actionpack (4.2.4) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/reloader.rb:73:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/remote_ip.rb:78:in `call'
  better_errors (2.1.1) lib/better_errors/middleware.rb:84:in `protected_app_call'
  better_errors (2.1.1) lib/better_errors/middleware.rb:79:in `better_errors_call'
  better_errors (2.1.1) lib/better_errors/middleware.rb:57:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.2.4) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.2.4) lib/rails/rack/logger.rb:20:in `block in call'
  activesupport (4.2.4) lib/active_support/tagged_logging.rb:68:in `block in tagged'
  activesupport (4.2.4) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.2.4) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.2.4) lib/rails/rack/logger.rb:20:in `call'
  quiet_assets (1.1.0) lib/quiet_assets.rb:27:in `call_with_quiet_assets'
  actionpack (4.2.4) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.6.4) lib/rack/methodoverride.rb:22:in `call'
  rack (1.6.4) lib/rack/runtime.rb:18:in `call'
  activesupport (4.2.4) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
  rack (1.6.4) lib/rack/lock.rb:17:in `call'
  actionpack (4.2.4) lib/action_dispatch/middleware/static.rb:116:in `call'
  rack (1.6.4) lib/rack/sendfile.rb:113:in `call'
  railties (4.2.4) lib/rails/engine.rb:518:in `call'
  railties (4.2.4) lib/rails/application.rb:165:in `call'
  rack (1.6.4) lib/rack/content_length.rb:15:in `call'
  thin (1.6.4) lib/thin/connection.rb:86:in `block in pre_process'
  thin (1.6.4) lib/thin/connection.rb:84:in `pre_process'
  thin (1.6.4) lib/thin/connection.rb:53:in `process'
  thin (1.6.4) lib/thin/connection.rb:39:in `receive_data'
  eventmachine (1.0.8) lib/eventmachine.rb:193:in `run'
  thin (1.6.4) lib/thin/backends/base.rb:73:in `start'
  thin (1.6.4) lib/thin/server.rb:162:in `start'
  rack (1.6.4) lib/rack/handler/thin.rb:19:in `run'
  rack (1.6.4) lib/rack/server.rb:286:in `start'
  railties (4.2.4) lib/rails/commands/server.rb:80:in `start'
  railties (4.2.4) lib/rails/commands/commands_tasks.rb:80:in `block in server'
  railties (4.2.4) lib/rails/commands/commands_tasks.rb:75:in `server'
  railties (4.2.4) lib/rails/commands/commands_tasks.rb:39:in `run_command!'
  railties (4.2.4) lib/rails/commands.rb:17:in `<top (required)>'
  bin/rails:8:in `<top (required)>'
  spring (1.4.0) lib/spring/client/rails.rb:28:in `call'
  spring (1.4.0) lib/spring/client/command.rb:7:in `call'
  spring (1.4.0) lib/spring/client.rb:28:in `run'
  spring (1.4.0) bin/spring:49:in `<top (required)>'
  spring (1.4.0) lib/spring/binstub.rb:11:in `<top (required)>'
  /home/yevhene/.rvm/rubies/ruby-2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
  bin/spring:13:in `<top (required)>'
  bin/rails:3:in `<main>'
$ tail -f /var/log/postgresql/postgresql-9.4-main.log
2015-10-10 14:39:59 EEST [16842-9] postgres@footstock_develop ERROR:  large object 1179618 does not exist

yevhene avatar Oct 10 '15 11:10 yevhene

Did you expect the error to be treated in a different way? Or the problem is that this is happening all deletes? If is the later, are you sure the large objects are there before the dele command?

diogob avatar Oct 10 '15 14:10 diogob

This is happening all deletes. LO is accessible before destroy.

yevhene avatar Oct 10 '15 14:10 yevhene

I'll look into it. If you could send some code for a failing spec that would be very helpful :D

diogob avatar Oct 13 '15 13:10 diogob

Is there any update in this matter? I am facing the same problem.

piotrpawlik avatar Dec 15 '15 12:12 piotrpawlik

@ppfp no, sorry. I am moved to simple file storage. (S3 - is alternative).

yevhene avatar Dec 15 '15 13:12 yevhene

@ppfp I'm not currently using this code, but if someone provides a failing spec I'd be glad to fix it.

diogob avatar Dec 15 '15 14:12 diogob

I bypassed the issue by first assigning model instance oid to nil, then saving, then running vacuum_lo then destroying. I do not know how expensive the vacuum_lo operation is, but I think it is fine for my use-case.

sohrabtowfighi avatar Aug 02 '16 22:08 sohrabtowfighi

Also had this issue, I found that lo_unlink triggered two times, at first in after_save callback, and second inafter_commit callback => so oid is not present at the last call and it fails to delete object.

shtirlic avatar Oct 02 '17 13:10 shtirlic

Has this issue been fixed? When I try to use model.destroy_all, I receive PG::Error: lo_unlink failed. How can I avoid this error in both cases of removing one object and destroying all objects that relate to a particular model instance?

RailsCod3rFuture avatar Sep 11 '18 18:09 RailsCod3rFuture