Also the preserve the session, but cannot open the DrbConnection anymore. Why?
Looking at https://github.com/dcadenas/rubydeps to generate class diagrams to more easily compare old and new sbsm versions.
Did not find a library that produces a nice dependency, that I could minimize to exctract the important classes.
Resuming the problem, after my changes I cannot find anymore the drb. With the currently pushed branches rack of sbsm I start in two session bundle exec bin/steinwies
and bundle exec rackup
. Then I visit http://localhost:8004 and with the help of pry I get
bundle exec rackup Passing app Steinwies::App @app is NilClass SBSM::Session.new sbsm-persistent-cookie-id Steinwies::App /home/niklaus/git/sbsm/lib/sbsm/session.rb 300: logout @active_state now Steinwies::HomeState [2016-10-31 10:10:05] INFO WEBrick 1.3.1 [2016-10-31 10:10:05] INFO ruby 2.3.1 (2016-04-26) [x86_64-linux] [2016-10-31 10:10:05] INFO WEBrick::HTTPServer#start: pid=4049 port=8004 found session #<Rack::Session::Abstract::SessionHash:0x000000025ccce8> @session_handler is_? Steinwies::Session From: /home/niklaus/git/sbsm/lib/sbsm/app.rb @ line 114 SBSM::App#call: 109: 110: session = Rack::Session::Abstract::SessionHash.find(@sbsm.request) 111: puts "found session #{session} @session_handler is_? #{@session_handler.class}" 112: @@counter += 1 113: require 'pry'; binding.pry if @@counter <= 3 => 114: response = Rack::Response.new 115: response = @sbsm.process(self, @session_handler, @server_uri) 116: response.set_cookie(COOKIE_ID, {:value => @sbsm.request.cookies[COOKIE_ID], :path => "/", :expires => Time.now+24*60*60}) 117: response.set_cookie('@@counter', {:value => @@counter, :path => "/", :expires => Time.now+24*60*60}) 118: response.set_cookie('saved_path', {:value => @sbsm.request.path, :path => "/", :expires => Time.now+24*60*60}) 119: response.set_cookie('saved_session', {:value => @session_handler, :path => "/", :expires => Time.now+24*60*60}) [1] pry(#<Steinwies::AppWebrick>)> continue @proxy is NilClass From: /home/niklaus/git/sbsm/lib/sbsm/request.rb @ line 213 SBSM::Request#drb_process: 208: if false 209: object = Steinwies::Session.new(SBSM::App::COOKIE_ID, app, Steinwies::Validator.new) 210: @proxy = DRbObject.new(object, @request.session[:proxy].server_uri.to_s) # worked 211: end 212: binding.pry => 213: @proxy = DRbObject.new(session, server_uri) 214: require 'pry'; binding.pry unless @proxy.is_a?(DRb::DRbObject) 215: res1 = @proxy.drb_process(self) 216: res = @proxy.drb_process(self) 217: end 218: html = @response.write(res) [1] pry(#<SBSM::Request>)> continue DRb::DRbServerNotFound: DRb::DRbServerNotFound /usr/local/lib/ruby/2.3.0/drb/drb.rb:1718:in `current_server' /usr/local/lib/ruby/2.3.0/drb/drb.rb:1787:in `to_id' /usr/local/lib/ruby/2.3.0/drb/drb.rb:1103:in `initialize' /home/niklaus/git/sbsm/lib/sbsm/request.rb:213:in `new' /home/niklaus/git/sbsm/lib/sbsm/request.rb:213:in `drb_process' /home/niklaus/git/sbsm/lib/sbsm/request.rb:100:in `process' /home/niklaus/git/sbsm/lib/sbsm/app.rb:115:in `call' /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/lint.rb:49:in `_call' /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/lint.rb:37:in `call' /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/show_exceptions.rb:23:in `call' /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/session/abstract/id.rb:222:in `context' /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/session/abstract/id.rb:216:in `call' /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/handler/webrick.rb:86:in `service' /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' /usr/local/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread' ::1 - - [31/Oct/2016:10:10:26 CET] "GET / HTTP/1.1" 500 55417 - -> /
The local variable server_uri is correct #<URI::Generic druby://localhost:10001>
.
Zeno pointed me to https://gist.github.com/kuboon/724834954d3345798054, which seems to have solved a very similar problem. Must analys what the Rack::RewindableInput is and how the CGIHandler in the above example works.
I think it might be a good idea to test steinwies/sbsm by creating a test, where we increment the counter in the remote DRbServer. This might be also part of the missing test-app for completing the SBSM unit tests.
Reading http://www.anchor.com.au/hosting/dedicated/Running-Rails-2.3-Using-CGI-with-Rack which gives some explanation of the differences between CGI (as done via mod_ruby) and the Rack/Webrick approach. But shouldn't we get rid of the CGI completely? But how?
I think I can safely remove the file lib/cgi/drb_session.rb as it not used anywhere.
Started working on steinwies.ch/bin/simple, which should be a very simply example. It will increment a counter and display the requested path (may be later on also the cookie).
Created simple_config.ru, bin/simple and src/util/simple_app.rb. Now bin/simple and rackup simple_config.ru, but I do not see yet a call into the Drb-Process launched by bin/simple. This was expected. Pushed commit Added simple-app to test for DRb. Cookies/DRb not recognized
Now first adding preserving of session, then connecting to the DrbProcess. Done with commit Simple example with a working DRb and session.
Now the whole class structure is quite different. The DRbServer only works because it is no longer derived from the simple delegator. Is this a disadvantage? Or was it derived to avoid memory leaks present in Ruby and its classes around 2005 when the gem was developed?
When looking at the output bin/simple I can easily trace the two sesssion (one from chromium, the other one with firefox), where I visited a few place:
bundle exec bin/simple Starting druby://localhost:18999 simple_app.rb:50 DRbServer.new simple_app.rb:55 process #<Rack::Request:0x00000002a37d50> path: /test6799 id: 0.9403210530719527 simple_app.rb:55 process #<Rack::Request:0x000000029e5f00> path: /new38 id: simple_app.rb:55 process #<Rack::Request:0x0000000278d708> path: /new399 id: 0.117203343869001 simple_app.rb:55 process #<Rack::Request:0x000000026ca848> path: /new400 id: 0.117203343869001 simple_app.rb:55 process #<Rack::Request:0x0000000262b5b8> path: /test6 id: 0.9403210530719527
The output of rackup simple_config.ru show the few parts I passed through my code
bundle exec rackup simple_config.ru simple_app.rb:50 DRbServer.new simple_app.rb:50 DRbServer.new simple_app.rb:194 initialize @app is now #<Simple:0x00000002b05548 @sessions={}, @system=nil> [2016-10-31 15:21:28] INFO WEBrick 1.3.1 [2016-10-31 15:21:28] INFO ruby 2.3.1 (2016-04-26) [x86_64-linux] [2016-10-31 15:21:28] INFO WEBrick::HTTPServer#start: pid=30019 port=8888 simple_app.rb:199 cookies are {"sbsm-persistent-cookie"=>"", "sbsm-persistent-cookie-id"=>"0.9403210530719527", "@@counter"=>"4", "old_path"=>"/test6799", "_session_id"=>""} simple_app.rb:202 _session_id is 0.9403210530719527 or nil simple_app.rb:208 found session #<Rack::Session::Abstract::SessionHash:0x00000002a4c750> @session_handler is_? NilClass result is "simple_app.rb:55 process #<Rack::Request:0x00000002a37d50> path: /test6799 id: 0.9403210530719527" session_id 0.9403210530719527 ::1 - - [31/Oct/2016:15:21:32 CET] "GET /test6799 HTTP/1.1" 200 0 - -> /test6799
Remove the Rack::Session::Pool, which I think we do not need at the moment with commit Got rid of Rack::Session::Pool
Made the display nicer and verifying that we really use DRb to access a different linux process. Now the output of http://localhost:8888/test810 looks like this
simple_app.rb:55 DRbPid 19306 request: #<Rack::Request:0x000000021b7c20> path: /test810 id: 0.9403210530719527 Passthrough (WebRick PID) is 20135 @@counter is 4 session_id is 0.9403210530719527
Now removing the simple implementations for SBSM in simple_app.rb and replacing it with (possibly modified) classes from SBSM. Now I am beginning to understand. I must find the used session via a call to @app[session_id] and calling process for the returned session. Now my simple_app complains, because no validator is given.
Adaptation continued. Now I am asking myself about how the DRbObjects are handled in the procedure call(env)
puts "result is #{result.inspect} session_id #{session_id}" puts DRbObject.new_with_uri(SERVER_URI).to_s puts session.to_s # @proxy = DRbObject.new_with_uri(SERVER_URI) @proxy = DRbObject.new(session, SERVER_URI) puts @proxy.to_s session.drb_process self # das läuft res = @proxy.drb_process(self) # das nichtresults in the following output
result is "" session_id 0.831724324438134 WebRick has pid 4602 simple_app.rb:83 Im the Steinwies DrbServer from the pid 4519 simple_app.rb:83 Im the Steinwies DrbServer from the pid 4602 simple_app.rb:83 Im the Steinwies DrbServer from the pid 4602 RangeError: 0x00000001521038 is not id value (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:373:in `_id2ref' (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:373:in `to_obj' (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1483:in `to_obj' (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1779:in `to_obj' (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:622:in `recv_request' (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:931:in `recv_request' (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1599:in `init_with_client' (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1611:in `setup_message' (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1563:in `perform' (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1657:in `block (2 levels) in main_loop' (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1653:in `loop' (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1653:in `block in main_loop' /home/niklaus/git/steinwies.ch/src/util/simple_app.rb:121:in `call' /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/lint.rb:49:in `_call' /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/lint.rb:37:in `call' /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/show_exceptions.rb:23:in `call' /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/handler/webrick.rb:86:in `service' /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service' /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run' /usr/local/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread'
In my previous stub implementation of SBSM::DrbServer I had removed the inheritance from SimpleDelegator and my code worked. Now I readded it again and I am still getting the same error. Pushing my changes for steinwies and sbsm.
Pushed the following commits: