EMA C++ IProvider downloading dictionary from ADH over the login stream - RWFEnum not downloaded

Hi all,

please help me with this issue.

Context: EMA C++ based application, using an OmmProviderClient that downloads the Data dictionary over the Login connection.

Issue: timeout while downloading the dictionary (RWFFld is downloaded, RWFEnum isn't).

In the context of reqMsg for login request, the application starts the dictionary download as follows:

..registerClient(ReqMsg().name("RWFFld").filter(DICTIONARY_NORMAL).domainType(MMT_DICTIONARY), ..);
..registerClient(ReqMsg().name("RWFEnum").filter(DICTIONARY_NORMAL).domainType(MMT_DICTIONARY), ..);

From the EmaTrace logs, I can see that the application downloads all the 17255 entries expected in RWFFld within a single refresh message, but no messages at all are received for the request on RWFEnum.

After 15 seconds, the application is notified of the following event (I'd say by the EMA engine itself, due to RequestTimeout hit?):

StatusMsg
    streamId="-2"
    domain="Dictionary Domain"
    state="Closed, Recoverable / Suspect / None / 'request is timeout'"
    name="RWFEnum"
    filter="7"
StatusMsgEnd

What could be the reason for this issue? A problem in the code, or something else?


Thanks

Best Regards,

Paolo


Please find an excerpt of the relevant messages exchanged over the connection:

<!-- Incoming Message (Channel IPC descriptor = 19) -->
<!-- Time: 7:22:21:400 -->
<!-- rwfMajorVer="14" rwfMinorVer="1" -->
<requestMsg domainType="RSSL_DMT_LOGIN" streamId="1" containerType="RSSL_DT_NO_DATA" flags="0x4 (RSSL_RQMF_STREAMING)" dataSize="0">
    <key  flags="0x26 (RSSL_MKF_HAS_NAME|RSSL_MKF_HAS_NAME_TYPE|RSSL_MKF_HAS_ATTRIB)"  name="rmds" nameType="1" attribContainerType="RSSL_DT_ELEMENT_LIST">
        <attrib>
            <elementList flags="0x8 (RSSL_ELF_HAS_STANDARD_DATA)">
                <elementEntry name="AllowSuspectData" dataType="RSSL_DT_UINT" data="1"/>
                <elementEntry name="ApplicationId" dataType="RSSL_DT_ASCII_STRING" data="256"/>
                <elementEntry name="DisableDataConversion" dataType="RSSL_DT_UINT" data="0"/>
                <elementEntry name="InstanceId" dataType="RSSL_DT_ASCII_STRING" data="ion"/>
                <elementEntry name="ProvidePermissionExpressions" dataType="RSSL_DT_UINT" data="1"/>
                <elementEntry name="ProvidePermissionProfile" dataType="RSSL_DT_UINT" data="0"/>
                <elementEntry name="Role" dataType="RSSL_DT_UINT" data="0"/>
                <elementEntry name="SingleOpen" dataType="RSSL_DT_UINT" data="0"/>
                <elementEntry name="SingleOpenRequests" dataType="RSSL_DT_UINT" data="0"/>
                <elementEntry name="SupportProviderDictionaryDownload" dataType="RSSL_DT_UINT" data="1"/>
            </elementList>
        </attrib>
    </key>
    <dataBody>
    </dataBody>
</requestMsg>

<!-- Outgoing Message (Channel IPC descriptor = 19) -->
<!-- Time: 7:22:21:401 -->
<!-- rwfMajorVer="14" rwfMinorVer="1" -->
<refreshMsg domainType="RSSL_DMT_LOGIN" streamId="1" containerType="RSSL_DT_NO_DATA" flags="0x68 (RSSL_RFMF_HAS_MSG_KEY|RSSL_RFMF_SOLICITED|RSSL_RFMF_REFRESH_COMPLETE)" groupId="0" dataState="RSSL_DATA_OK" streamState="RSSL_STREAM_OPEN" code="RSSL_SC_NONE" text="Login accepted"  dataSize="0">
    <key  flags="0x26 (RSSL_MKF_HAS_NAME|RSSL_MKF_HAS_NAME_TYPE|RSSL_MKF_HAS_ATTRIB)"  name="rmds" nameType="1" attribContainerType="RSSL_DT_ELEMENT_LIST">
        <attrib>
            <elementList flags="0x0">
            </elementList>
        </attrib>
    </key>
    <dataBody>
    </dataBody>
</refreshMsg>

<!-- Outgoing Message (Channel IPC descriptor = 19) -->
<!-- Time: 7:22:21:401 -->
<!-- rwfMajorVer="14" rwfMinorVer="1" -->
<requestMsg domainType="RSSL_DMT_DICTIONARY" streamId="-1" containerType="RSSL_DT_NO_DATA" flags="0xC4 (RSSL_RQMF_STREAMING|RSSL_RQMF_HAS_QOS|RSSL_RQMF_HAS_WORST_QOS)" qosDynamic="0" qosRate="1" qosTimeliness="1" worstQosDynamic="0" worstQosRate="3" worstQosTimeliness="2" worstQosRateInfo="65535" dataSize="0">
    <key  flags="0xA (RSSL_MKF_HAS_NAME|RSSL_MKF_HAS_FILTER)"  name="RWFFld" filter="7"/>
    <dataBody>
    </dataBody>
</requestMsg>

<!-- Outgoing Message (Channel IPC descriptor = 19) -->
<!-- Time: 7:22:21:401 -->
<!-- rwfMajorVer="14" rwfMinorVer="1" -->
<requestMsg domainType="RSSL_DMT_DICTIONARY" streamId="-2" containerType="RSSL_DT_NO_DATA" flags="0xC4 (RSSL_RQMF_STREAMING|RSSL_RQMF_HAS_QOS|RSSL_RQMF_HAS_WORST_QOS)" qosDynamic="0" qosRate="1" qosTimeliness="1" worstQosDynamic="0" worstQosRate="3" worstQosTimeliness="2" worstQosRateInfo="65535" dataSize="0">
    <key  flags="0xA (RSSL_MKF_HAS_NAME|RSSL_MKF_HAS_FILTER)"  name="RWFEnum" filter="7"/>
    <dataBody>
    </dataBody>
</requestMsg>

<!-- Incoming Message (Channel IPC descriptor = 19) -->
<!-- Time: 7:22:21:409 -->
<!-- rwfMajorVer="14" rwfMinorVer="1" -->
<refreshMsg domainType="RSSL_DMT_DICTIONARY" streamId="-1" containerType="RSSL_DT_SERIES" flags="0x168 (RSSL_RFMF_HAS_MSG_KEY|RSSL_RFMF_SOLICITED|RSSL_RFMF_REFRESH_COMPLETE|RSSL_RFMF_CLEAR_CACHE)" groupId="0" dataState="RSSL_DATA_OK" streamState="RSSL_STREAM_OPEN" code="RSSL_SC_NONE" text=""  dataSize="706983">
    <key  flags="0xA (RSSL_MKF_HAS_NAME|RSSL_MKF_HAS_FILTER)"  name="RWFFld" filter="7"/>
    <dataBody>
        <series  flags="0x7 (RSSL_SRF_HAS_SET_DEFS|RSSL_SRF_HAS_SUMMARY_DATA|RSSL_SRF_HAS_TOTAL_COUNT_HINT)" countHint="17255" containerType="RSSL_DT_ELEMENT_LIST">
            <elementSetDefs>
                <elementSetDef setId="0">
                    <elementSetDefEntry name="NAME" dataType="RSSL_DT_ASCII_STRING" />
                    <elementSetDefEntry name="FID" dataType="RSSL_DT_INT_2" />
                    <elementSetDefEntry name="RIPPLETO" dataType="RSSL_DT_INT_2" />
                    <elementSetDefEntry name="TYPE" dataType="RSSL_DT_INT_1" />
                    <elementSetDefEntry name="LENGTH" dataType="RSSL_DT_UINT_2" />
                    <elementSetDefEntry name="RWFTYPE" dataType="RSSL_DT_UINT_1" />
                    <elementSetDefEntry name="RWFLEN" dataType="RSSL_DT_UINT_2" />
                    <elementSetDefEntry name="ENUMLENGTH" dataType="RSSL_DT_UINT_2" />
                    <elementSetDefEntry name="LONGNAME" dataType="RSSL_DT_ASCII_STRING" />
                </elementSetDef>
            </elementSetDefs>
            <summaryData>
                <elementList flags="0x8 (RSSL_ELF_HAS_STANDARD_DATA)">
                    <elementEntry name="Type" dataType="RSSL_DT_UINT" data="1"/>
                    <elementEntry name="DictionaryId" dataType="RSSL_DT_INT" data="1"/>
                    <elementEntry name="Version" dataType="RSSL_DT_ASCII_STRING" data="4.20.44"/>
                </elementList>
            </summaryData>
            <seriesEntry>
                <elementList flags="0x2 (RSSL_ELF_HAS_SET_DATA)">
                    ...
                </elementList>
            </seriesEntry>
            ...
        </series>
    </dataBody>
</refreshMsg>

// No other messages are sent or received on the RSSL_DMT_DICTIONARY domain

<!-- Outgoing Message (Channel IPC descriptor = 19) -->
<!-- Time: 7:22:36:402 -->
<!-- rwfMajorVer="14" rwfMinorVer="1" -->
<closeMsg domainType="RSSL_DMT_DICTIONARY" streamId="-2" containerType="RSSL_DT_NO_DATA" flags="0x0" dataSize="0">
    <dataBody>
    </dataBody>
</closeMsg>

Best Answer

  • Hi all,

    I've just got to know that the missing download of RWFEnum was caused by an incorrect configuration of the infrastructure.

    Thank you

    Best Regards,

    Paolo

Answers

  • Hello @Paolo Parlapiano ,

    Are you on a recent version of RTSDK?

    If this is the case, I would, as a sanity check, run example EMA Consumer 332 = Dictionary_Streaming.

    It only does that, connects to infra, and downloads both dictionaries.

    So this will allow to verify if both dictionaries are coming back from your infra with this simple example as expected.

    Let us know how this works on your side?

  • Hello @Paolo Parlapiano

    If you can share a small excerpt of code that reproduces the issue, ideally, that can just be applied to one of the simple IProvider examples that come with RTSDK, we can test on our side and try to be of more help.

  • @Paolo Parlapiano

    You may need to specify a service name in the dictionary requests. For example:

        // Open Dictionary streams
            UInt64 fldHandle = provider.registerClient(ReqMsg().name("RWFFld").filter(DICTIONARY_NORMAL).serviceName("DIRECT_FEED").domainType(MMT_DICTIONARY), appClient);


            UInt64 enumHandle = provider.registerClient(ReqMsg().name("RWFEnum").filter(DICTIONARY_NORMAL).serviceName("DIRECT_FEED").domainType(MMT_DICTIONARY), appClient);

    I got the following errors when I didn't specify a service name in the dictionary requests.

    Service Name: <not set>loggerMsg
        TimeStamp: 09:16:27.917
        ClientName: DictionaryHandler
        Severity: Error
        Text:    Dictionary message rejected - invalid dictionary domain message.
            Stream Id -1
            Client handle 2100841332720
            Instance Name Provider_1_1
    loggerMsgEnd


    loggerMsg
        TimeStamp: 09:16:28.494
        ClientName: DictionaryHandler
        Severity: Error
        Text:    Dictionary message rejected - invalid dictionary domain message.
            Stream Id -2
            Client handle 2100841332720
            Instance Name Provider_1_1
    loggerMsgEnd




    Handle: 2100922442128 Closure: 0000000000000000


    Item Name: RWFFld
    Service Name: <not set>
    Item State: Closed, Recoverable / Suspect / None / 'request is timeout'


    Handle: 2100922443104 Closure: 0000000000000000


    Item Name: RWFEnum
    Service Name: <not set>
    Item State: Closed, Recoverable / Suspect / None / 'request is timeout'


  • Hi, thanks for your answers.

    However, I'm suspecting that the issue could be a bit different.

    In this older question https://community.developers.refinitiv.com/questions/48470/iprovider-downloading-dictionary-and-servicenamese.html, I've just asked for info in case a dictionary request must be done, but no serviceName is available in that context, which is exactly this case.

    Furthermore, the strange thing is that in this issue, both the requests (RWFFld, RWFenum) are made without any serviceName specified, and one of them (RWFFld) is actually served.

    One more point: I don't receive any error message in the provider log (the level should be fine since I can see messages with Success severity..).


    Thanks

    Best Regards,

    Paolo

  • @Paolo Parlapiano

    What are the versions of EMA and ADH that you are using?

  • Hello @Paolo Parlapiano and @Jirapongse ,

    I observe the same behavior on my side, as Jirapongse- unable to download the dictionaries without specifying a valid service. The valid service has to be defined on the infra, and only then the two valid dictionaries for it can be downloaded by IProvider successfully .

    @Paolo Parlapiano, are you able to download the two dictionaries, from ADH, by specifying a valid service, using example EMA IProvider 350?

    If not, are you able to download the two dicts from ADS, via EMA Consumer 332?

    Not able to reproduce what you see, on my side.

  • Hello,

    sorry for the delay in answering.

    • the version of ADH is adh3.5.1.L1.linux.rrg 64-bit
    • the version of EMA is 3.6.1.L2

    Thanks

    Best Regards,

    Paolo

  • @Paolo Parlapiano

    I am still unable to replicate this issue with EMA 3.6.1.L2 and ADH3.5.1.L1.

    The IProv350 can retrieve the data dictionary properly.

    Item Name: RWFFld
    Service Name: <not set>
    Item State: Open / Ok / None / ''
    loggerMsg
        TimeStamp: 20:03:06.314
        ClientName: DictionaryHandler
        Severity: Verbose
        Text:    Received dictionary refresh message.
            Stream Id -2
            Client handle 2511766455984
            Instance Name Provider_1_1
    loggerMsgEnd




    Handle: 2511847178928 Closure: 0000000000000000


    Item Name: RWFEnum
    Service Name: <not set>
    Item State: Open / Ok / None / ''


    Dictionary download complete
    Dictionary Id : 1
    Dictionary field version : 4.20.46
    Number of dictionary entries : 15595

    You can try to increase the value in the RequestTimeout configuration in the Provider configuration.

    1660654771434.png


    1660654821183.png

    It may help.

    If you checked the XML trace file and found that ADH didn't send the dictionary response to the provider application, you need to contact the ADH support team to verify the problem.

  • Thanks for the info, I've just asked to make a test using the bigger timeout.

    I'll keep you posted.

    Best Regards,

    Paolo