[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のリストを作っておいて再取得する等の対策が必要そうですね。