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

[Xen-changelog] [xen-unstable] oxenstored: handle unknown operations by returning an error to the client



# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1323967836 0
# Node ID a9d61ea9973abad4b7434f4c55fe5963bafe0156
# Parent  99caac2e35df41cbece606f663cb5570a62613c3
oxenstored: handle unknown operations by returning an error to the client

Previous an unknown operation would be decoded as a Not_found exception which
would bubble all the way up to the try ... with surrounding the call to
main_loop where it would be logged and ignored.

This would leave the guest hanging waiting for a response to the invalid
request.

Instead introduce a specific "Invalid" operation. Higher level functionality,
such as Process.process_packet, already handles operations which are not
understood with an error reply due to the final wildcard entry in
Process.function_of_type but explicitly handle Invalid this way to make it
clear what is going on.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Committed-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
---


diff -r 99caac2e35df -r a9d61ea9973a tools/ocaml/libs/xb/op.ml
--- a/tools/ocaml/libs/xb/op.ml Thu Dec 15 14:28:45 2011 +0100
+++ b/tools/ocaml/libs/xb/op.ml Thu Dec 15 16:50:36 2011 +0000
@@ -19,8 +19,7 @@
                  Transaction_end | Introduce | Release |
                  Getdomainpath | Write | Mkdir | Rm |
                  Setperms | Watchevent | Error | Isintroduced |
-                 Resume | Set_target
-               | Restrict 
+                 Resume | Set_target | Restrict | Invalid
 
 let operation_c_mapping =
        [| Debug; Directory; Read; Getperms;
@@ -41,7 +40,7 @@
 let of_cval i =
        if i >= 0 && i < size
        then operation_c_mapping.(i)
-       else raise Not_found
+       else Invalid
 
 let to_cval op =
        array_search op operation_c_mapping
@@ -69,3 +68,4 @@
        | Resume                -> "RESUME"
        | Set_target            -> "SET_TARGET"
        | Restrict              -> "RESTRICT"
+       | Invalid               -> "INVALID"
diff -r 99caac2e35df -r a9d61ea9973a tools/ocaml/libs/xb/xb.mli
--- a/tools/ocaml/libs/xb/xb.mli        Thu Dec 15 14:28:45 2011 +0100
+++ b/tools/ocaml/libs/xb/xb.mli        Thu Dec 15 16:50:36 2011 +0000
@@ -23,6 +23,7 @@
       | Resume
       | Set_target
       | Restrict
+      | Invalid (* Not a valid wire operation *)
     val operation_c_mapping : operation array
     val size : int
     val array_search : 'a -> 'a array -> int
diff -r 99caac2e35df -r a9d61ea9973a tools/ocaml/xenstored/logging.ml
--- a/tools/ocaml/xenstored/logging.ml  Thu Dec 15 14:28:45 2011 +0100
+++ b/tools/ocaml/xenstored/logging.ml  Thu Dec 15 16:50:36 2011 +0000
@@ -182,6 +182,7 @@
 
        | Xenbus.Xb.Op.Error             -> "error    "
        | Xenbus.Xb.Op.Watchevent        -> "w event  "
+       | Xenbus.Xb.Op.Invalid           -> "invalid  "
        (*
        | x                       -> Xenbus.Xb.Op.to_string x
        *)
diff -r 99caac2e35df -r a9d61ea9973a tools/ocaml/xenstored/process.ml
--- a/tools/ocaml/xenstored/process.ml  Thu Dec 15 14:28:45 2011 +0100
+++ b/tools/ocaml/xenstored/process.ml  Thu Dec 15 16:50:36 2011 +0000
@@ -324,7 +324,8 @@
        | Xenbus.Xb.Op.Resume            -> reply_ack do_resume
        | Xenbus.Xb.Op.Set_target        -> reply_ack do_set_target
        | Xenbus.Xb.Op.Restrict          -> reply_ack do_restrict
-       | _                       -> reply_ack do_error
+       | Xenbus.Xb.Op.Invalid           -> reply_ack do_error
+       | _                              -> reply_ack do_error
 
 let input_handle_error ~cons ~doms ~fct ~ty ~con ~t ~rid ~data =
        let reply_error e =
diff -r 99caac2e35df -r a9d61ea9973a tools/ocaml/xenstored/xenstored.ml
--- a/tools/ocaml/xenstored/xenstored.ml        Thu Dec 15 14:28:45 2011 +0100
+++ b/tools/ocaml/xenstored/xenstored.ml        Thu Dec 15 16:50:36 2011 +0000
@@ -43,9 +43,7 @@
                        debug "closing socket connection"
                in
        let process_fdset_with fds fct =
-               List.iter (fun fd ->
-                          try try_fct fct (Connections.find cons fd)
-                          with Not_found -> ()) fds
+               List.iter (fun fd -> try_fct fct (Connections.find cons fd)) fds
        in
        process_fdset_with rset Process.do_input;
        process_fdset_with wset Process.do_output

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.