From 38685f30dc4790741ceea90191517d0c84ba858e Mon Sep 17 00:00:00 2001 From: Mike McCandless Date: Wed, 30 Aug 2017 09:23:06 -0400 Subject: [PATCH] throw better exception if you try to exceed 2GB of taxonomy facet labels --- .../taxonomy/writercache/CharBlockArray.java | 3 ++ .../writercache/Test2GBCharBlockArray.java | 46 +++++++++++++++++++ .../writercache/TestCharBlockArray.java | 4 +- 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 lucene/facet/src/test/org/apache/lucene/facet/taxonomy/writercache/Test2GBCharBlockArray.java diff --git a/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/writercache/CharBlockArray.java b/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/writercache/CharBlockArray.java index 017641a8953..84a0652b3e6 100644 --- a/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/writercache/CharBlockArray.java +++ b/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/writercache/CharBlockArray.java @@ -65,6 +65,9 @@ class CharBlockArray implements Appendable, Serializable, CharSequence { } private void addBlock() { + if (blockSize * (long) (blocks.size() + 1) > Integer.MAX_VALUE) { + throw new IllegalStateException("cannot store more than 2 GB in CharBlockArray"); + } this.current = new Block(this.blockSize); this.blocks.add(this.current); } diff --git a/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/writercache/Test2GBCharBlockArray.java b/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/writercache/Test2GBCharBlockArray.java new file mode 100644 index 00000000000..ffd232ffe29 --- /dev/null +++ b/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/writercache/Test2GBCharBlockArray.java @@ -0,0 +1,46 @@ +/* + * 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.lucene.facet.taxonomy.writercache; + +import org.apache.lucene.util.LuceneTestCase.Monster; +import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.util.TestUtil; + +@Monster("uses lots of space and takes a few minutes") +public class Test2GBCharBlockArray extends LuceneTestCase { + + public void test2GBChars() throws Exception { + int blockSize = 32768; + CharBlockArray array = new CharBlockArray(blockSize); + + int size = TestUtil.nextInt(random(), 20000, 40000); + + char[] chars = new char[size]; + int count = 0; + while (true) { + count++; + try { + array.append(chars, 0, size); + } catch (IllegalStateException ise) { + assertTrue(count * (long) size + blockSize > Integer.MAX_VALUE); + break; + } + assertFalse("appended " + (count * (long) size - Integer.MAX_VALUE) + " characters beyond Integer.MAX_VALUE!", + count * (long) size > Integer.MAX_VALUE); + } + } +} diff --git a/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/writercache/TestCharBlockArray.java b/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/writercache/TestCharBlockArray.java index 4914156ca40..f03a54a6f1d 100644 --- a/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/writercache/TestCharBlockArray.java +++ b/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/writercache/TestCharBlockArray.java @@ -27,11 +27,9 @@ import java.nio.file.Path; import org.apache.lucene.facet.FacetTestCase; -import org.junit.Test; - public class TestCharBlockArray extends FacetTestCase { - @Test public void testArray() throws Exception { + public void testArray() throws Exception { CharBlockArray array = new CharBlockArray(); StringBuilder builder = new StringBuilder();