-
Notifications
You must be signed in to change notification settings - Fork 15
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Idempotency for duplicate quote request #2119
Comments
@tullon - to confirm, are these two requests exactly the same? If thats the case, the team's initial impression is that there shouldn't be an error message if they're exactly the same.. However, if there's even a minor change, then the error message should be expected (as there's a modification)... Please confirm and then someone can try to reproduce this... |
@elnyry-sam-k I am going to update with more information that we have got from further testing, which should be more helpful to process the bug. |
Thanks @tullon .. |
Idempotency on Quotes: We have revisited testing on quotes with the following further notes:
------------- At this point, Payer_DFSP has failed that request, but FXP is still waiting for response ------------------------------
ii. Non-Forex How does idempotency relate? Expected Behavior: |
Thanks again, for the details @tullon ... As you rightly pointed out, there are some nuances we need to take into account here. Mojaloop quoting-service is designed to work in two modes: 1) A pass-through mode and 2) A persistent mode (I believe Mowali uses this). In the pass-through mode, as you pointed out, the Switch is primarily a pass-through service (for quotes) and just mediates the messages based on the headers. In the persistent mode, it still relies on the FSP (payee FSP) side for most of the decisions (quotes only) but the data is persisted and there are capabilities to apply/enforce rules as configured.. In any case, the API definition terminology of client-server applies to an entity and its neighboring entity, so in this case, (I believe) the Switch is the server, though for any data requirements, it relies on the FSP on the other side for queries or errors, etc. TL;DR - I think duplicate handling has been designed to work on the quoting-service on both modes and should work.. This seems to be a bug to me. (Also, while noting that the concepts of FXP, vDFSPs are a bit new to the ML open source space.) |
Hi Sam, We are totally on the same understanding, thank you. Pardon the infusion of FXP/vDFSP in this scenario, but these just represent the payee DFSP in a forex scenario, as currently implemented by Mowali. So our scenario should not bring any confusion whether Mowali is "talking" to an independent remote payee DFSP, or a virtual DFSP helping to facilitate forex quotes/transfers for a payee DFSP. Hope this makes sense? Rgds |
FYI, vDFSP is implemented using the SDK as well as the remote DFSP involved in one of the tests. |
Planning to further investigate this during the current Sprint (13.5) |
Hello Sam, @elnyry-sam-k |
Hi @KadidiaN , thanks for the reminder, we've prioritized it for this sprint 14.1.. will keep you posted.. |
How Quoting Service handles duplicates
AnalysisBased on Mojaloop FSPIOP Specification, section 3.2.5.1:
Note: Additionally, the use of the term I believe the term RecommendationMy recommendation is to change the Quoting Service behaviours to follow Mojaloop FSPIOP Specification, section 3.2.5.1: a. Ignore DUPLICATE |
Thanks Miguel. The behavior in "simple routing mode" seems fair, since there's no storage of anything.. But we need to look at the persistent mode behavior of forwarding duplicate (resend) requests.. |
@tullon it's worth mentioning that on I believe that your issue would be fixed if this change was done for the FXP service. This would similarly be applicable for any "FSP" Service receiving a |
Hello Miguel,
In "PERSISTENT MODE" the following has been observed:
2.1. When receiving a DUPLICATE POST request that matches the original request, the Quoting Service will forward the request from the Payer to the Payee without modification. It will do this regardless if the Quote was completed (i.e. received a PUT callback).
Is that the expected behavior ? I think that what is documented is that it will either send back the same response or hold onto it if the object doesn't has an updated status.
If it forwards to the payee, do you know how is the payee handling?
Step 9: FXP (vDFSP1) generates an error on this duplicate request and sends back to switch ({\"errorInformation\":{\"errorCode\":\"2001\",\"errorDescription\":\"Internal server error\"}}",)
@tullon<https://github.com/tullon> it's worth mentioning that on Step 9, I believe that the FXP service is not functioning as per Spec. It should also be implementing the same kind of logic as per Mojaloop FSPIOP Specification, section 3.2.5.1<https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#3251-duplicate-analysis-in-server-on-receiving-a-http-post-request>. I.e. it should not be responding if the Quote is still in a "PENDING" state as per Mojaloop FSPIOP Specification, section 6.5.6.<https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#656-states>.
I believe that your issue would be fixed if this change was done for the FXP service.
I agree , but I think the FXP is implemented using the SDK the same that the simulators are using that 's why we wanted to check if the current DFSP participant SDK supports idempotency let's say as a payee for instance.
Kadidia
…________________________________
From: Miguel de Barros ***@***.***>
Sent: Wednesday, May 5, 2021 5:52 AM
To: mojaloop/project ***@***.***>
Cc: Kadidia NIANGADO ***@***.***>; Mention ***@***.***>
Subject: Re: [mojaloop/project] Idempotency not working for duplicate quote request (#2119)
Step 9: FXP (vDFSP1) generates an error on this duplicate request and sends back to switch ({\"errorInformation\":{\"errorCode\":\"2001\",\"errorDescription\":\"Internal server error\"}}",)
@tullon<https://github.com/tullon> it's worth mentioning that on Step 9, I believe that the FXP service is not functioning as per Spec. It should also be implementing the same kind of logic as per Mojaloop FSPIOP Specification, section 3.2.5.1<https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#3251-duplicate-analysis-in-server-on-receiving-a-http-post-request>. I.e. it should not be responding if the Quote is still in a "PENDING" state as per Mojaloop FSPIOP Specification, section 6.5.6.<https://docs.mojaloop.io/mojaloop-specification/fspiop-api/documents/API%20Definition%20v1.1.html#656-states>.
I believe that your issue would be fixed if this change was done for the FXP service.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub<#2119 (comment)>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/ATF7CAD2QM2RJ6QFY7RLPNDTMEINXANCNFSM4ZGEXLEQ>.
|
This is correct, this how is what I observed when testing the "DUPLICATE" functionality. This will occur for either
Yes, refer to Mojaloop FSPIOP Specification, section 3.2.5.1. This describes how a "server" should handle the incoming
That is a good question. I only validated the DUPLICATE functionality against the Quoting Service and did not include any FSPs (i.e. simulators) using the SDK. I will investigate this and provide some feedback. |
Confirmed how a DUPLICATE Logs from the Quoting Service receiving a DUPLICATE 2021-05-07T12:20:09.208Z - �[32minfo�[39m: 2021-05-07T12:20:09.208Z, (1620390009182:dev2-quoting-service-c68fcf99c-8nfbk:18:koa6xzln:10004) [quotesmodel]: Check duplicate for quoteId 67b91cab-203a-4a81-b5a8-536016d2dd03 returned: { isResend: true, isDuplicateId: true }
2021-05-07T12:20:09.209Z - �[32minfo�[39m: 2021-05-07T12:20:09.209Z, (1620390009182:dev2-quoting-service-c68fcf99c-8nfbk:18:koa6xzln:10004) [quotesmodel]: Handling resend of quoteRequest: {
quoteId: '67b91cab-203a-4a81-b5a8-536016d2dd03',
transactionId: '2cf54810-a720-499e-95a4-26caa7731233',
payer: {
partyIdInfo: {
partyIdType: 'MSISDN',
partyIdentifier: '44123456789',
fspId: 'testingtoolkitdfsp'
},
personalInfo: { complexName: [Object], dateOfBirth: '1984-01-01' }
},
payee: {
partyIdInfo: {
partyIdType: 'MSISDN',
partyIdentifier: '27713803912',
fspId: 'payeefsp'
}
},
amountType: 'RECEIVE',
amount: { amount: '100', currency: 'USD' },
transactionType: {
scenario: 'TRANSFER',
initiator: 'PAYER',
initiatorType: 'CONSUMER'
},
note: 'test'
} from testingtoolkitdfsp to payeefsp Logs showing Quoting Service forwarding the DUPLICATE 2021-05-07T12:20:09.217Z - �[32minfo�[39m: 2021-05-07T12:20:09.217Z, (1620390009182:dev2-quoting-service-c68fcf99c-8nfbk:18:koa6xzln:10004) [quotesmodel]: Forwarding quote request to endpoint: http://dev2-sim-payeefsp-scheme-adapter:4000/quotes
2021-05-07T12:20:09.218Z - �[32minfo�[39m: 2021-05-07T12:20:09.218Z, (1620390009182:dev2-quoting-service-c68fcf99c-8nfbk:18:koa6xzln:10004) [quotesmodel]: Forwarding request : {
method: 'POST',
url: 'http://dev2-sim-payeefsp-scheme-adapter:4000/quotes',
data: '{"quoteId":"67b91cab-203a-4a81-b5a8-536016d2dd03","transactionId":"2cf54810-a720-499e-95a4-26caa7731233","payer":{"partyIdInfo":{"partyIdType":"MSISDN","partyIdentifier":"44123456789","fspId":"testingtoolkitdfsp"},"personalInfo":{"complexName":{"firstName":"Firstname-Test","lastName":"Lastname-Test"},"dateOfBirth":"1984-01-01"}},"payee":{"partyIdInfo":{"partyIdType":"MSISDN","partyIdentifier":"27713803912","fspId":"payeefsp"}},"amountType":"RECEIVE","amount":{"amount":"100","currency":"USD"},"transactionType":{"scenario":"TRANSFER","initiator":"PAYER","initiatorType":"CONSUMER"},"note":"test"}',
headers: {
'Content-Type': 'application/vnd.interoperability.quotes+json;version=1.0',
Date: 'Fri, 07 May 2021 12:15:14 GMT',
'FSPIOP-Source': 'testingtoolkitdfsp',
'FSPIOP-Destination': 'payeefsp',
Accept: 'application/vnd.interoperability.quotes+json;version=1.0',
traceparent: '00-aabb3909fcab3cd8080d37b6b2b65980-48e4ade9b3b222d7-30',
tracestate: 'mojaloop=eyJzcGFuSWQiOiI0OGU0YWRlOWIzYjIyMmQ3In0='
}
} Logs from Quoting 2021-05-07T12:20:09Z, [log,info] data: got a `PUT /quotes/{id}/error` callback: {
errorInformation: { errorCode: '2000', errorDescription: 'Generic server error' }
} Logs from Quoting Service forwarding PUT /quotes/{id}/error 2021-05-07T12:20:09.335Z - �[32minfo�[39m: 2021-05-07T12:20:09.335Z, (1620390009303:dev2-quoting-service-c68fcf99c-8nfbk:18:koa6xzln:10005) [quotesmodel]: Making error callback to participant 'testingtoolkitdfsp' for quoteId '67b91cab-203a-4a81-b5a8-536016d2dd03' to http://dev2-ml-testing-toolkit-backend:5000/quotes/67b91cab-203a-4a81-b5a8-536016d2dd03/error for error: {
message: 'Generic server error',
replyTo: undefined,
apiErrorCode: {
code: '2000',
message: 'Generic server error',
httpStatusCode: 500
},
extensions: undefined,
cause: undefined
}
2021-05-07T12:20:09.356Z - �[32minfo�[39m: 2021-05-07T12:20:09.356Z, (1620390009303:dev2-quoting-service-c68fcf99c-8nfbk:18:koa6xzln:10005) [quotesmodel]: Error callback got response 200 OK Here is the log from the SDK-Scheme-Adapter: {"ts":"2021-05-07T12:20:09.224Z","msg":"Executing HTTP POST","ctx":{"simulator":"payeefsp","hostname":"dev2-sim-payeefsp-scheme-adapter-644d98b9fc-k8cvh","app":"mojaloop-sdk-inbound-api","component":"api","request":{"id":"deafening-sneeze-cooing-hall","path":"/quotes","method":"POST"},"reqOpts":{"method":"POST","uri":"http://dev2-sim-payeefsp-backend:3000/quoterequests","headers":{"Content-Type":"application/json","Accept":"application/json","Date":"Fri, 07 May 2021 12:20:09 GMT"},"body":"{\"quoteId\":\"67b91cab-203a-4a81-b5a8-536016d2dd03\",\"transactionId\":\"2cf54810-a720-499e-95a4-26caa7731233\",\"to\":{\"idType\":\"MSISDN\",\"idValue\":\"27713803912\"},\"from\":{\"idType\":\"MSISDN\",\"idValue\":\"44123456789\",\"dateOfBirth\":\"1984-01-01\",\"firstName\":\"Firstname-Test\",\"lastName\":\"Lastname-Test\"},\"amountType\":\"RECEIVE\",\"amount\":\"100\",\"currency\":\"USD\",\"transactionType\":\"TRANSFER\",\"initiator\":\"PAYER\",\"initiatorType\":\"CONSUMER\",\"note\":\"test\"}"}}}
{"ts":"2021-05-07T12:20:09.224Z","msg":"Request processed","ctx":{"simulator":"payeefsp","hostname":"dev2-sim-payeefsp-scheme-adapter-644d98b9fc-k8cvh","app":"mojaloop-sdk-inbound-api","component":"api","request":{"id":"deafening-sneeze-cooing-hall","path":"/quotes","method":"POST"}}}
{"ts":"2021-05-07T12:20:09.225Z","msg":"Cache message received on channel __keyevent@0__:set. Making callback with id 0","ctx":{"simulator":"payeefsp","hostname":"dev2-sim-payeefsp-scheme-adapter-644d98b9fc-k8cvh","component":"cache"}}
{"ts":"2021-05-07T12:20:09.225Z","msg":"Received Redis keyevent notification","ctx":{"simulator":"payeefsp","hostname":"dev2-sim-payeefsp-scheme-adapter-644d98b9fc-k8cvh","app":"mojaloop-sdk-test-api","component":"websocket-server","key":"request_67b91cab-203a-4a81-b5a8-536016d2dd03","channel":"__keyevent@0__:set","id":"0"}}
{"ts":"2021-05-07T12:20:09.271Z","msg":"Error in quoteRequest","ctx":{"simulator":"payeefsp","hostname":"dev2-sim-payeefsp-scheme-adapter-644d98b9fc-k8cvh","app":"mojaloop-sdk-inbound-api","component":"api","request":{"id":"deafening-sneeze-cooing-hall","path":"/quotes","method":"POST"},"err":"{\"msg\":\"Request returned non-success status code 500\",\"res\":{\"statusCode\":500,\"headers\":{\"content-type\":\"application/json; charset=utf-8\",\"content-length\":\"46\",\"date\":\"Fri, 07 May 2021 12:20:09 GMT\",\"connection\":\"keep-alive\"},\"data\":{\"statusCode\":\"2000\",\"message\":\"Server error\"},\"originalRequest\":{\"method\":\"POST\",\"host\":\"dev2-sim-payeefsp-backend\",\"port\":\"3000\",\"path\":\"/quoterequests\",\"headers\":{\"Content-Type\":\"application/json\",\"Accept\":\"application/json\",\"Date\":\"Fri, 07 May 2021 12:20:09 GMT\",\"content-length\":433},\"agent\":\"[REDACTED]\",\"body\":\"{\\\"quoteId\\\":\\\"67b91cab-203a-4a81-b5a8-536016d2dd03\\\",\\\"transactionId\\\":\\\"2cf54810-a720-499e-95a4-26caa7731233\\\",\\\"to\\\":{\\\"idType\\\":\\\"MSISDN\\\",\\\"idValue\\\":\\\"27713803912\\\"},\\\"from\\\":{\\\"idType\\\":\\\"MSISDN\\\",\\\"idValue\\\":\\\"44123456789\\\",\\\"dateOfBirth\\\":\\\"1984-01-01\\\",\\\"firstName\\\":\\\"Firstname-Test\\\",\\\"lastName\\\":\\\"Lastname-Test\\\"},\\\"amountType\\\":\\\"RECEIVE\\\",\\\"amount\\\":\\\"100\\\",\\\"currency\\\":\\\"USD\\\",\\\"transactionType\\\":\\\"TRANSFER\\\",\\\"initiator\\\":\\\"PAYER\\\",\\\"initiatorType\\\":\\\"CONSUMER\\\",\\\"note\\\":\\\"test\\\"}\"}}}"}}
{"ts":"2021-05-07T12:20:09.272Z","msg":"Sending error response to testingtoolkitdfsp","ctx":{"simulator":"payeefsp","hostname":"dev2-sim-payeefsp-scheme-adapter-644d98b9fc-k8cvh","app":"mojaloop-sdk-inbound-api","component":"api","request":{"id":"deafening-sneeze-cooing-hall","path":"/quotes","method":"POST"},"mojaloopError":{"errorInformation":{"errorCode":"2000","errorDescription":"Generic server error"}}}}
{"ts":"2021-05-07T12:20:09.272Z","msg":"JWS Signing request: {\n method: 'PUT',\n uri: 'http://dev2-quoting-service.mojaloop.live/quotes/67b91cab-203a-4a81-b5a8-536016d2dd03/error',\n headers: {\n 'content-type': 'application/vnd.interoperability.quotes+json;version=1.0',\n date: 'Fri, 07 May 2021 12:20:09 GMT',\n 'fspiop-source': 'payeefsp',\n 'fspiop-destination': 'testingtoolkitdfsp'\n },\n body: {\n errorInformation: { errorCode: '2000', errorDescription: 'Generic server error' }\n },\n qs: {},\n agent: Agent {\n _events: [Object: null prototype] {\n free: [Function (anonymous)],\n newListener: [Function: maybeEnableKeylog]\n },\n _eventsCount: 2,\n _maxListeners: undefined,\n defaultPort: 80,\n protocol: 'http:',\n options: { path: null },\n requests: {},\n sockets: {},\n freeSockets: {},\n keepAliveMsecs: 1000,\n keepAlive: false,\n maxSockets: Infinity,\n maxFreeSockets: 256,\n scheduling: 'fifo',\n maxTotalSockets: Infinity,\n totalSocketCount: 0,\n [Symbol(kCapture)]: false\n }\n}","ctx":{"simulator":"payeefsp","hostname":"dev2-sim-payeefsp-scheme-adapter-644d98b9fc-k8cvh","app":"mojaloop-sdk-inbound-api","component":"api","request":{"id":"deafening-sneeze-cooing-hall","path":"/quotes","method":"POST"}}}
{"ts":"2021-05-07T12:20:09.272Z","msg":"Get JWS Signature: {\n method: 'PUT',\n uri: 'http://dev2-quoting-service.mojaloop.live/quotes/67b91cab-203a-4a81-b5a8-536016d2dd03/error',\n headers: {\n 'content-type': 'application/vnd.interoperability.quotes+json;version=1.0',\n date: 'Fri, 07 May 2021 12:20:09 GMT',\n 'fspiop-source': 'payeefsp',\n 'fspiop-destination': 'testingtoolkitdfsp',\n 'fspiop-http-method': 'PUT',\n 'fspiop-uri': '/quotes/67b91cab-203a-4a81-b5a8-536016d2dd03/error'\n },\n body: {\n errorInformation: { errorCode: '2000', errorDescription: 'Generic server error' }\n },\n qs: {},\n agent: Agent {\n _events: [Object: null prototype] {\n free: [Function (anonymous)],\n newListener: [Function: maybeEnableKeylog]\n },\n _eventsCount: 2,\n _maxListeners: undefined,\n defaultPort: 80,\n protocol: 'http:',\n options: { path: null },\n requests: {},\n sockets: {},\n freeSockets: {},\n keepAliveMsecs: 1000,\n keepAlive: false,\n maxSockets: Infinity,\n maxFreeSockets: 256,\n scheduling: 'fifo',\n maxTotalSockets: Infinity,\n totalSocketCount: 0,\n [Symbol(kCapture)]: false\n }\n}","ctx":{"simulator":"payeefsp","hostname":"dev2-sim-payeefsp-scheme-adapter-644d98b9fc-k8cvh","app":"mojaloop-sdk-inbound-api","component":"api","request":{"id":"deafening-sneeze-cooing-hall","path":"/quotes","method":"POST"}}}
{"ts":"2021-05-07T12:20:09.274Z","msg":"Executing HTTP PUT: {\n reqOpts: {\n method: 'PUT',\n uri: 'http://dev2-quoting-service.mojaloop.live/quotes/67b91cab-203a-4a81-b5a8-536016d2dd03/error',\n headers: {\n 'content-type': 'application/vnd.interoperability.quotes+json;version=1.0',\n date: 'Fri, 07 May 2021 12:20:09 GMT',\n 'fspiop-source': 'payeefsp',\n 'fspiop-destination': 'testingtoolkitdfsp',\n 'fspiop-http-method': 'PUT',\n 'fspiop-uri': '/quotes/67b91cab-203a-4a81-b5a8-536016d2dd03/error',\n 'fspiop-signature': '{\"signature\":\"t0JM_GlAw2WseedgyB_PwgdiFWnrJ3FSzAfiSFe97o1yw4H0Nj1c4MDcBz8YS9OnhL_h1Y5wBU0k7GvXSjI57yj2hEUBDuJf3NTOgQTcSFAfo9GVxAtMyv9tqd-yeh73CxMgrkTqCUUwsaH7nX3-6M24Q5cmTd_gXmZdGujknvlFBWxz-mYFHyyi0Z6xcZFjlMv_Xyq7Rrb5gMIQjnY5pN2jzEExvhAGff7LqN5-L4EvPT-4KHV0gzoCK-ipcmjOPqnzXnnKf9s3vCS4dKn2dL4bp1AcRpWUqXqZ15KnJYMa6MqFV4jubuegip3jYIjVQHc8d9qCUVssJ4hSFrn1hw\",\"protectedHeader\":\"eyJhbGciOiJSUzI1NiIsIkZTUElPUC1VUkkiOiIvcXVvdGVzLzY3YjkxY2FiLTIwM2EtNGE4MS1iNWE4LTUzNjAxNmQyZGQwMy9lcnJvciIsIkZTUElPUC1IVFRQLU1ldGhvZCI6IlBVVCIsIkZTUElPUC1Tb3VyY2UiOiJwYXllZWZzcCIsIkZTUElPUC1EZXN0aW5hdGlvbiI6InRlc3Rpbmd0b29sa2l0ZGZzcCIsIkRhdGUiOiJGcmksIDA3IE1heSAyMDIxIDEyOjIwOjA5IEdNVCJ9\"}'\n },\n body: '{\"errorInformation\":{\"errorCode\":\"2000\",\"errorDescription\":\"Generic server error\"}}',\n qs: {},\n agent: '[REDACTED]'\n }\n}","ctx":{"simulator":"payeefsp","hostname":"dev2-sim-payeefsp-scheme-adapter-644d98b9fc-k8cvh","app":"mojaloop-sdk-inbound-api","component":"api","request":{"id":"deafening-sneeze-cooing-hall","path":"/quotes","method":"POST"}}}
{"ts":"2021-05-07T12:20:09.315Z","msg":"Inbound transfers model handled POST /quotes request","ctx":{"simulator":"payeefsp","hostname":"dev2-sim-payeefsp-scheme-adapter-644d98b9fc-k8cvh","app":"mojaloop-sdk-inbound-api","component":"api","request":{"id":"deafening-sneeze-cooing-hall","path":"/quotes","method":"POST"},"response":{"originalRequest":{"method":"PUT","host":"dev2-quoting-service.mojaloop.live","port":"","path":"/quotes/67b91cab-203a-4a81-b5a8-536016d2dd03/error","headers":{"content-type":"application/vnd.interoperability.quotes+json;version=1.0","date":"Fri, 07 May 2021 12:20:09 GMT","fspiop-source":"payeefsp","fspiop-destination":"testingtoolkitdfsp","fspiop-http-method":"PUT","fspiop-uri":"/quotes/67b91cab-203a-4a81-b5a8-536016d2dd03/error","fspiop-signature":"{\"signature\":\"t0JM_GlAw2WseedgyB_PwgdiFWnrJ3FSzAfiSFe97o1yw4H0Nj1c4MDcBz8YS9OnhL_h1Y5wBU0k7GvXSjI57yj2hEUBDuJf3NTOgQTcSFAfo9GVxAtMyv9tqd-yeh73CxMgrkTqCUUwsaH7nX3-6M24Q5cmTd_gXmZdGujknvlFBWxz-mYFHyyi0Z6xcZFjlMv_Xyq7Rrb5gMIQjnY5pN2jzEExvhAGff7LqN5-L4EvPT-4KHV0gzoCK-ipcmjOPqnzXnnKf9s3vCS4dKn2dL4bp1AcRpWUqXqZ15KnJYMa6MqFV4jubuegip3jYIjVQHc8d9qCUVssJ4hSFrn1hw\",\"protectedHeader\":\"eyJhbGciOiJSUzI1NiIsIkZTUElPUC1VUkkiOiIvcXVvdGVzLzY3YjkxY2FiLTIwM2EtNGE4MS1iNWE4LTUzNjAxNmQyZGQwMy9lcnJvciIsIkZTUElPUC1IVFRQLU1ldGhvZCI6IlBVVCIsIkZTUElPUC1Tb3VyY2UiOiJwYXllZWZzcCIsIkZTUElPUC1EZXN0aW5hdGlvbiI6InRlc3Rpbmd0b29sa2l0ZGZzcCIsIkRhdGUiOiJGcmksIDA3IE1heSAyMDIxIDEyOjIwOjA5IEdNVCJ9\"}","content-length":83},"agent":"[REDACTED]","body":"{\"errorInformation\":{\"errorCode\":\"2000\",\"errorDescription\":\"Generic server error\"}}"}}}} Log from Mojaloop-Simulator processing DUPLICATE {
app: �[32m'simulator'�[39m,
msg: �[32m'Rule engine evaluating facts: {\n'�[39m +
�[32m" path: '/quoterequests',\n"�[39m +
�[32m' body: {\n'�[39m +
�[32m" quoteId: '67b91cab-203a-4a81-b5a8-536016d2dd03',\n"�[39m +
�[32m" transactionId: '2cf54810-a720-499e-95a4-26caa7731233',\n"�[39m +
�[32m" to: { idType: 'MSISDN', idValue: '27713803912' },\n"�[39m +
�[32m' from: {\n'�[39m +
�[32m" idType: 'MSISDN',\n"�[39m +
�[32m" idValue: '44123456789',\n"�[39m +
�[32m" dateOfBirth: '1984-01-01',\n"�[39m +
�[32m" firstName: 'Firstname-Test',\n"�[39m +
�[32m" lastName: 'Lastname-Test'\n"�[39m +
�[32m' },\n'�[39m +
�[32m" amountType: 'RECEIVE',\n"�[39m +
�[32m" amount: '100',\n"�[39m +
�[32m" currency: 'USD',\n"�[39m +
�[32m" transactionType: 'TRANSFER',\n"�[39m +
�[32m" initiator: 'PAYER',\n"�[39m +
�[32m" initiatorType: 'CONSUMER',\n"�[39m +
�[32m" note: 'test'\n"�[39m +
�[32m' },\n'�[39m +
�[32m" method: 'POST'\n"�[39m +
�[32m'}'�[39m,
timestamp: �[32m'2021-05-07T12:20:09.229Z'�[39m
} Logs from Mojaloop-Simulator showing the {
app: �[32m'simulator'�[39m,
request: {
id: �[32m'cool-church-thinkable-word'�[39m,
path: �[32m'/quoterequests'�[39m,
method: �[32m'POST'�[39m
},
msg: �[32m'Error in postQuotes: Error: SQLITE_CONSTRAINT: UNIQUE constraint failed: quote.id'�[39m,
timestamp: �[32m'2021-05-07T12:20:09.270Z'�[39m
} Additionally looking at the Mojaloop-Simulator code, we can see that there is no "additional" logic to handle duplicate quotes:
From this, we can see that the DUPLICATE Thus I believe that the issue originating from your FXP Service is NOT generated from the SDK-Scheme-Adapter, but rather the "Backend" implementation. Please validate this on your side. Finally, there is a question here to be answered:
|
Investigation completed, findings documented above and discussed with Mowali team who raised this. |
Summary:
When performing transfers between 2 DFSPs through Mowali, the following behavior is observed in Quote request:
Severity:
Medium
Priority:
Critical
Expected Behavior
A duplicate quote request is supposed to be ignored, as API specs. This will keep the quote alive for payer, payee and hub pending response to the original request. Any error generated terminates the request at one or more actors.
Steps to Reproduce
Specifications
Notes:
The text was updated successfully, but these errors were encountered: