[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[kahua-dev:00663] Re: session と寿命を共にするオブジェクト



久住です.

On 2004/05/13, at 10:25, Shiro Kawai wrote:
<session-state>オブジェクトの内容は、worker processから
kahua-keyservに送られてそこで一元管理してるので、
kahua-keyservは全てのアクティブな<session-state>オブジェクトを
知っていることになります。

なるほどなるほど. serializableなobjectであれば<session-state>に
つっこんで使うのが一番良さそうですね.

# しかし, まじめに読んでみて思ったのですが, MOPってすごいですねぇ.
# しみじみと感動してしまいました. こんな簡単に分散オブジェクトが
# つくれるなんて!

kahua-keyservの方には、全てのアクティブなセッション状態キーを
返すインターフェースが実装されているんですが、worker process
からそれをqueryするAPIがまだ無かったかな。

とりあえず, 書いてみました.
あと, (%ctimeの更新なしに)参照だけしたいことがありましたので,
keyservとsession.scmに, そのようなAPIを追加してみました.

# あと, let-keywords*をapplicationの中で使いたくなったので, 
# その分の変更も含まれてます.

diff -cr Kahua-0.2.5-orig/plugins/allow-module.scm Kahua/plugins/allow-module.scm
*** Kahua-0.2.5-orig/plugins/allow-module.scm	Sat Feb 21 21:24:52 2004
--- Kahua/plugins/allow-module.scm	Sat May 15 14:00:45 2004
***************
*** 1,6 ****
--- 1,7 ----
  ;; allow module as plugin
  (allow-module file.util)
  (allow-module srfi-1)
+ (allow-module srfi-11)
  (allow-module srfi-13)
  (allow-module srfi-2)
  (allow-module text.parse)
diff -cr Kahua-0.2.5-orig/src/kahua/persistence.scm Kahua/src/kahua/persistence.scm
*** Kahua-0.2.5-orig/src/kahua/persistence.scm	Sun Feb 29 20:29:03 2004
--- Kahua/src/kahua/persistence.scm	Fri May 14 21:34:22 2004
***************
*** 17,22 ****
--- 17,23 ----
    (use gauche.version)
    (use gauche.fcntl)
    (use gauche.logger)
+   (use gauche.collection)
    (export <kahua-persistent-meta> <kahua-persistent-base>
            <kahua-persistent-metainfo>
            key-of find-kahua-class find-kahua-instance
diff -cr Kahua-0.2.5-orig/src/kahua/session.scm Kahua/src/kahua/session.scm
*** Kahua-0.2.5-orig/src/kahua/session.scm	Sat Feb 21 21:24:52 2004
--- Kahua/src/kahua/session.scm	Sat May 15 17:05:24 2004
***************
*** 47,56 ****
            <session-state>
            session-state-register
            session-state-get
            session-state-discard
            session-state-sweep
            session-state-refresh
!           session-flush-all)
    )
  (select-module kahua.session)

--- 47,59 ----
            <session-state>
            session-state-register
            session-state-get
+           session-state-ref
            session-state-discard
            session-state-sweep
            session-state-refresh
!           session-flush-all
!           session-state-all-keys
!           )
    )
  (select-module kahua.session)

***************
*** 262,280 ****
  ;;   Returns a session state object corresponding ID.
  ;;   If no session is associated with the ID, a new session state
  ;;   object is created.
! (define (session-state-get id)
!   (if (session-server-id)
!     (let* ((result (keyserver (list id)))
!            (state (make <session-state> :session-id id)))
!       (synchronize-session-state state result)
!       (session-state-sweep (* 60 (ref (kahua-config) 'timeout-mins)))
!       state)
!     (let1 state (or (hash-table-get (state-sessions) id #f)
!                     (hash-table-get (state-sessions)
!                                     (session-state-register id)))
!       (session-state-refresh id)
!       (session-state-sweep (* 60 (ref (kahua-config) 'timeout-mins)))
!       state)))

  ;; SESSION-STATE-DISCARD id
  ;;   Discards the session specified by ID.
--- 266,290 ----
  ;;   Returns a session state object corresponding ID.
  ;;   If no session is associated with the ID, a new session state
  ;;   object is created.
! (define (session-state-get id . rest)
!   (let-keywords* rest ((refresh? :refresh? #t))
!     (if (session-server-id)
!         (let* ((result (keyserver (if refresh?
!                                       (list id)
!                                       `(ref ,id))))
!                (state (make <session-state> :session-id id)))
!           (synchronize-session-state state result)
! (session-state-sweep (* 60 (ref (kahua-config) 'timeout-mins)))
!           state)
!         (let1 state (or (hash-table-get (state-sessions) id #f)
!                         (hash-table-get (state-sessions)
!                                         (session-state-register id)))
!           (if refresh? (session-state-refresh id))
! (session-state-sweep (* 60 (ref (kahua-config) 'timeout-mins)))
!           state))))
!
! (define (session-state-ref id)
!   (session-state-get id :refresh? #f))

  ;; SESSION-STATE-DISCARD id
  ;;   Discards the session specified by ID.
***************
*** 300,305 ****
--- 310,320 ----
      (keyserver (list id))
      (set! (ref (hash-table-get (state-sessions) id) '%timestamp)
            (sys-time))))
+
+ (define (session-state-all-keys)
+   (if (session-server-id)
+       (keyserver '(keys))
+       (hash-table-keys (state-sessions))))

  ;;; common API ----------------------------------------------

diff -cr Kahua-0.2.5-orig/src/kahua-keyserv.in Kahua/src/kahua-keyserv.in
*** Kahua-0.2.5-orig/src/kahua-keyserv.in	Sat Mar  6 08:10:41 2004
--- Kahua/src/kahua-keyserv.in	Sat May 15 16:51:50 2004
***************
*** 128,133 ****
--- 129,135 ----
                       (list (num-objects)))
                      ((stat) (list (num-objects)))
                      ((keys) (all-keys))
+                     ((ref)  (ref-object (cadr request)))
                      (else
                       (handle-object-command request)))
                    #f)
***************
*** 166,171 ****
--- 168,177 ----
            (get-object candidate))))
      ))

+ (define (ref-object key)
+   (and (string? key)
+        (hash-table-get *object-pool* key #f)))
+
  (define (sweep-objects timeout)
    (define now (sys-time))
    (define (check k v)
diff -cr Kahua-0.2.5-orig/test/persistence.scm.in Kahua/test/persistence.scm.in
*** Kahua-0.2.5-orig/test/persistence.scm.in	Wed Apr  7 18:55:33 2004
--- Kahua/test/persistence.scm.in	Fri May 14 21:37:36 2004
***************
*** 323,328 ****
--- 323,336 ----
           (sort (hash-table-keys (ref db 'instance-by-key))
                 (lambda (a b) (string<? (cdr a) (cdr b))))))

+ ;; <kahua-test>と,そのsubclassである<kahua-test-sub>両者ともの
+ ;; 永続インスタンスのコレクションを,<kahua-test>に対する
+ ;; make-kahua-collectionを用いて作成できることを確認する.
+ (test* "kahua-test-subclasses" '(1 2 4 5)
+        (sort (with-db (db *dbname*)
+                (map (cut ref <> 'id)
+ (make-kahua-collection <kahua-test> :subclasses #t)))))
+
  ;;----------------------------------------------------------
  ;; メタ情報履歴に関するテスト:永続クラスの変更をオブジェクトマネージャ
  ;; が認識し、世代番号を自動的に付与して管理していることを確認する。
Only in Kahua/test: persistence.scm.in~
Only in Kahua/test: plugin.scm
Only in Kahua/test: sandbox.scm
Only in Kahua/test: server.scm
Only in Kahua/test: session.scm
diff -cr Kahua-0.2.5-orig/test/session.scm.in Kahua/test/session.scm.in
*** Kahua-0.2.5-orig/test/session.scm.in	Wed Apr  7 18:55:33 2004
--- Kahua/test/session.scm.in	Sat May 15 17:04:47 2004
***************
*** 106,111 ****
--- 106,112 ----
           (let ((state (session-state-get "nosuchid")))
             (list (ref state 'x-slot) (ref state 'y-slot)))))

+
  (test* "discarding" '(#f #f)
         (begin
           (session-state-discard a-state-id)
***************
*** 124,129 ****
--- 125,131 ----
           (let ((state (session-state-get "nosuchid")))
             (list (ref state 'x-slot) (ref state 'y-slot)))))

+
  ;;------------------------------------------------------------------
  (test-section "session key server")

***************
*** 176,181 ****
--- 178,195 ----
             (list (assq-ref (cdr reply) 'tempo)
                   (assq-ref (cdr reply) 'key))))

+   (test* "ref" '("adagio" D-dur)
+          (let1 reply (get-session-key `(ref ,(car key)))
+            (list (assq-ref (cdr reply) 'tempo)
+                  (assq-ref (cdr reply) 'key))))
+
+   (test* "ref (check %ctime is not changed)" #t
+          (let* ((g (get-session-key (list (car key))))
+                 (_ (sys-sleep 2))
+                 (r (get-session-key `(ref ,(car key)))))
+            (= (assq-ref g '%ctime)
+               (assq-ref r '%ctime))))
+
    (test* "admin message (stat)" '(2)
           (get-session-key '(stat)))

***************
*** 215,220 ****
--- 229,235 ----

    (test* "all-keys" (car (get-session-key '(stat)))
           (length (get-session-key '(keys))))
+
    )

  ;;------------------------------------------------------------------
***************
*** 254,259 ****
--- 269,289 ----
           (let ((state (session-state-get "nosuchid")))
             (list (ref state 'x-slot) (ref state 'y-slot)))))

+ (test* "session-state-ref" '(x y)
+        (begin
+          (let ((state (session-state-ref "nosuchid")))
+            (set! (ref state 'x-slot) 'x)
+            (set! (ref state 'y-slot) 'y))
+          (let ((state (session-state-ref "nosuchid")))
+            (list (ref state 'x-slot) (ref state 'y-slot)))))
+
+ (test* "session-state-ref (timestamp is not changed)" #t
+        (let* ((g (session-state-get "nosuchid"))
+               (_ (sys-sleep 2))
+               (r (session-state-ref "nosuchid")))
+          (= (ref g '%timestamp)
+             (ref r '%timestamp))))
+
  (test* "sweep" '(x y)
         (begin
           (session-state-sweep 10000)
***************
*** 265,270 ****
--- 295,306 ----
           (session-state-sweep -1)
           (let ((state (session-state-get "nosuchid")))
             (list (ref state 'x-slot) (ref state 'y-slot)))))
+
+ (set! a-state-id (session-state-register))
+ (set! b-state-id (session-state-register))
+
+ (test* "session-state-all-keys" (sort (list a-state-id b-state-id "nosuchid"))
+        (sort (session-state-all-keys)))

  (when kserv
    (process-send-signal kserv SIGHUP)