[ 
https://issues.apache.org/jira/browse/ARTEMIS-4212?focusedWorklogId=855931&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-855931
 ]

ASF GitHub Bot logged work on ARTEMIS-4212:
-------------------------------------------

                Author: ASF GitHub Bot
            Created on: 10/Apr/23 18:22
            Start Date: 10/Apr/23 18:22
    Worklog Time Spent: 10m 
      Work Description: jbertram commented on code in PR #4421:
URL: https://github.com/apache/activemq-artemis/pull/4421#discussion_r1161962013


##########
artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java:
##########
@@ -1742,49 +1743,80 @@ public Transaction getCurrentTransaction() {
       return tx;
    }
 
-
    @Override
-   public boolean checkAutoCreate(SimpleString address, RoutingType 
routingType) throws Exception {
-      boolean result;
-      SimpleString unPrefixedAddress = removePrefix(address);
+   public AutoCreateResult checkAutoCreate(QueueConfiguration queueConfig) 
throws Exception {
+      AutoCreateResult result;
+      SimpleString unPrefixedAddress = removePrefix(queueConfig.getAddress());
       AddressSettings addressSettings =  
server.getAddressSettingsRepository().getMatch(unPrefixedAddress.toString());
 
-      if (routingType == RoutingType.MULTICAST) {
-         if (server.getAddressInfo(unPrefixedAddress) == null) {
-            if (addressSettings.isAutoCreateAddresses()) {
+      /*
+       *
+       */
+      if (queueConfig.getRoutingType() == null) {
+         return AutoCreateResult.EXISTED;
+      }
+
+      // No matter what routingType is used the address must exist already or 
be automatically created
+      AddressInfo addressInfo = server.getAddressInfo(unPrefixedAddress);
+      if (addressInfo == null) {
+         // the address doesn't exist
+         if (addressSettings.isAutoCreateAddresses() || 
queueConfig.isTemporary()) {
+            // try to create the address if possible
+            try {
+               createAddress(queueConfig.getAddress(), 
queueConfig.getRoutingType(), true).setTemporary(queueConfig.isTemporary());
+            } catch (ActiveMQAddressExistsException e) {
+               // The address may have been created by another thread in the 
mean time.  Catch and do nothing.
+            }
+            result = AutoCreateResult.CREATED;
+         } else {
+            // if the address doesn't exist and can't be autocreated then 
return false immediately
+            return AutoCreateResult.NOT_FOUND;
+         }
+      } else {
+         // the address exists
+         if 
(addressInfo.getRoutingTypes().contains(queueConfig.getRoutingType())) {
+            // the existing address supports the requested routingType
+            result = AutoCreateResult.EXISTED;
+         } else {
+            // the existing address doesn't support the requested routingType
+            if (addressSettings.isAutoCreateAddresses() || 
queueConfig.isTemporary()) {
+               // try to update the address with the new routingType if 
possible
                try {
-                  createAddress(address, routingType, true);
+                  
createAddress(addressInfo.addRoutingType(queueConfig.getRoutingType()), true);
                } catch (ActiveMQAddressExistsException e) {
                   // The address may have been created by another thread in 
the mean time.  Catch and do nothing.
                }
-               result = true;
+               result = AutoCreateResult.UPDATED;
             } else {
-               result = false;
+               // if the address exists but doesn't support the requested 
routingType and can't be updated with the new routingType then return false 
immediately
+               return AutoCreateResult.NOT_FOUND;
             }
-         } else {
-            result = true;
          }
-      } else if (routingType == RoutingType.ANYCAST) {
+      }
+
+      if (queueConfig.getRoutingType() == RoutingType.ANYCAST) {
          if (server.locateQueue(unPrefixedAddress) == null) {
-            Bindings bindings = 
server.getPostOffice().lookupBindingsForAddress(address);
+            // the queue doesn't exist
+            Bindings bindings = 
server.getPostOffice().lookupBindingsForAddress(queueConfig.getAddress());
             if (bindings != null) {
                // this means the address has another queue with a different 
name, which is fine, we just ignore it on this case
-               result = true;
-            } else if (addressSettings.isAutoCreateQueues()) {
+               result = AutoCreateResult.EXISTED;
+            } else if (addressSettings.isAutoCreateQueues() || 
queueConfig.isTemporary()) {
+               // try to create the queue
                try {
-                  createQueue(new 
QueueConfiguration(address).setRoutingType(routingType).setAutoCreated(true));
+                  createQueue(queueConfig.setAutoCreated(true));

Review Comment:
   Fixed.





Issue Time Tracking
-------------------

    Worklog Id:     (was: 855931)
    Time Spent: 1h 50m  (was: 1h 40m)

> Unexpected Behavior when Routing Type of Destinations Doesn't Match Clients
> ---------------------------------------------------------------------------
>
>                 Key: ARTEMIS-4212
>                 URL: https://issues.apache.org/jira/browse/ARTEMIS-4212
>             Project: ActiveMQ Artemis
>          Issue Type: Improvement
>            Reporter: Justin Bertram
>            Assignee: Justin Bertram
>            Priority: Major
>          Time Spent: 1h 50m
>  Remaining Estimate: 0h
>
> When the routing type of an address (and associated queue) does not match the 
> routing type of a client producer, the resultant behavior is a bit unexpected.
> Expected Behavior:
> If a client sends a message to an address / queue with the same name, but a 
> different routing type, the expected behavior would be to throw some sort of 
> InvalidDestinationException (if auto-create is not enabled), or to create the 
> matching address and queue with the appropriate routing type. The routing 
> count on the existing address (with non-matching routing type) should remain 
> unchanged.
> Actual Behavior:
> When sending, for example, to a predefined anycast address and queue from a 
> multiccast (Topic) producer, the routed count on the address is incremented, 
> but the message count on the matching queue is not. No indication is given at 
> the client end that the messages failed to get routed - they are silently 
> dropped.
> This is reproducible using a qpid / proton queue producer to send to a 
> multicast address or using a topic producer to send to an anycast address, 
> e.g.:
> 1. Create a a broker, setting auto-create-queues and auto-create addresses to 
> "false" for the catch-all address-setting
> 2. Start the broker and create a an address and matching queue with a ANYCAST 
> routing type
> 3. Send 1000 messages to the broker using the same queue name but mismatched 
> routing type:
> {code}
> ./artemis producer --url amqp://localhost:61616 --user admin --password admin 
> --destination topic://{QUEUE NAME} --protocol amqp
> {code}
> No error is emitted and the routing count is incremented by 1000 at the 
> address level, but remains unchanged at the destination level.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to