2014-12-04 3 views
1

Я испытываю действительно странное поведение с Ruby DRb или, может быть, проблема в dbm. Я использую базу данных dbm с сервером и клиент, который делает запросы через DRb.Рубиновое соединение закрыто (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 = дб [ID. to_s] ', и я получил ту же самую ошибку, что и« id », которая в любом случае является строкой на стороне клиента. Она ничего не возвращает, просто вызывает ошибку, а сервер останавливается – dabadaba

+0

В методе get_id, если вы добавьте 'p obj' между' obj = db [id.to_s] 'и' db.close', что он возвращает? – rebelshrug

+0

ничего, сервер не работает в строке 'obj = db [id.to_s]' so anything после того, как этого не произойдет – dabadaba

0

Попробуйте исправить свой рубин, чтобы дать вам немного больше информации об ошибке на стороне сервера отношений.

См. https://github.com/ruby/ruby/pull/1260.

В моем случае это была проблема с объявляя safe_level, а затем некоторые из кода, который я назвал кончались нарушением безопасности (т.е. сделать «опасный вызов).

 Смежные вопросы

  • Нет связанных вопросов^_^