I pushed a commit to address items one and three, but the issue with item two is that the range of possible values is bound by an enum that maps to `#defines` in core, both of which are zero indexed (0-14). The item at index zero is the 128 byte buffer size, so if someone in the future uses this struct and does not initialize that field, they may find their implementation lacking in performance because it will default to zero and not 8, which is the actual default.
One solution could be to change the `TSIOBufferSizeIndex` enum and insert a new "undefined" value at zero, and correspondingly bump up all of the `#defined` `BUFFER_SIZE_INDEX_XXX` values by one. We could then rely on the zeroth value to be invalid, and index 1 and forward would be valid. If we do that, we then need to find all the dependencies, including parameters and their input validators in `records.config` related code. Adding a bitmask, constructor, or anything else seems like more work for all callers in the long run when we can just change that enum and the `#defines` to make a value of zero implicitly invalid if a buffer index is not specified when the struct is initialized. Given that the only usage of this struct is currently limited to 1) the wrapper function `TSHttpConnectWithPluginId` that does specify a value in PR #8088, and 2) my changes to slice in PR #8089 that rely on `records.config` parameters, addressing the buffer indexing issue seems like it should be a separate PR. If at some point we can rely on zero being invalid, we can update the code to assert the `buffer_index` member to be non-zero when the field is important to a function using this struct. The way both PRs work currently, it is not possible to provide a invalid/uninitialized value with this struct unless a developer uses it in that manner after this change is committed to the codebase. -- Thanks, Jeff On Wed, Jul 28, 2021 at 8:44 AM Alan Carroll <solidwallofc...@verizonmedia.com.invalid> wrote: > > Yes, that seems in the right direction. A few points: > > 1. If the struct isn't opaque, then it should be passed by pointer, not by > value. > 2. There fields must be optional, e.g. I shouldn't be forced to pick some > value for the buffering. I'm not sure of the best way to do this - a bit > mask? An "invalid" value for each member? > 3. The struct must start with either a version value, or a size value, or > both, so that backwards compatibility can be maintained. > > On Tue, Jul 27, 2021 at 3:59 PM Jeff Elsloo <els...@apache.org> wrote: > > > Hi Alan, > > > > I modified the function I introduced to take an options struct as its > > single argument to reduce the clutter. I added the fields necessary to > > support my work in PR #8088 and will update #8089 if the changes in > > the former are accepted. I did not add a field for transparency as you > > mentioned above, nor am I incorporating any changes to > > `TSHttpConnectTransparent()`, even if it calls > > `PluginVCCore::alloc()`. That call will continue to use the defaults > > until someone has time to refactor and test that function. > > > > Please take a look and let me know if this is along the lines of what > > you're suggesting. With this foundation, we might be able to merge > > `TSHttpConnectTransparent()` into `TSHttpConnectPlugin()` as time > > permits. > > -- > > Thanks, > > Jeff > > > > On Mon, Jul 26, 2021 at 1:07 PM Alan Carroll > > <solidwallofc...@verizonmedia.com.invalid> wrote: > > > > > > There is already a problem where the set of "connect" methods and the > > > options grow without bounds. This first came up with transparency > > (outbound > > > transparent) and now we have it with IOBuffer control. What I'd like is > > to > > > create a new connect function that takes an option structure. This would > > > contain > > > > > > 1. Version/size > > > 2. Plugin ID > > > 3. Transparency > > > 4. IOBuffer controls > > > > > > The advantage is this could be more easily expanded later without > > > restructuring the API. > >