[Spice-devel] spice-server, logging and style

Frediano Ziglio fziglio at redhat.com
Tue Nov 3 05:15:14 PST 2015


Hi,
  looking at refactory branch and spice-server code looks like logging
facilities are used all around the code for different purposes however
don't looks like there are some specific style or direction to handle
these stuff.
At http://cgit.freedesktop.org/spice/spice/tree/docs there is a
Spice_style.odt file but the only reference to logging is the ASSERT
macro which is only used in some spice-server test.

To sum up the state of logging:
- the main logging macro/functions are in spice-common/common/log.h
  header;
- there are 5 levels (debug, info, warning, critical, error)
  following GLib levels (error is fatal);
- there are generic function (spice_log, spice_logv);
- there are function to log at the different log levels (spice_debug,
  spice_info, spice_warning, spice_critical and spice_error);
- there are conditional logging function (spice_warn_if_reached,
  spice_warn_if_fail, spice_warn_if);
- there are function that mix logging, check and return
  (spice_return_if_fail, spice_return_val_if_fail);
- spice_printerr to log on standard error
- spice_static_assert to do compile time checks.

Problems:
- the Spice_style.odt is outdated;
- spice_assert recall the standard assert but instead it mainly
  call spice_error which like GLib is fatal and should call exit/abort.
  It is not affected by NDEBUG or other definitions. Why using it instead
  of spice_error?
- you can set SPICE_ABORT_LEVEL enviroment to make error levels not
  fatal but this is against the definition of error in the library;
- spice_static_assert is implemented as a runtime check. As we are
  going to use glib extensively and as glib as a macro for this
  I would suggest to use glib macro(s).

Style:
- why use spice_printerr if all errors basically go to standard error?
- from a first time readers spice_return_if_fail and spice_return_val_if_fail
  do not suggest function is doing some logging. Also they use critical
  level which by default cause program abortion.

Personal considerations:
- it seems some changes in patchset change "if (cond) return" code with
  spice_return_if_fail(cond). As stated before the macro are very misleading
  and the result is usually a program abortion instead of a return.
  I think new macro with better naming (I don't have a specific suggestion)
  would be better. The code is actually less readable with these macros;
- although is sometimes useful to have errors reported to detect problems
  we should consider we should consider that too logging can cause DoS
  due to disk consumption, slow down (there are some checks on hot paths
  like Quic or Lz). On Linux kernel there are macros like WARN_ONCE to
  detect problems but limit the logging. We could use something like this;
- warning or error? There are lot of changes that change spice_error to
  spice_warning without even a comment. The behavior is really different.
  Personally if a check is checking for memory corruption (double free,
  overflow and so on) should be fatal. spice-server is server code
  which should be subject to security checks and considerations.

Frediano


More information about the Spice-devel mailing list