diff options
author | Keith Wall <kwall@apache.org> | 2012-01-13 14:39:37 +0000 |
---|---|---|
committer | Keith Wall <kwall@apache.org> | 2012-01-13 14:39:37 +0000 |
commit | ff60f4550307115bb12b0f7352afc83376d1a87c (patch) | |
tree | a4fbcdcd1c4803917fd0e55fdc9b15dbba75c37c | |
parent | da629e1b983ca730105c1c1443061242da0b9f16 (diff) | |
download | qpid-python-ff60f4550307115bb12b0f7352afc83376d1a87c.tar.gz |
QPID-3697: SortedQueue synchronisation can cause deadlock
Sorted queue enqueue() should lock on a private rather than the lock of the object to avoid the possibility of
a deadlock with a thread performing subscription operations.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1231095 13f79535-47bb-0310-9956-ffa450edef68
4 files changed, 86 insertions, 3 deletions
diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueue.java b/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueue.java index 3f02442704..865b3d1f48 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueue.java +++ b/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueue.java @@ -1,3 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ package org.apache.qpid.server.queue; import java.util.Map; @@ -7,7 +26,11 @@ import org.apache.qpid.server.virtualhost.VirtualHost; public class SortedQueue extends OutOfOrderQueue { - private String _sortedPropertyName; + //Lock object to synchronize enqueue. Used instead of the object + //monitor to prevent lock order issues with subscription sendLocks + //and consumer updates in the super classes + private final Object _sortedQueueLock = new Object(); + private final String _sortedPropertyName; protected SortedQueue(final String name, final boolean durable, final String owner, final boolean autoDelete, final boolean exclusive, @@ -23,8 +46,11 @@ public class SortedQueue extends OutOfOrderQueue return _sortedPropertyName; } - public synchronized void enqueue(ServerMessage message, PostEnqueueAction action) throws AMQException + public void enqueue(ServerMessage message, PostEnqueueAction action) throws AMQException { - super.enqueue(message, action); + synchronized (_sortedQueueLock) + { + super.enqueue(message, action); + } } }
\ No newline at end of file diff --git a/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueueEntryListFactory.java b/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueueEntryListFactory.java index 7a70795e77..87c79178f0 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueueEntryListFactory.java +++ b/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueueEntryListFactory.java @@ -1,3 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ package org.apache.qpid.server.queue; public class SortedQueueEntryListFactory implements QueueEntryListFactory diff --git a/java/broker/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryImplTest.java b/java/broker/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryImplTest.java index 43fb5b4cb3..99e05851ca 100644 --- a/java/broker/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryImplTest.java +++ b/java/broker/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryImplTest.java @@ -1,3 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ package org.apache.qpid.server.queue; import org.apache.qpid.AMQException; diff --git a/java/broker/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryListTest.java b/java/broker/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryListTest.java index 34ad0e5668..d177993886 100644 --- a/java/broker/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryListTest.java +++ b/java/broker/src/test/java/org/apache/qpid/server/queue/SortedQueueEntryListTest.java @@ -1,3 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ package org.apache.qpid.server.queue; import org.apache.qpid.server.message.AMQMessage; |