2014-12-04 50 views
1

我遇到了Ruby DRb的非常奇怪的行爲,或者問題是dbm。我正在使用帶有服務器的dbm數據庫,以及通過DRb發出請求的客戶端。關閉Ruby連接(DRb :: DRbConnError)

這裏是有問題的方法(數據庫連接是確定的),它是在服務器:

def get id 
    obj = nil 
    db = DBM.open @name 
    obj = db[id.to_s] 
    db.close 
    return obj 
end 

此行obj = db[id.to_s]返回錯誤connection closed (DRb::DRbConnError)在客戶端。

事情是,如果我這樣做obj = db['1']它工作得很好('1'是在dbm中的一個鍵)。爲什麼會發生? id有什麼不對?這裏是客戶端的呼叫:

DRb.start_service 
r = DRbObject.new_with_uri(SERVER_URI) 
puts r.get '1' 

爲什麼我得到這個錯誤?同樣的事情發生這種方法:

def delete id 
    db = DBM.open @name 
    db.delete id 
    db.close 
end 

回答

0

/lib/drb/drb.rb,它看起來像關閉連接錯誤時引發sz.nil?str.nil

raise(DRbConnError, 'connection closed') if sz.nil? 

raise(DRbConnError, 'connection closed') if str.nil? 

obj = db[id.to_s]返回什麼?

+0

我也試過'的obj = DB [ID。 to_s]'之前,我得到了完全相同的錯誤,而不僅僅是'id',它是客戶端的一個字符串,它不會返回任何內容,只會引發錯誤並且服務器停止 – dabadaba 2014-12-04 15:59:09

+0

在get_id方法中,如果你在'obj = db [id.to_s]'和'db.close'之間添加'obj',它返回什麼? – rebelshrug 2014-12-04 16:17:22

+0

沒有,服務器在'obj = db [id.to_s]'行崩潰之後不會發生 – dabadaba 2014-12-05 13:38:57

0

嘗試修補你的紅寶石給你一些關於服務器端關係錯誤的更多細節。

參見:https://github.com/ruby/ruby/pull/1260

對我來說,它是與聲明safe_level,然後一些我叫結束了違反安全的代碼(即做一個「危險的調用)的問題。