From 838a1ae4b93271acc7bd59fe68ef3d72476c8f18 Mon Sep 17 00:00:00 2001 From: Sanne Grinovero Date: Sat, 5 Oct 2013 22:17:26 +0100 Subject: [PATCH] ISPN-3592 Avoid the DirectoryImplementor list() method to return null elements in the returned array --- .../java/org/infinispan/lucene/InfinispanDirectory.java | 9 +++++++-- .../org/infinispan/lucene/impl/DirectoryImplementor.java | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lucene/lucene-v3/src/main/java/org/infinispan/lucene/InfinispanDirectory.java b/lucene/lucene-v3/src/main/java/org/infinispan/lucene/InfinispanDirectory.java index cd3b5c7d4584..ed580c03825f 100644 --- a/lucene/lucene-v3/src/main/java/org/infinispan/lucene/InfinispanDirectory.java +++ b/lucene/lucene-v3/src/main/java/org/infinispan/lucene/InfinispanDirectory.java @@ -143,8 +143,13 @@ public InfinispanDirectory(Cache cache) { */ public String[] list() { ensureOpen(); - Set filesList = fileOps.getFileList(); - return filesList.toArray(new String[filesList.size()]); + Set files = fileOps.getFileList(); + //Careful! if you think you can optimize this array allocation, think again. + //The _files_ are a concurrent structure, its size could vary in parallel: + //the array population and dimensioning need to be performed atomically + //to avoid trailing null elements in the returned array. + String[] array = files.toArray(new String[0]); + return array; } /** diff --git a/lucene/lucene-v3/src/main/java/org/infinispan/lucene/impl/DirectoryImplementor.java b/lucene/lucene-v3/src/main/java/org/infinispan/lucene/impl/DirectoryImplementor.java index f6e2932a1b0a..cdb025173cbd 100644 --- a/lucene/lucene-v3/src/main/java/org/infinispan/lucene/impl/DirectoryImplementor.java +++ b/lucene/lucene-v3/src/main/java/org/infinispan/lucene/impl/DirectoryImplementor.java @@ -51,8 +51,13 @@ public DirectoryImplementor(Cache metadataCache, Cache chunksCache, } String[] list() { - final Set filesList = fileOps.getFileList(); - return filesList.toArray(new String[filesList.size()]); + final Set files = fileOps.getFileList(); + //Careful! if you think you can optimize this array allocation, think again. + //The _files_ are a concurrent structure, its size could vary in parallel: + //the array population and dimensioning need to be performed atomically + //to avoid trailing null elements in the returned array. + final String[] array = files.toArray(new String[0]); + return array; } boolean fileExists(final String name) {