From mboxrd@z Thu Jan 1 00:00:00 1970 Delivered-To: chneukirchen@gmail.com Received: by 10.52.76.196 with SMTP id m4csp78695vdw; Wed, 2 Oct 2013 16:10:21 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=dkim-signature:mime-version:x-gm-message-state:sender:from:to:cc :subject:date:message-id:x-original-sender :x-original-authentication-results:reply-to:precedence:mailing-list :list-id:list-post:list-help:list-archive:list-subscribe :list-unsubscribe:content-type; bh=6Sv/ZMmvb64XcmQjvmqq7A63W25dkFMJs2cx9kny9tI=; b=Uk9uiw9c9SWzpQFxIoKhXsTI6ETYvJ2McoQQ7YTcFi8w9e1cOO2VXqwgs2DB8Hay/3 y+rcvPrxBXp9QfzWD3ehN3HJSOD0K61hIF+QowRYHH2TeMpqvOPJFkdOHG0ExE50iXB5 KrhMiwyNJa6sEgkoFPEALx3VTZSql89nquKznyOvgwJ7DU7GqbHc5DIXw6KagAByfJkg pe3blnz9qlE+4n6t7o2oYl/AKQ/RMGKAL7bxjMc28+0jlzSYs03rrW9k2D7uC4lzKO9r D1wnpssQZCzoPbPXBwytnb9h7LgdT1/xIVNR/XIoIOZZaEv+mtHbiZi5CN5gjaNW7GLA Fr1w== Return-Path: Received-SPF: pass (google.com: domain of rack-devel+bncBC3LFG7AVEARBW6PWKJAKGQEYZP7NSY@googlegroups.com designates 10.50.102.97 as permitted sender) client-ip=10.50.102.97 Authentication-Results: mr.google.com; spf=pass (google.com: domain of rack-devel+bncBC3LFG7AVEARBW6PWKJAKGQEYZP7NSY@googlegroups.com designates 10.50.102.97 as permitted sender) smtp.mail=rack-devel+bncBC3LFG7AVEARBW6PWKJAKGQEYZP7NSY@googlegroups.com; dkim=pass header.i=@googlegroups.com X-Received: from mr.google.com ([10.50.102.97]) by 10.50.102.97 with SMTP id fn1mr2097092igb.16.1380755421267 (num_hops = 1); Wed, 02 Oct 2013 16:10:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20120806; h=mime-version:sender:from:to:cc:subject:date:message-id :x-original-sender:x-original-authentication-results:reply-to :precedence:mailing-list:list-id:list-post:list-help:list-archive :list-subscribe:list-unsubscribe:content-type; bh=6Sv/ZMmvb64XcmQjvmqq7A63W25dkFMJs2cx9kny9tI=; b=LY2lRteHaqu7F88H6wRIkViBq/WfoPM2PzCxFmGY1Pwete9qQ6papCVLpyUCO0QiCA A152pxNm7Q3ZPtNlDymPwi/mASInzdFtlnyTCoxboJ3lrhCuELDMo2rygj4M1WxHe9Lf ZIONFi0SU53A1Ki2MoKIj51+x+T9uoVzIW7cu8BKvyqvroTv2OhQkT3MHi6XQTWbFdYz S/pOc3p6ChtS+9bbBKKbSKxr4GK4UO89QA+EqFCPvPKHPATC+92o6WdoVvfbsaUVnhjG c5Jmie/iOJgIIJI42Pzlckhf1cj/0uaLo24QCmUNE6HM6iICahoI8d3RPbCcsTBl3RyJ Tx1g== X-Received: by 10.50.102.97 with SMTP id fn1mr258722igb.16.1380755421075; Wed, 02 Oct 2013 16:10:21 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: rack-devel@googlegroups.com Received: by 10.50.88.98 with SMTP id bf2ls1253195igb.15.gmail; Wed, 02 Oct 2013 16:10:19 -0700 (PDT) X-Received: by 10.66.160.36 with SMTP id xh4mr1332507pab.11.1380755419171; Wed, 02 Oct 2013 16:10:19 -0700 (PDT) Received: from mail-pb0-f46.google.com (mail-pb0-f46.google.com [209.85.160.46]) by gmr-mx.google.com with ESMTPS id ax8si587369pbd.0.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 02 Oct 2013 16:10:18 -0700 (PDT) Received-SPF: pass (google.com: domain of ruby@tmm1.net designates 209.85.160.46 as permitted sender) client-ip=209.85.160.46; Received: by mail-pb0-f46.google.com with SMTP id rq2so1581059pbb.33 for ; Wed, 02 Oct 2013 16:10:18 -0700 (PDT) X-Gm-Message-State: ALoCoQnauaGPGjj8LcMo+ko+//JqbSPwnZ1RTNymkVE1/6KhgKehLxMxIplMNLikSe/1Fpws1UhG X-Received: by 10.66.154.197 with SMTP id vq5mr5704427pab.155.1380755418819; Wed, 02 Oct 2013 16:10:18 -0700 (PDT) Received: from localhost.localdomain (GITHUB-INC.bar1.SanFrancisco1.Level3.net. [4.53.133.38]) by mx.google.com with ESMTPSA id hz10sm4198978pbc.36.1969.12.31.16.00.00 (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 02 Oct 2013 16:10:17 -0700 (PDT) Sender: rack-devel@googlegroups.com From: ruby@tmm1.net To: rack-devel@googlegroups.com Cc: Aman Gupta Subject: [RFC/PATCH] Add Rack::Builder#warmup method for app preloading. Date: Wed, 2 Oct 2013 16:10:07 -0700 Message-Id: <1380755407-40487-1-git-send-email-ruby@tmm1.net> X-Mailer: git-send-email 1.8.3.4 X-Original-Sender: ruby@tmm1.net X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of ruby@tmm1.net designates 209.85.160.46 as permitted sender) smtp.mail=ruby@tmm1.net Reply-To: rack-devel@googlegroups.com Precedence: list Mailing-list: list rack-devel@googlegroups.com; contact rack-devel+owners@googlegroups.com List-ID: X-Google-Group-Id: 486215384060 List-Post: , List-Help: , List-Archive: List-Subscribe: , List-Unsubscribe: , Content-Type: text/plain; charset=ISO-8859-1 From: Aman Gupta This new `warmup` method takes a block which is invoked after the app is built. The block can be used to make mock requests that ensure all application dependencies are loaded before the app starts serving traffic. With complex frameworks like Rails, many dependencies are auto-loaded and data like mime-type and i18n is not loaded into memory by default. This often means the first few requests handled by an application are quite slow. With this patch, config.ru can simply make requests via warmup to exercise the app before it is used: $ tail -4 config.ru warmup do |app| client = Rack::MockRequest.new(app) client.get('/') end --- lib/rack/builder.rb | 19 +++++++++++++++++-- test/spec_builder.rb | 11 +++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/rack/builder.rb b/lib/rack/builder.rb index 66dc7bd..fa3a1ea 100644 --- a/lib/rack/builder.rb +++ b/lib/rack/builder.rb @@ -51,7 +51,7 @@ module Rack end def initialize(default_app = nil,&block) - @use, @map, @run = [], nil, default_app + @use, @map, @run, @warmup = [], nil, default_app, nil instance_eval(&block) if block_given? end @@ -104,6 +104,19 @@ module Rack @run = app end + # Takes a lambda or block that is used to warm-up the application. + # + # warmup do |app| + # client = Rack::MockRequest.new(app) + # client.get('/') + # end + # + # use SomeMiddleware + # run MyApp + def warmup(prc=nil, &block) + @warmup = prc || block + end + # Creates a route within the application. # # Rack::Builder.app do @@ -131,7 +144,9 @@ module Rack def to_app app = @map ? generate_map(@run, @map) : @run fail "missing run or map statement" unless app - @use.reverse.inject(app) { |a,e| e[a] } + app = @use.reverse.inject(app) { |a,e| e[a] } + @warmup.call(app) if @warmup + app end def call(env) diff --git a/test/spec_builder.rb b/test/spec_builder.rb index 0774f59..20ea668 100644 --- a/test/spec_builder.rb +++ b/test/spec_builder.rb @@ -130,6 +130,17 @@ describe Rack::Builder do Rack::MockRequest.new(app).get("/foo").should.be.server_error end + it "yields the generated app to a block for warmup" do + warmed_up_app = nil + + app = Rack::Builder.new do + warmup { |a| warmed_up_app = a } + run lambda { |env| [200, {}, []] } + end.to_app + + warmed_up_app.should.equal app + end + should "initialize apps once" do app = builder do class AppClass -- 1.8.3.4 -- --- You received this message because you are subscribed to the Google Groups "Rack Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to rack-devel+unsubscribe@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.