question

Upvotes
Accepted
97 8 16 26

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>
ema-apic++elektron-data-dictionaryinteractive-provider
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
Accepted
97 8 16 26

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

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
32.2k 41 11 20

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?

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

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.

Upvote
86k 292 53 78

@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'


icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

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.

Upvotes
97 8 16 26

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

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

@Paolo Parlapiano

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

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

Upvotes
86k 292 53 78

@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.


1660654771434.png (50.2 KiB)
1660654821183.png (51.1 KiB)
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

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

I'll keep you posted.

Best Regards,

Paolo

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.