ioc: check for mis-matched onStartSubscription()/onDisableSubscription()
ioc: fix subscription lifetime
ioc: catch exceptions in dbEvent callbacks
ioc: avoid unnecessary virtual
ioc: minor
ioc: fix qsrv -S
ioc: qsrvGroupSourceInit() catch+log
ioc: runOnServer avoid std::function
ioc: cleanup and simplifications.
Avoid some redundant std::map lookups.
Make Group partially const to prevent implicit ctor.
ioc: avoid typedefs only used once
ioc: overhaul Group::show(). shows triggers
ioc: MappingType
ioc: pvxsgl -> pvxgl
ioc: separate group config singleton from server singleton
ioc: remove unnecessary forward declarations
ioc: restructure pvxsInitHook
ioc: qsrv runtime disable by default
ioc: compat w/ older Base
ioc: link pvxsIoc w/ DB libs
ioc: Channel proper detection of invalid PV
ioc: no need to keep vector<dbCommon*> around
ioc: fix initial group update for mappings w/o dbChannel
ioc: redo testing
split out group tests, only run with Base >= 7.0
ioc: minor
ioc: loc_bad_alloc
ioc: avoid symbol/DTYP clash with pva2pva
ioc: test record alias in group json
ioc: test put failure when SPC_NOMOD and DISP=1
ioc: test channel filters
ioc: unnecessary capture
ioc: avoid sharing Value between multiple subscriptions
It is possible to create two subscriptions through the same channel.
ioc: group subscription include queueSize
ioc: eliminate unused atomicMonitor
ioc: consolidate GroupSource::get()
avoid some indirection
ioc: pvRequest override of atomicPutGet
ioc: fix group non-atomic put
ioc: test asTrap hooks
ioc: test putOrder also sets field order
ioc: simplify GroupConfigProcessor::loadConfigFiles()
Also ensure that groupMapMutex is held
ioc: testqgroup cover JSON def.
ioc: dbLoadGroup() use macros
ioc: pvxsl() take integer argument
ioc: display.form and info(Q:form
ioc: "NO_ALARM" -> ""
ioc: use dbServer
at least for informational callbacks.
ioc: consolidate createRequestAndSubscriptionHandlers()
ioc: eliminate ChannelAndLock
properties dbChannel doesn't need a separate DBManyLock
ioc: test that putOrder also controls field order
ioc: MappingType -> MappingInfo
Handle info(Q:time:tag
Add +type:"const"
ioc: cleanup includes
ioc: test dbNotifyCancel()
ioc: inline checkForTrailingCommentsAtEnd()
Not a full solution, though should prevent test1000
from occasionally leaving evbase workers dangling
> not ok 1001 - Instance leak ServerGPRConnect : 217
> not ok 1002 - Instance leak SharedPVImpl : 984
> not ok 1003 - Instance leak StructTop : 1202
> not ok 1004 - Instance leak UDPListener : 2
> not ok 1005 - Instance leak evbase : 2
> not ok 1006 - Instance leak evbaseRunning : 2
By using `tcp_loop.dispatch` to schedule the initial search for a
channel, we are placing the callback into the same work queue that is
used by e.g. `MonitorBuilder::exec` to schedule the call to
`Channel::build`. In situations where lots of channels are being
created simultaneously this can result in lots of single channel search
requests being sent because the work queue alternates between calls to
build a channel and the initial search.
In this commit we instead use a dedicated `evevent` to schedule the
initial search to allow the `initialSearchBucket` to be filled before we
send the initial search request. We delay the initial search by 10 ms to
give more time for the bucket to be filled. See
github.com/mdavidsaver/pvxs/pull/39 for a discussion of how this delay
was chosen.
When creating a large number of Channels at once, we can end up calling
`ContextImpl::poke(true)` many times in quick succession. This results
in a flood of UDP broadcasts where we are searching for channels that we
only just sent out the initial search request for.
This can easily lead to packets getting lost and us not receiving a
reply for some Channels. Moreover, as we keep resending search requests
for Channels, we reschedule them further and further in the future (as
`nSearch` is increased). After the dust settles and we stop poking,
this can result in a wait of several seconds before a Channel which we
have not found is searched for again.
In this commit we avoid this issue by using a separate bucket to hold
channels waiting for their initial search request. Rather than poking
`tickSearch` to do the initial search and also resend requests for
outstanding channels, we schedule a call to new call `tickSearch` which
will only send the initial search requests. As such, we will avoid
rebroadcasting search requests for channels we have only just searched
for.
We have prompted the `discover` bool to an enum to distinguish between
the now three different situations `tickSearch` can be called in.