Class: DRb::DRbMessage
- Inherits:
- 
      Object
      
        - Object
- DRb::DRbMessage
 
- Defined in:
- lib/VMwareWebService/DMiqVimSync.rb,
 lib/VMwareWebService/MiqVimDrbDebug.rb
Overview
module DMiqVimSync
Constant Summary collapse
- EXPECTED_MARSHAL_VERSION =
- [Marshal::MAJOR_VERSION, Marshal::MINOR_VERSION].freeze 
Instance Method Summary collapse
- 
  
    
      #dump(obj, error = false)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    This is the DRB half of the dupObj locking scheme. 
- #dump_original ⇒ Object
- 
  
    
      #load(soc)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    :nodoc:. 
Instance Method Details
#dump(obj, error = false) ⇒ Object
This is the DRB half of the dupObj locking scheme. If we get a MiqDrbReturn object, we marshal the object it wraps and release the lock.
| 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | # File 'lib/VMwareWebService/DMiqVimSync.rb', line 30 def dump(obj, error = false) # # Place a temp hold on the object until the client registers it. # obj.holdBrokerObj if obj.respond_to?(:holdBrokerObj) obj_to_dump = obj.kind_of?(MiqDrbReturn) ? obj.obj : obj result = dump_original(obj_to_dump, error) valid = true size = result[0..3].unpack("N")[0] if @load_limit < size $vim_log.error("DRb packet size too large: #{size}") valid = false end marshal_version = result[4, 2].unpack("C2") if marshal_version != EXPECTED_MARSHAL_VERSION $vim_log.error("Marshal version mismatch: expected: #{EXPECTED_MARSHAL_VERSION} got: #{marshal_version}") valid = false end unless valid $vim_log.error("object: #{obj.inspect}") $vim_log.error("buffer:\n#{result[0, 1024].hex_dump}") $vim_log.error("caller:\n#{caller.join("\n")}") end return result unless obj.kind_of?(MiqDrbReturn) begin return result ensure if obj.lock && obj.lock.sync_locked? $vim_log.debug "DRb::DRbMessage.dump: UNLOCKING [#{Thread.current.object_id}] <#{obj.obj.object_id}>" if $vim_log.debug? obj.lock.sync_unlock end end end | 
#dump_original ⇒ Object
| 24 | # File 'lib/VMwareWebService/DMiqVimSync.rb', line 24 alias_method :dump_original, :dump | 
#load(soc) ⇒ Object
:nodoc:
| 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | # File 'lib/VMwareWebService/MiqVimDrbDebug.rb', line 3 def load(soc) # :nodoc: begin sz = soc.read(4) # sizeof (N) rescue raise(DRbConnError, $!., $!.backtrace) end raise(DRbConnError, 'connection closed') if sz.nil? raise(DRbConnError, 'premature header') if sz.size < 4 sz = sz.unpack('N')[0] raise(DRbConnError, "too large packet #{sz}") if @load_limit < sz begin str = soc.read(sz) rescue raise(DRbConnError, $!., $!.backtrace) end raise(DRbConnError, 'connection closed') if str.nil? raise(DRbConnError, 'premature marshal format(can\'t read)') if str.size < sz DRb.mutex.synchronize do begin save = Thread.current[:drb_untaint] Thread.current[:drb_untaint] = [] Marshal::load(str) rescue NameError, ArgumentError DRbUnknown.new($!, str) rescue TypeError => err raise TypeError, "#{err}\n#{str.hex_dump}" ensure Thread.current[:drb_untaint].each do |x| x.untaint end Thread.current[:drb_untaint] = save end end end |