[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[kahua-dev:00870] kahua.persistence: equal? が #t にならない場合がある
久住です。
persistentな同じobjectへの2つのreferenceのequal?が#tにならない
場合を発見しましたので報告します。
具体的にはlambdaで渡された継続の中で、lambdaの外の環境にある
persistent objectへのreferenceを利用しようとすると問題になります。
(find-kahua-instance等で)継続の中で同じpersistent objectへの
referenceを取得したときに、さきほどのreferenceがさすobjectと同じ
objectにもかかわらずequal?が#fになってしまいます。
以下のコードのような場合です
(let ((o (find-kahua-instance <a> "a")))
(a/cont/ (@@/ (lambda ()
(let ((o2 (find-kahua-instance <a> "a")))
(equal? o o2) ;; #f
)))
...))
http requestごとにdbをcloseしているので、継続の中は外の環境とは
違うdatabase sessionになってしまい、on-memoryにobjectが存在する
にも関わらずそのobjectへのreferenceを取得できないのが問題のようです。
とりあえずad-hocな対処として以下のコードをいれてます。
(define-method object-equal? ((a <kahua-persistent-base>) (b
<kahua-persistent-base>))
(string=? (key-of a) (key-of b)))
まだまじめにコードを追っていないのですが、上記のような条件下で
継続を呼ばれる前に他のapp-serverがdbを変更した場合には、
その変更が自分のon-memory objectに反映されないバグもある気がします。
on-memory objectのリストを作っておいて再取得する等の対策が必要そうですね。