I would rather see TSDebug be optimized and exposing diags instead of creating a new type of debug.
-Bryan > On Jun 12, 2019, at 9:44 AM, Walt Karas <wka...@verizonmedia.com.INVALID> > wrote: > > I don't believe so. The issue I'm trying to address is that there is still > significant execution time overhead for debug output calls when > proxy.config.diags.debug.enabled is 0. This change would make the > execution time overhead negligible (if TSFastDbg is used or TSDebug is > changed to be like the proposed TSFastDbg). Another way of putting it is, > I want to clean up the existing TSDEBUG alternative to TSDebug. > > On Wed, Jun 12, 2019 at 11:31 AM Bryan Call <bc...@apache.org> wrote: > >> How would this be controlled on the command line when running >> trafic_server -T? >> >> It looks like it is a departure from how debug tags and controlled now. >> >> -Bryan >> >> >>> On Jun 11, 2019, at 1:21 PM, Walt Karas <wka...@verizonmedia.com.INVALID> >> wrote: >>> >>> Any +1's for simply replacing TSDebug with the proposed TSFastDbg ? >>> >>> On Mon, Apr 8, 2019 at 6:20 PM Leif Hedstrom <zw...@apache.org> wrote: >>> >>>> >>>> >>>> On Apr 4, 2019, at 8:05 AM, Walt Karas <wka...@verizonmedia.com >> .INVALID> >>>> wrote: >>>> >>>> Because senility. probably "on" should be a non-pointer of type const >>>> volatile char, and InkAPI in the core can just keep a pointer to the >> whole >>>> structure for updating. >>>> >>>> But I'm leaning more to fixing up the capability that already kinda >> there. >>>> Which is optimizimg only for the case when all debug output is disabled. >>>> Especially since maybe zwoop would be on my side for once :o) . >>>> >>>> >>>> >>>> My bad, whatever Walt said, I take the opposite stance. >>>> >>>> — leif >>>> >>>> P.s >>>> J/K! >>>> >>>> >>>> On Thu, Apr 4, 2019 at 8:51 AM Alan Carroll >>>> <solidwallofc...@verizonmedia.com.invalid> wrote: >>>> >>>> This could enable a significant speed up for debug tags. One point is >> that >>>> when the debug tag string is set, at that point the debug objects could >> be >>>> updated to the correct state according to the debug tag string, rather >> than >>>> checking it every time a debug message is logged. >>>> >>>> I have to ask, why is there a pointer to the enable flag, instead of >> just >>>> the enable flag? Your logic doesn't even check that flag, it checks >> whether >>>> the pointer is null. >>>> >>>> On Wed, Apr 3, 2019 at 11:52 AM Leif Hedstrom <zw...@apache.org> wrote: >>>> >>>> >>>> >>>> On Apr 3, 2019, at 10:47 AM, Walt Karas <wka...@verizonmedia.com >>>> >>>> .INVALID> >>>> >>>> wrote: >>>> >>>> >>>> It looks like the TS API already has less granular version of this: >>>> >>>> extern int diags_on_for_plugins; >>>> >>>> #define TSDEBUG \ >>>> >>>> if (diags_on_for_plugins) \ >>>> >>>> TSDebug >>>> >>>> >>>> A problem with this is if you write: >>>> >>>> >>>> if (flag) >>>> >>>> TSDEBUG(yadayada); >>>> >>>> else >>>> >>>> do_something(); >>>> >>>> >>>> then the else will be associated with the if hidden in the macro. I'd >>>> prefer to change to something like: >>>> >>>> >>>> extern const volatile char TS_detail_dbg_output_enabled; >>>> >>>> >>>> #define TSFastDbg(_TAG, ...) \ >>>> do { \ >>>> if (TS_detail_dbg_output_enabled) \ >>>> TSDebug(_TAG, __VA_ARGS__); \ >>>> >>>> } while(0) >>>> >>>> >>>> Yeh, that kinda sounds like a bug, doesn’t it? >>>> >>>> >>>> The negative is that we'd only see the benefit when all debug output >>>> >>>> was >>>> >>>> disabled. But, in any case, that is the main benefit, to avoid impacts >>>> during normal operation. >>>> >>>> >>>> Right, we should always optimize for the common cases, obviously. When >>>> there’s a decision to make, where you can either make it “equally” >>>> expensive always, or more expensive in a rare case, but cheaper in the >>>> common case, we should likely chose the latter. >>>> >>>> >>>> >>>> >>>> Looking in src/tscore/Diags.cc, it looks like the debug enable flag is >>>> >>>> only >>>> >>>> set at startup time. So we wouldn't be able to enable TSFastDbg using >>>> traffic_cntl without adding complexity. >>>> >>>> On Tue, Apr 2, 2019 at 5:48 PM Walt Karas <wka...@verizonmedia.com> >>>> >>>> wrote: >>>> >>>> >>>> Add this new structure to apidefs.h: >>>> >>>> typedef struct TSFastDbgCntl_ >>>> { >>>> const char * const tag; // nul-terminated string >>>> const volatile char * const on; // pointer to 1-byte flag >>>> } >>>> TSFastDbgCntl; >>>> >>>> Add this new API function, that returns a pointer to an instance of >>>> >>>> the >>>> >>>> above structure: >>>> >>>> TSFastDbgCntl * TSCreateFastDbgCntl(const char *tag); >>>> >>>> Add this macro, which would be used in place of direct use of >>>> >>>> TSDebug(). >>>> >>>> >>>> #define TSFastDbg(_FD_CNTL, ...) \ >>>> do { \ >>>> if ((_FD_CNTL)->on) \ >>>> TSDebug((_FD_CNTL)->tag, __VA_ARGS__); \ >>>> } while(0) >>>> >>>> The first parameter to TSFastDbg() is a pointer that was returned by >>>> TSCreateFastDbgCntl(). The remaining parameters are printf parameters >>>> (format string and values matching format specifiers). The core would >>>> >>>> be >>>> >>>> responsible for changing the value of the 'on' fields in the >>>> >>>> TSFastDbgCntl >>>> >>>> instances. For direct calls to TSDebug(), even if the tag is >>>> >>>> disabled, >>>> >>>> all >>>> >>>> the parameters have to be prepared and pushed onto the stack. As was >>>> discussed in IRC, you have to feel guilty about doing converting a >>>> string_view to a string and outputting it with c_str(). Because the >>>> >>>> code >>>> >>>> to do this will be executed even if the debug tag is disabled. >>>> Furthermore, for each call to TSDebug, it's necessary to do an >>>> >>>> associative >>>> >>>> lookup on the tag string to determine that output for the tag is >>>> >>>> disabled. >>>> >>>> >>>> We would want to put equivalent capabilities in Diags.h in the core >>>> >>>> for >>>> >>>> debug output. The implementation is non-trivial, but I think it would >>>> >>>> take >>>> >>>> at most a week including the Au test additions. >>>> >>>> I looked at making TSFastDbg() an inline function rather than a macro: >>>> https://godbolt.org/z/IfVbBk >>>> The opitimization works well if you compile the code with the inline >>>> function as C, but the optimization is poor if you compile it as C++. >>>> >>>> This >>>> >>>> difference exists for both gcc and clang. It's weird. >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >> >>