[Varnish] #1330: VSL_Dispatch parameters 'fd' and 'spec' intermittently called with uninitialized values

Varnish varnish-bugs at varnish-cache.org
Mon Jul 22 17:02:55 CEST 2013


#1330: VSL_Dispatch parameters 'fd' and 'spec' intermittently called with
uninitialized values
-------------------+------------------------
 Reporter:  geoff  |       Type:  defect
   Status:  new    |   Priority:  high
Milestone:         |  Component:  varnishlog
  Version:  3.0.3  |   Severity:  major
 Keywords:         |
-------------------+------------------------
 I've set 'component' to 'varnishlog', but it's actually about the logging
 API.

 I'm using the VSL_Dispatch callback in two tools to read from the log, and
 for both of them, it's intermittently called with the argument fd ==
 ((unsigned) -1) and/or spec == 0, although the log entry unquestionably
 belongs to a client or backend transaction (because the tag is something
 like TxHeader or RxURL, and the content of the log payload is clearly
 correct for the tag).

 As a reminder: fd is the number that appears in the leftmost column of
 varnishlog, and spec is reflected in varnishlog's 'c'/'b'/'-' column. spec
 has the value VSL_S_CLIENT or VSL_S_BACKEND for the 'c' or 'b' cases.

 To reproduce the error, it seems to be enough to let varnishd and a log-
 reading tool run until one or the other value appears. varnishlog itself
 frequently shows '-' in the 'c'/'b' column, although it's clearly either a
 client or backend entry; but varnishlog simply passes over calls in which
 fd > 65535 (and hence may be suppressing entries when fd is not set
 correctly).

 A number of things suggest to me that a memory barrier is lacking,
 somewhere between writing these two values to the SHM log and reading
 them, although I haven't been able to prove it by adding one of the V*MB()
 calls to the code.

 I've tried forcing core dumps when either of the two uninitialized values
 are seen in VSL_Dispatch, but then when I read the core dump afterward,
 the correct values are there. Also, when I use varnishlog -w to save SHM
 contents to file, the correct values appear in the saved log although the
 VSL_Dispatch call of another process saw the uninitialized value(s) for
 the same entries. In both cases, the data in memory is evidently fresh by
 the time it is written to file, but not when read for the call to
 VSL_Dispatch.

 And the problem appears to happen less often when Varnish is under a
 heavier load. My guess is that under high load, the varnishd process,
 writing to the SHM log, is consistently further ahead in the log than the
 VSL reading process, so when the VSL reader "catches up", log contents
 have had time to become fresh. But when the load is low, the VSL reader
 accesses a location in the SHM log very soon after it has been written,
 and thus is more likely to encounter stale data.

 One of our two tools cannot work correctly unless the fd parameter has a
 correct value, and it's seeing the uninitialized values on the order of
 tens of thousands of times a day on a live site (in beta, so that the load
 is still low). So the impact is fairly severe (not to mention the
 information that users of varnishlog are presumably not seeing).

-- 
Ticket URL: <https://www.varnish-cache.org/trac/ticket/1330>
Varnish <https://varnish-cache.org/>
The Varnish HTTP Accelerator




More information about the varnish-bugs mailing list