Skip to content

Commit

Permalink
Merge pull request #61 from johnmbw/jira/solr16165
Browse files Browse the repository at this point in the history
SOLR-16165: Rare deadlock in SlotAcc initialization (apache#819)
  • Loading branch information
johnmbw authored Feb 2, 2023
2 parents 98cba7d + 91a6fd5 commit d06ab17
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 60 deletions.
94 changes: 94 additions & 0 deletions solr/core/src/java/org/apache/solr/search/facet/Constants.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
* 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;

import java.io.IOException;
import java.util.function.IntFunction;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.solr.common.util.SimpleOrderedMap;
import org.apache.solr.search.DocSet;

/** constants used in facets package */
public class Constants {
public static final SlotAcc.CountSlotAcc DEV_NULL_SLOT_ACC = new DevNullCountSlotAcc();

private Constants() {}

/**
* 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.
*/
private static class DevNullCountSlotAcc extends SlotAcc.CountSlotAcc {

public DevNullCountSlotAcc() {
super(null);
}

@Override
public void resize(Resizer resizer) {
// No-op
}

@Override
public void reset() throws IOException {
// No-op
}

@Override
public void collect(int doc, int slot, IntFunction<SlotContext> slotContext)
throws IOException {
// No-op
}

@Override
public void incrementCount(int slot, int count) {
// No-op
}

@Override
public void setNextReader(LeafReaderContext readerContext) throws IOException {
// No-op
}

@Override
public int collect(DocSet docs, int slot, IntFunction<SlotContext> slotContext)
throws IOException {
return docs.size(); // dressed up no-op
}

@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 void setValues(SimpleOrderedMap<Object> bucket, int slotNum) throws IOException {
throw new UnsupportedOperationException("not supported");
}

@Override
public int getCount(int slot) {
throw new UnsupportedOperationException("not supported");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,11 @@ private SimpleOrderedMap<Object> calcFacets() throws IOException {
if (refineResult != null) {
if (freq.allBuckets) {
// count is irrelevant, but hardcoded in collect(...), so intercept/mask normal counts.
// Set here to prevent createAccs(...) from creating a 1-slot countAcc that will fail with 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;
// Set here to prevent createAccs(...) from creating a 1-slot countAcc that will fail with
// AIOOBE
// NOTE: because collectAcc will be null, it is fine/irrelevant to set a countAcc that
// doesn't support sweeping
countAcc = Constants.DEV_NULL_SLOT_ACC;
createAccs(nDocs, 1);
assert collectAcc == null;
otherAccs = accs; // accs is created above and set on allBucketsAcc; but during collection, setNextReader is called on otherAccs.
Expand Down
57 changes: 0 additions & 57 deletions solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java
Original file line number Diff line number Diff line change
Expand Up @@ -823,63 +823,6 @@ public CountSlotAcc(FacetContext fcontext) {
public abstract int getCount(int slot);
}

/**
* 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) {

@Override
public void resize(Resizer resizer) {
// No-op
}

@Override
public void reset() throws IOException {
// No-op
}

@Override
public void collect(int doc, int slot, IntFunction<SlotContext> slotContext) throws IOException {
// No-op
}

@Override
public void incrementCount(int slot, int count) {
// No-op
}

@Override
public void setNextReader(LeafReaderContext readerContext) throws IOException {
// No-op
}

@Override
public int collect(DocSet docs, int slot, IntFunction<SlotContext> slotContext) throws IOException {
return docs.size(); // dressed up no-op
}

@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 void setValues(SimpleOrderedMap<Object> bucket, int slotNum) throws IOException {
throw new UnsupportedOperationException("not supported");
}

@Override
public int getCount(int slot) {
throw new UnsupportedOperationException("not supported");
}
};

static class CountSlotArrAcc extends CountSlotAcc {
int[] result;

Expand Down

0 comments on commit d06ab17

Please sign in to comment.