This is an automated email from the ASF dual-hosted git repository. noble pushed a commit to branch jira/solr16165 in repository https://gitbox.apache.org/repos/asf/solr.git
commit 53ef72c1bebed97e249517aeab931ae87e0d01da Author: Noble Paul <[email protected]> AuthorDate: Mon Apr 25 22:32:16 2022 +1000 SOLR-16165: Rare deadlock in SlotAcc initialization --- .../org/apache/solr/search/facet/Constants.java | 23 ++++++ .../search/facet/FacetFieldProcessorByArray.java | 2 +- .../java/org/apache/solr/search/facet/SlotAcc.java | 89 +++++++++++----------- 3 files changed, 70 insertions(+), 44 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/search/facet/Constants.java b/solr/core/src/java/org/apache/solr/search/facet/Constants.java new file mode 100644 index 00000000000..3842415c65a --- /dev/null +++ b/solr/core/src/java/org/apache/solr/search/facet/Constants.java @@ -0,0 +1,23 @@ +/* + * 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.solr.search.facet; + +public class Constants { + public static final SlotAcc.DevNullCountSlotAcc DEV_NULL_SLOT_ACC = new SlotAcc.DevNullCountSlotAcc(); + private Constants() { } +} diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByArray.java b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByArray.java index c52a05a939f..38681bf2070 100644 --- a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByArray.java +++ b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByArray.java @@ -121,7 +121,7 @@ abstract class FacetFieldProcessorByArray extends FacetFieldProcessor { // AIOOBE // NOTE: because collectAcc will be null, it is fine/irrelevant to set a countAcc that // doesn't support sweeping - countAcc = SlotAcc.DEV_NULL_SLOT_ACC; + countAcc = Constants.DEV_NULL_SLOT_ACC; createAccs(nDocs, 1); assert collectAcc == null; // accs is created above and set on allBucketsAcc; but during collection, setNextReader is diff --git a/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java b/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java index 753eeb174ec..05ef90cfb6d 100644 --- a/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java +++ b/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java @@ -844,61 +844,64 @@ public abstract class SlotAcc implements Closeable { * This CountSlotAcc exists as a /dev/null sink for callers of collect(...) and other "write"-type * methods. It should be used in contexts where "read"-type access methods will never be called. */ - static final CountSlotAcc DEV_NULL_SLOT_ACC = - new CountSlotAcc(null) { + static class DevNullCountSlotAcc extends CountSlotAcc { - @Override - public void resize(Resizer resizer) { - // No-op - } + public DevNullCountSlotAcc() { + super(null); + } - @Override - public void reset() throws IOException { - // No-op - } + @Override + public void resize(Resizer resizer) { + // No-op + } - @Override - public void collect(int doc, int slot, IntFunction<SlotContext> slotContext) + @Override + public void reset() throws IOException { + // No-op + } + + @Override + public void collect(int doc, int slot, IntFunction<SlotContext> slotContext) throws IOException { - // No-op - } + // No-op + } - @Override - public void incrementCount(int slot, long count) { - // No-op - } + @Override + public void incrementCount(int slot, long count) { + // No-op + } - @Override - public void setNextReader(LeafReaderContext readerContext) throws IOException { - // No-op - } + @Override + public void setNextReader(LeafReaderContext readerContext) throws IOException { + // No-op + } - @Override - public int collect(DocSet docs, int slot, IntFunction<SlotContext> slotContext) + @Override + public int collect(DocSet docs, int slot, IntFunction<SlotContext> slotContext) throws IOException { - return docs.size(); // dressed up no-op - } + return docs.size(); // dressed up no-op + } - @Override - public Object getValue(int slotNum) throws IOException { - throw new UnsupportedOperationException("not supported"); - } + @Override + public Object getValue(int slotNum) throws IOException { + throw new UnsupportedOperationException("not supported"); + } - @Override - public int compare(int slotA, int slotB) { - throw new UnsupportedOperationException("not supported"); - } + @Override + public int compare(int slotA, int slotB) { + throw new UnsupportedOperationException("not supported"); + } - @Override - public void setValues(SimpleOrderedMap<Object> bucket, int slotNum) throws IOException { - throw new UnsupportedOperationException("not supported"); - } + @Override + public void setValues(SimpleOrderedMap<Object> bucket, int slotNum) throws IOException { + throw new UnsupportedOperationException("not supported"); + } - @Override - public long getCount(int slot) { - throw new UnsupportedOperationException("not supported"); - } - }; + @Override + public long getCount(int slot) { + throw new UnsupportedOperationException("not supported"); + } + }; static class CountSlotArrAcc extends CountSlotAcc { long[] result;
