[nio-cvs] r85 - in branches/home/psmith/restructure/src: io nio-logger utils
psmith at common-lisp.net
psmith at common-lisp.net
Sun Feb 11 23:53:11 UTC 2007
Author: psmith
Date: Sun Feb 11 18:53:09 2007
New Revision: 85
Modified:
branches/home/psmith/restructure/src/io/async-fd.lisp
branches/home/psmith/restructure/src/io/async-socket.lisp
branches/home/psmith/restructure/src/io/nio-server.lisp
branches/home/psmith/restructure/src/io/nio.asd
branches/home/psmith/restructure/src/io/nodes.lisp
branches/home/psmith/restructure/src/nio-logger/nio-logger.asd
branches/home/psmith/restructure/src/nio-logger/run-logging-client.lisp
branches/home/psmith/restructure/src/nio-logger/run-logging-server.lisp
branches/home/psmith/restructure/src/utils/nio-utils-package.lisp
Log:
Reconnect working
Modified: branches/home/psmith/restructure/src/io/async-fd.lisp
==============================================================================
--- branches/home/psmith/restructure/src/io/async-fd.lisp (original)
+++ branches/home/psmith/restructure/src/io/async-fd.lisp Sun Feb 11 18:53:09 2007
@@ -45,14 +45,16 @@
:documentation "Have we been notified as write ready and not received EAGAIN from %write?")
(close-pending :initform nil
:accessor close-pending)
+;TODO this is either an inet-socket if we are client side or a node is we are server side...
(socket :initarg :socket
- :accessor socket)))
+ :accessor socket
+ :documentation "The remote node we are talking to")))
(defmethod print-object ((async-fd async-fd) stream)
- (with-slots (socket read-fd write-fd) async-fd
- (format stream "#<ASYNC-FD :socket ~D :read-fd ~D :write-fd ~D.>"
- socket read-fd write-fd)))
+ (with-slots (read-fd write-fd) async-fd
+ (format stream "#<ASYNC-FD :read-fd ~D :write-fd ~D.>"
+ read-fd write-fd)))
;;Implement this in concrete SM for read
(defgeneric process-read (async-fd))
@@ -120,6 +122,8 @@
(define-condition read-error (error) ())
+(define-condition write-error (error)
+ ((error-number :initarg :error)))
(defun write-more (async-fd)
"Write data from ASYNC-FD's write bytebuffer"
@@ -144,7 +148,7 @@
(unless (eql err 11) ;; eagain - failed to write whole buffer need to wait for next notify
(perror)
(let ((err-cond (make-instance 'write-error :error err)))
- (close err-cond)
+ (close-fd (write-fd async-fd))
(error err-cond))))
;;update buffers
(if (eql (remaining foreign-write-buffer) 0)
@@ -158,17 +162,6 @@
(defconstant +MAX-BUFFER-SIZE-BYTES+ (* 1024 1024))
-
-
-;(let ((buffer (foreign-read-buffer async-fd)))
-; (if (>= (length buffer) size)
-; t
-; (let ((new-buffer (byte-buffer size)))
-; (copy-buffer buffer new-buffer)
-; (free-buffer buffer)
-; (setf (foreign-read-buffer async-fd) new-buffer)))))
-
-
(defmacro realloc-buffer(async-fd accessor size)
`(let ((buffer (,accessor ,async-fd)))
(if (>= (buffer-capacity buffer) size)
Modified: branches/home/psmith/restructure/src/io/async-socket.lisp
==============================================================================
--- branches/home/psmith/restructure/src/io/async-socket.lisp (original)
+++ branches/home/psmith/restructure/src/io/async-socket.lisp Sun Feb 11 18:53:09 2007
@@ -132,10 +132,10 @@
t
nil)))
-(defun connect-inet-socket (socket-fd addr port)
+(defun connect-inet-socket (socket-fd node)
+ (format-log t "async-socket:connect-inet-socket ccalled with ~A, and ~A~%" socket-fd node)
(with-foreign-object (sa 'sockaddr-in)
- (init-inet-socket sa port addr)
-
+ (init-inet-socket sa (remote-port node) (remote-host node))
(let ((res (%connect socket-fd sa +sockaddr-in-len+)))
(format-log t "async-socket:connect-inet-socket library connect call returned ~A, and errno ~A~%" res (get-errno))
(if (= res -1)
@@ -171,13 +171,6 @@
;;;; SOCKET I/O
-(defclass async-socket-fd ()
- ((family :initform :unknown :initarg :family)
- (remote-host :initform nil :initarg :remote-host)
- (remote-port :initform nil :initarg :remote-port)))
-
-
-
(defun socket-accept (socket-fd connection-type)
"Accept connection from SOCKET-FD. Allocates and returns socket structure denoting the connection."
@@ -200,16 +193,18 @@
(let ((len (foreign-alloc :unsigned-long :initial-element +sockaddr-in6-len+)))
;; accept connection
+#+nio-debug (format-log t "async-socket::socket-accept - calling %accept~%")
(let* ((res (%accept socket-fd addr len))
-;; (async-socket-fd (make-instance 'async-socket-fd :read-fd res :write-fd res)))
- (async-socket-fd (create-state-machine connection-type res res (make-instance 'async-socket-fd))))
+ (async-fd (create-state-machine connection-type res res (node nil nil))))
+
+#+nio-debug (format-log t "async-socket::socket-accept - create async-fd ~A~%" async-fd)
(unless (< res 0)
(let ((len-value (mem-ref len :unsigned-int)))
;; parse sockaddr struct for remote client info
- (with-slots (family remote-host remote-port) (socket async-socket-fd)
+ (with-slots (family remote-host remote-port) (socket async-fd)
(cond
((= len-value +sockaddr-in6-len+)
@@ -224,12 +219,5 @@
(foreign-free len)
- (if (>= res 0) async-socket-fd nil)
+ (if (>= res 0) async-fd nil)
)))))))
-
-
-(defun remote-info (async-socket-fd)
- "Return FAMILY, REMOTE-HOST and REMOTE-PORT in list."
- (with-slots (family remote-host remote-port) async-socket-fd
- (list family remote-host remote-port)))
-
Modified: branches/home/psmith/restructure/src/io/nio-server.lisp
==============================================================================
--- branches/home/psmith/restructure/src/io/nio-server.lisp (original)
+++ branches/home/psmith/restructure/src/io/nio-server.lisp Sun Feb 11 18:53:09 2007
@@ -41,7 +41,7 @@
(defun process-async-fds (client-hash)
(let ((removals nil))
(maphash #'(lambda (k async-fd)
-#+nio-debug2 (format-log t "Dealing with ~a => ~a~%" k async-fd)
+#+nio-debug (format-log t "Dealing with ~a => ~a~%" k async-fd)
;process reads
(when (read-ready async-fd) (read-more async-fd))
@@ -49,20 +49,22 @@
(process-read async-fd))
;process-writes
- (process-write async-fd)
- (when (and (write-ready async-fd)
- (> (buffer-position (foreign-write-buffer async-fd)) 0))
- (write-more async-fd))
-
- (when (close-pending async-fd)
- (write-more async-fd)
- (push async-fd removals)))
+ (handler-case
+ (progn
+ (process-write async-fd)
+ (when (and (write-ready async-fd)
+ (> (buffer-position (foreign-write-buffer async-fd)) 0))
+ (write-more async-fd))
+
+ (when (close-pending async-fd)
+ (write-more async-fd)
+ (push async-fd removals)))
+ (write-error (we) (push async-fd removals))))
client-hash)
(dolist (async-fd removals)
+ (format-log t "nio-server:process-async-fds processing remove for ~a~%" async-fd)
+ (setf (active-conn (socket async-fd)) nil)
(remhash (async-fd-read-fd async-fd) client-hash))))
-; (format t "client-hash list ~A~%"client-hash )
-
-
(defun start-server (connection-type
@@ -121,9 +123,7 @@
(format t "Error setting socket non-blocking: ")
(perror)))
(setf (gethash (async-fd-read-fd async-fd) client-hash) async-fd)
- (add-async-fd event-queue async-fd :read-write)
-; (add-async-fd event-queue async-fd :write)
- )
+ (add-async-fd event-queue async-fd :read-write))
;; no accept, close
(t
@@ -149,14 +149,16 @@
(when (read-event-p event) (setf (read-ready async-fd) t))
(when (write-event-p event) (setf (write-ready async-fd) t)))))))))
- ;add outgoing sockets to event queue
+;add outgoing sockets to event queue
#+nio-debug2 (format-log t "nio-server:start-server - Processing new connections queue ~A~%" +connected-sockets-queue+)
(loop for node = (nio-compat:take +connected-sockets-queue+ :blocking-call nil) until (null node) do
#+nio-debug (format-log t "nio-server:start-server - adding node to nodes-list ~A~%" node)
(push node *nodes-list*))
+
(with-connect-ready-nodes (a-node)
#+nio-debug (format-log t "nio-server:start-server - attempting connection to node ~A~%" a-node)
- (let ((new-fd (connect (host a-node) (port a-node) connection-type)))
+ (let ((new-fd (connect a-node connection-type)))
+#+nio-debug (format-log t "nio-server:start-server - connect returned async-fd ~A~%" new-fd)
(update-last-connect-attempt a-node)
(when new-fd
#+nio-debug (format-log t "nio-server:start-server - adding connection to nio thread ~A~%" new-fd)
@@ -171,19 +173,17 @@
(close-fd sock))))
-(defun connect(host port connection-type
+(defun connect(node connection-type
&key
(protocol :inet))
- (format-log t "nio-server:connect - Called with: ~A:~A:~A ~%" protocol host port)
+ (format-log t "nio-server:connect - Called with: ~A ~A~%" protocol node)
(let ((sock nil))
(setq sock (ecase protocol
(:inet (make-inet-socket))
(:inet6 (make-inet6-socket))))
- (if (connect-inet-socket sock host port)
- (let ((sm (create-state-machine connection-type sock sock sock)))
-; (nio-compat:add +connected-sockets-queue+ sm)
-; (format-log t "nio-server:connect - Socket enqueued: ~A~%" +connected-sockets-queue+)
+ (if (connect-inet-socket sock node)
+ (let ((sm (create-state-machine connection-type sock sock node)))
(return-from connect sm))
(format t "Connect failed!!~A ~%" (get-errno)))))
Modified: branches/home/psmith/restructure/src/io/nio.asd
==============================================================================
--- branches/home/psmith/restructure/src/io/nio.asd (original)
+++ branches/home/psmith/restructure/src/io/nio.asd Sun Feb 11 18:53:09 2007
@@ -8,8 +8,8 @@
(:file "fd-helper" :depends-on ("nio-package"))
(:file "packet" :depends-on ("nio-package"))
(:file "async-fd" :depends-on ("fd-helper"))
- (:file "async-socket" :depends-on ("async-fd"))
(:file "nodes" :depends-on ("nio-package"))
+ (:file "async-socket" :depends-on ("async-fd" "nodes"))
(:file "nio-server" :depends-on ("async-socket" "nodes"))
(:file "ip-authorisation" :depends-on ("nio-package"))
)
Modified: branches/home/psmith/restructure/src/io/nodes.lisp
==============================================================================
--- branches/home/psmith/restructure/src/io/nodes.lisp (original)
+++ branches/home/psmith/restructure/src/io/nodes.lisp Sun Feb 11 18:53:09 2007
@@ -28,24 +28,28 @@
(declaim (optimize (debug 3) (speed 3) (space 0)))
-;;concept of a remote socket
+
+;;concept of a remote socket with properties e.g. stats, connection attempts etc
(defclass node()
- ((host :initarg :host
- :reader host)
- (port :initarg :port
- :reader port)
+ ((family :initform :unknown :initarg :family)
+ (remote-host :initarg :remote-host
+ :initform nil
+ :accessor remote-host)
+ (remote-port :initarg :remote-port
+ :initform nil
+ :accessor remote-port)
(last-connect-attempt :initform nil
:accessor last-connect-attempt
:documentation "Time we last attempted a connection")
- (retry-delay :initform 600
+ (retry-delay :initform 60
:accessor retry-delay
- :documentation "The delay to wait after the last-connection-attempt before trying to connect again")
+ :documentation "The delay to wait (in secs) after the last-connection-attempt before trying to connect again (10 mins)")
(active-conn :initform nil
:accessor active-conn
:documentation "If we are connected to this remote socket this is set to the SM")))
(defun node(host port)
- (make-instance 'node :host host :port port))
+ (make-instance 'node :remote-host host :remote-port port))
;(node-from-socket-repn "192.168.1.1:1234")
(defun node-from-socket-repn(socket)
@@ -56,8 +60,9 @@
(defmethod print-object ((a-node node) stream)
- (with-slots (host port last-connect-attempt retry-delay active-conn) a-node
- (format stream "#<NODE :HOST ~A :port ~A :last-connect-attempt ~A :retry-delay ~A :active-conn ~A>" host port last-connect-attempt retry-delay active-conn)))
+ (with-slots (remote-host remote-port last-connect-attempt retry-delay active-conn) a-node
+ (format stream "#<NODE :remote-host ~A :remote-port ~A :last-connect-attempt ~A :retry-delay ~A :active-conn ~A>"
+ remote-host remote-port last-connect-attempt retry-delay active-conn)))
(defparameter *nodes-list* nil
Modified: branches/home/psmith/restructure/src/nio-logger/nio-logger.asd
==============================================================================
--- branches/home/psmith/restructure/src/nio-logger/nio-logger.asd (original)
+++ branches/home/psmith/restructure/src/nio-logger/nio-logger.asd Sun Feb 11 18:53:09 2007
@@ -8,5 +8,5 @@
(:file "nio-logger" :depends-on ("nio-logger-package"))
)
- :depends-on (:nio-yarpc :nio-utils :cl-base64))
+ :depends-on (:nio-yarpc :nio-utils :cl-base64 :sb-posix))
Modified: branches/home/psmith/restructure/src/nio-logger/run-logging-client.lisp
==============================================================================
--- branches/home/psmith/restructure/src/nio-logger/run-logging-client.lisp (original)
+++ branches/home/psmith/restructure/src/nio-logger/run-logging-client.lisp Sun Feb 11 18:53:09 2007
@@ -25,7 +25,7 @@
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|#
-;(push :nio-debug *features*)
+(push :nio-debug *features*)
(require :asdf)
(require :nio-logger)
@@ -33,7 +33,20 @@
(let ((log-file (second sb-ext:*posix-argv*))
(ip (third sb-ext:*posix-argv*)))
(format t "Starting logging client with ~A ~A~%" log-file ip)
- (sb-thread:make-thread #'(lambda()(nio-logger:tail-log log-file ip)) :name "nio-server")
+ (sb-thread:make-thread #'(lambda()(nio:start-server 'nio-yarpc:yarpc-client-state-machine)) :name "nio-server")
+; (nio:add-connection (nio:node ip 16323))
+; (sleep 60)
- ;;shouldn't be listenting on the client hence nil for accept SM to start-server
- (nio:start-server 'nio-yarpc:yarpc-client-state-machine))
+ (setf sb-ext:*invoke-debugger-hook*
+ (lambda (condition hook)
+ (declare (ignore hook))
+ (with-open-file (out (format nil "error-from-pid~A-thread-~A" (sb-posix:getpid) (sb-thread:thread-name sb-thread:*current-thread*))
+ :direction :output :external-format :utf-8 :if-exists :append :if-does-not-exist :create)
+ (format out "Toplevel catch (~A):~%" (nio-utils:get-readable-time))
+ (format out "~A - ~A~%" (type-of condition) condition)
+ (sb-debug:backtrace 20 out))
+ (quit)))
+
+
+ (nio-logger:tail-log log-file ip)
+)
Modified: branches/home/psmith/restructure/src/nio-logger/run-logging-server.lisp
==============================================================================
--- branches/home/psmith/restructure/src/nio-logger/run-logging-server.lisp (original)
+++ branches/home/psmith/restructure/src/nio-logger/run-logging-server.lisp Sun Feb 11 18:53:09 2007
@@ -25,7 +25,7 @@
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|#
-;(push :nio-debug *features*)
+(push :nio-debug *features*)
(require :asdf)
(require :nio-logger)
Modified: branches/home/psmith/restructure/src/utils/nio-utils-package.lisp
==============================================================================
--- branches/home/psmith/restructure/src/utils/nio-utils-package.lisp (original)
+++ branches/home/psmith/restructure/src/utils/nio-utils-package.lisp Sun Feb 11 18:53:09 2007
@@ -29,5 +29,5 @@
(:export
;;utils
- format-log get-universal-high-res
+ format-log get-universal-high-res get-readable-time
))
More information about the Nio-cvs
mailing list