[Spice-devel] [RFCv5 00/47] server: multiple client support

Yonit Halperin yhalperi at redhat.com
Sun May 22 10:38:56 PDT 2011


Hi,

Though implementing this feature using multiple instances of the core data structures, one instance per client, is straightforward 
and comprises a clean solution, I think that we should implement a more parsimonious solution with respect to memory and cpu, so we can support a large number of clients. 
We can keep only one instance of the surfaces, trees, GLZ dictionary, etc., and for each client we will hold a pipe.
In addition, we should avoid re-encoding the same bitmap for each client it is being sent to, and instead keep the encoded result and send it instantly.
This solution raises other issues that need handling, e.g.:
* When decoding a GLZ image, the dictionary at the client side must be the same as the one that was at the server side at the moment of encoding that image. However, the stream of images that is sent to each client is not necessarily identical (due to "covering" of rendering commands that haven't been sent yet), and thus, the dictionary in the server might not be consistent with the ones in the clients. One possible solution is to enforce identical dictionary in all the clients: (1) if an image was previously removed from a client sending queue, we will not use GLZ when sending it to another client (2) if an image was previously sent to a client using GLZ, we will enforce sending it to all the other clients.
* the pixmap hash at the server side is not an heavy memory consumer, but if we decide to keep only on copy for it, we need to keep it consistent with all the clients, similarly to the GLZ dictionary.
* For supporting jpeg compresison in WAN, we will need to store surface_client_lossy_regions for each client.

Cheers,
Yonit.

p.s.
this feature made me think that separating our channels' logic (mainly the red_worker), from the sending queue(s), to different threads, may enhance Spice's performance, even for one client. Why shouldn't we try to send data in the pipe to the client while we are processing commands pulled from the driver? 

----- Original Message -----
From: "Alon Levy" <alevy at redhat.com>
To: spice-devel at freedesktop.org
Sent: Sunday, May 8, 2011 3:10:56 PM
Subject: [Spice-devel] [RFCv5 00/47] server: multiple client support

changes from previous (v4) after Marc-Andre's review:
 Surfaces struct renamed to RedRender
 patch count reduction.
 reduction of argument count (makes search replace patches more readable too)
 some other cleanups. I'm sure I missed a few.
 to turn on multiple client support you need to set SPICE_DEBUG_ALLOW_MC=1
 (or any value).
 tested the handle_dev patch, it seems rendering is not correct with this
 patch series, see comment on last patch.

Still a lot of todos.

Tree: git://anongit.freedesktop.org/spice/spice server_multi_client.v5

Alon Levy (47):
  server/main_channel.c: set NET_TEST_STAGE_INVALID=0 explicitly (TODO
    - the rest)
  server/red_channel: renames to use _proc postfix consistently
  server/red_worker: drop red_pipe_add_tail, use
    red_channel_pipe_add_tail
  server/red_channel (all): introduce RedChannelClient
  server/red_worker: introduce {display,cursor}_is_connected
  server: move pipe from RedChannel to RedChannelClient
  server/main_channel: use MainChannel in sig
  server/red_channel: workaround for fast client disconnect bug (TODO -
    real fix)
  server/red_client: clear pipe on disconnect
  server/red_worker: release PIPE_ITEM_TYPE_VERB in display channel
  server/main_channel+reds: make main_channel_init return
    MainChannelClient
  server: Add RedClient
  server/reds: add concept of secondary channels
  server/main_channel: move latency and bitrate to channel client
  server/main_channel: move ping here from reds.
  server/main_channel: move connection_id from reds
  server/red_channel: ignore error if already shutdown
  server/red_channel: introduce pipes functions
  server/main_channel: support multiple clients
  server/inputs_channel: support multiple clients
  server/red_tunnel_worker: trivial multi client support
  server/smartcard: support multiple clients
  server/red_worker: split RedRender from RedWorker
  server/red_worker: cleanup
  server/red_worker: split display and cursor channels
  server/red_worker: remove more direct access to RedChannelClient.rcc
  server/red_channel: add pipe_size helpers
  server/red_channel: introduce client ring in RedChannel
  server/reds: add RedsState.allow_multiple_clients
  server/red_worker: introduce RedSurfaceReleaseInfo
  server/red_worker: add ref counting to RedDrawable
  server/red_worker: start using RENDER_FOREACH
  server/red_worker: whitespace fixes
  server/red_worker: copy and free new surfaces after first client
  server/red_worker: get_streams_timeout: go over all clients
  server/red_worker: move free from display_channel_send_item to
    _release_item
  server/red_worker: split cursor pipe item from cursor item
  server/red_worker: remove forced disconnect on connect
  server/red_worker: add cursor_channel_client_disconnect
  server/red_worker: red_current_add_equal: add dcc null checks
  server/red_worker: on_new_display_channel_client: push ack, cleanup
  server/red_worker: give each client a different id for caches
  server/red_worker: DEBUG_CURSORS
  (temp) server/reds: use ALLOW_NO_SSL define externally to trigger
    debug only DEBUG_GENERATE_NULL_KEY
  (temp) server/reds: DEBUG: add a define for working with no SSL (good
    for valgrind)
  (temp) client/red_channel: DEBUG: allow no SSL usage (useful for
    valgrind)
  server/red_worker: handle_dev_update: for all clients (checkme)

 client/red_channel.cpp           |   40 +-
 server/inputs_channel.c          |  151 +-
 server/main_channel.c            |  626 ++++---
 server/main_channel.h            |   47 +-
 server/red_channel.c             | 1027 ++++++++---
 server/red_channel.h             |  195 ++-
 server/red_client_cache.h        |   58 +-
 server/red_client_shared_cache.h |   48 +-
 server/red_dispatcher.c          |   39 +-
 server/red_dispatcher.h          |    7 +-
 server/red_parse_qxl.h           |    1 +
 server/red_tunnel_worker.c       |  403 +++--
 server/red_worker.c              | 3877 +++++++++++++++++++++++---------------
 server/red_worker.h              |    2 +
 server/reds.c                    |  198 ++-
 server/reds.h                    |   16 +-
 server/smartcard.c               |  196 +-
 server/snd_worker.c              |   24 +-
 18 files changed, 4365 insertions(+), 2590 deletions(-)

-- 
1.7.5.1

_______________________________________________
Spice-devel mailing list
Spice-devel at lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/spice-devel


More information about the Spice-devel mailing list