[ https://issues.apache.org/jira/browse/SYNAPSE-1002?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Ravi Undupitiya updated SYNAPSE-1002: ------------------------------------- Summary: API's with overlapping path segments are dispatched in a non-deterministic manner when they are updated (was: API's are dispatched in a non-deterministic manner when path segments are overlapping) > API's with overlapping path segments are dispatched in a non-deterministic > manner when they are updated > -------------------------------------------------------------------------------------------------------- > > Key: SYNAPSE-1002 > URL: https://issues.apache.org/jira/browse/SYNAPSE-1002 > Project: Synapse > Issue Type: Bug > Components: Core > Affects Versions: 2.1 > Reporter: Ravi Undupitiya > Assignee: Hiranya Jayathilaka > Labels: API, Non-deterministic > Fix For: 2.1, FUTURE > > Attachments: api-nondeterministic-fix.diff > > > i) Create the below API > {code} > <?xml version="1.0" encoding="UTF-8"?> > <api name="testAPI" context="/services/abc/testContext"> > <resource methods="POST GET" uri-template="/{+username}"> > <inSequence> > <log> > <property name="======>;" > expression="get-property("uri.var.username")" /> > </log> > <respond /> > </inSequence> > <outSequence /> > </resource> > <resource methods="POST GET" uri-template="/{+username}/foo"> > <inSequence> > <log> > <property name="======>; foo" > expression="get-property("uri.var.username")" /> > </log> > <respond /> > </inSequence> > <outSequence /> > </resource> > </api> > {code} > 2) Send the request following and you'll get the log entry as "response, > ======>; = esb" . > curl -v http://192.168.0.105:8280/services/abc/testContext/esb -H > "Content-Type: application/json" -d {} -X POST > 3) Send the request following and you will get the log entry as "request, > ======>; foo = esb" > curl -v http://192.168.0.105:8280/services/abc/testContext/esb/foo -H > "Content-Type: application/json" -d {} -X POST > 4) Update one of the resources. > 5) Note that the resource selection behavior is not deterministic. > This non-deterministic dispatching can be an issue and it is happening due to > the use of a Set as the collection that holds resources. To fix this issue we > can use an ordered set like SortedSet however this provides log\(n\) time for > add operations and since this set is created for every request, a better > solution is to use LinkedHashSet which has better performance. However > LinkedHashSet will only guarantee insertion order (so if the resources are > swapped in the configuration, we will again see a different behavior). > A similar fix has been done to maintain resource ordering by using > LinkedHashMap which also only guarantees insertion order. > Based on this, I've attach a diff that uses a LinkedHashSet to overcome this > issue. -- This message was sent by Atlassian JIRA (v6.3.4#6332) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@synapse.apache.org For additional commands, e-mail: dev-h...@synapse.apache.org