3021: Replace more "render json:..." with faster Oj.
authorTom Clegg <tom@curoverse.com>
Tue, 20 Jan 2015 05:53:05 +0000 (00:53 -0500)
committerTom Clegg <tom@curoverse.com>
Tue, 20 Jan 2015 05:53:05 +0000 (00:53 -0500)
services/api/app/controllers/application_controller.rb
services/api/app/controllers/arvados/v1/collections_controller.rb
services/api/app/controllers/arvados/v1/groups_controller.rb
services/api/app/controllers/arvados/v1/keep_disks_controller.rb
services/api/app/controllers/arvados/v1/nodes_controller.rb
services/api/app/controllers/arvados/v1/repositories_controller.rb
services/api/app/controllers/arvados/v1/schema_controller.rb
services/api/app/controllers/arvados/v1/users_controller.rb
services/api/app/controllers/arvados/v1/virtual_machines_controller.rb
services/api/app/controllers/database_controller.rb

index a771042e52cb7f4a6af35c8256eb10418da855ca..a65bf3e328697da220d111c8be36460de82220bd 100644 (file)
@@ -77,9 +77,7 @@ class ApplicationController < ActionController::Base
   end
 
   def show
-    render(text: Oj.dump(@object.as_api_response(nil, select: @select),
-                         mode: :compat).html_safe,
-           content_type: 'application/json')
+    send_json @object.as_api_response(nil, select: @select)
   end
 
   def create
@@ -181,7 +179,16 @@ class ApplicationController < ActionController::Base
     err[:error_token] = [Time.now.utc.to_i, "%08x" % rand(16 ** 8)].join("+")
     status = err.delete(:status) || 422
     logger.error "Error #{err[:error_token]}: #{status}"
-    render json: err, status: status
+    send_json err, status: status
+  end
+
+  def send_json response, opts={}
+    # The obvious render(json: ...) forces a slow JSON encoder. See
+    # #3021 and commit logs. Might be fixed in Rails 4.1.
+    render({
+             text: Oj.dump(response, mode: :compat).html_safe,
+             content_type: 'application/json'
+           }.merge opts)
   end
 
   def find_objects_for_index
@@ -443,8 +450,7 @@ class ApplicationController < ActionController::Base
         except(:limit).except(:offset).
         count(:id, distinct: true)
     end
-    render(text: Oj.dump(@object_list, mode: :compat).html_safe,
-           content_type: 'application/json')
+    send_json @object_list
   end
 
   def remote_ip
index 54f09828f5ea29d9d17c09dc6ef7f8c85831ceaa..922fa6aa39b1f3b2421fef6536332ab10a7afa6f 100644 (file)
@@ -29,7 +29,7 @@ class Arvados::V1::CollectionsController < ApplicationController
     if @object.is_a? Collection
       super
     else
-      render json: @object
+      send_json @object
     end
   end
 
@@ -169,14 +169,14 @@ class Arvados::V1::CollectionsController < ApplicationController
     visited = {}
     search_edges(visited, @object[:portable_data_hash], :search_up)
     search_edges(visited, @object[:uuid], :search_up)
-    render json: visited
+    send_json visited
   end
 
   def used_by
     visited = {}
     search_edges(visited, @object[:uuid], :search_down)
     search_edges(visited, @object[:portable_data_hash], :search_down)
-    render json: visited
+    send_json visited
   end
 
   protected
index b88f254c46a029716d60fefa4d74bb9e6f92085d..c82ffb49cd7af8e4b7fe2afac128474718de71c8 100644 (file)
@@ -57,7 +57,7 @@ class Arvados::V1::GroupsController < ApplicationController
       :items_available => @items_available,
       :items => @objects.as_api_response(nil)
     }
-    render json: @object_list
+    send_json @object_list
   end
 
   protected
index e8ccf2386c41343fc2b915ed86b7832d2eae94ac..2db2a60452b27cb2ad6d8c34a4fbde98707d432a 100644 (file)
@@ -22,7 +22,7 @@ class Arvados::V1::KeepDisksController < ApplicationController
       # Render the :superuser view (i.e., include the ping_secret) even
       # if !current_user.is_admin. This is safe because @object.ping's
       # success implies the ping_secret was already known by the client.
-      render json: @object.as_api_response(:superuser)
+      send_json @object.as_api_response(:superuser)
     end
   end
 
index efee982e74bcf7d62a8baac4561ee0da399dbd3e..44197a054feba0176091b6e7e6aabcb640b84f11 100644 (file)
@@ -30,7 +30,7 @@ class Arvados::V1::NodesController < ApplicationController
       end
       @object.ping(ping_data)
       if @object.info['ping_secret'] == params[:ping_secret]
-        render json: @object.as_api_response(:superuser)
+        send_json @object.as_api_response(:superuser)
       else
         raise "Invalid ping_secret after ping"
       end
index 0452c523bf3a21348264350c8f9deba96bfefedd..b5123d97e3017af8b9c5fbcbf4e8d98a81a91436 100644 (file)
@@ -71,10 +71,8 @@ class Arvados::V1::RepositoriesController < ApplicationController
         end
       end
     end
-    render json: {
-      kind: 'arvados#RepositoryPermissionSnapshot',
-      repositories: @repo_info.values,
-      user_keys: @user_aks
-    }
+    send_json(kind: 'arvados#RepositoryPermissionSnapshot',
+              repositories: @repo_info.values,
+              user_keys: @user_aks)
   end
 end
index 2f7af3c4287d74587b3db7a7fd65551e239afc7f..bc5a20fb0db8f0a392558af563529904eeb86fd1 100644 (file)
@@ -391,6 +391,6 @@ class Arvados::V1::SchemaController < ApplicationController
       end
       discovery
     end
-    render json: discovery
+    send_json discovery
   end
 end
index 50ee3b0547a08c3c09b31dccb45638d9b3f0f1d4..224dd291561ebf02496e13136a1603347d7fa7e9 100644 (file)
@@ -104,7 +104,7 @@ class Arvados::V1::UsersController < ApplicationController
       UserNotifier.account_is_setup(@object).deliver
     end
 
-    render json: { kind: "arvados#HashList", items: @response.as_api_response(nil) }
+    send_json kind: "arvados#HashList", items: @response.as_api_response(nil)
   end
 
   # delete user agreements, vm, repository, login links; set state to inactive
index e17634812122ceed2f901286891a6393410ab292..35e5e4257afa5745e1e5a36337a284da2a141ccd 100644 (file)
@@ -38,6 +38,6 @@ class Arvados::V1::VirtualMachinesController < ApplicationController
         end
       end
     end
-    render json: { kind: "arvados#HashList", items: @response }
+    send_json kind: "arvados#HashList", items: @response
   end
 end
index 04c0e79d6cb940545d530ca7e57fe5b2da791e51..64818da375ecc4fb0277a10be0f3f7e6b552a2e8 100644 (file)
@@ -68,6 +68,6 @@ class DatabaseController < ApplicationController
     end
 
     # Done.
-    render json: {success: true}
+    send_json success: true
   end
 end