Skip to content

Commit

Permalink
Introduce an index version for the ticket index
Browse files Browse the repository at this point in the history
In order to be able to update the index definition, the ticket index
is assigned a version number, 2. This way the definiton can be updated
and compatability with existing index files can be checked.
The actual index is stored in a directory of name `indexVersion_codecVersion`.
This wayit is veriy easy to check if an index of a certain version exists on the
filesystem. It allows to have multiple indexes of different versions present,
so that a downgrade of the software is possible without having to reindex
again. Of coure, this is only possible if no new tickets were created since these
would be missing in the old index.

A new class `LuceneIndexStore` is introduced, which abstracts away the versioned
index directory. The idea is, that this provides one place to keep the Lucene
codec version and to allow to code compatibility rules into this class, so that
older indices can still be used if they are compatible.
  • Loading branch information
fzs committed Mar 5, 2017
1 parent bf1b35a commit 71a27dd
Show file tree
Hide file tree
Showing 3 changed files with 352 additions and 9 deletions.
18 changes: 9 additions & 9 deletions src/main/java/com/gitblit/tickets/TicketIndexer.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
import com.gitblit.models.TicketModel.Attachment;
import com.gitblit.models.TicketModel.Patchset;
import com.gitblit.models.TicketModel.Status;
import com.gitblit.utils.FileUtils;
import com.gitblit.utils.LuceneIndexStore;
import com.gitblit.utils.StringUtils;

/**
Expand Down Expand Up @@ -110,6 +110,8 @@ public static enum Lucene {
priority(Type.INT),
severity(Type.INT);

final static int INDEX_VERSION = 2;

final Type fieldType;

Lucene(Type fieldType) {
Expand Down Expand Up @@ -169,14 +171,15 @@ public static Lucene fromString(String value) {

private final Logger log = LoggerFactory.getLogger(getClass());

private final File luceneDir;
private final LuceneIndexStore indexStore;

private IndexWriter writer;

private IndexSearcher searcher;

public TicketIndexer(IRuntimeManager runtimeManager) {
this.luceneDir = runtimeManager.getFileOrFolder(Keys.tickets.indexFolder, "${baseFolder}/tickets/lucene");
File luceneDir = runtimeManager.getFileOrFolder(Keys.tickets.indexFolder, "${baseFolder}/tickets/lucene");
this.indexStore = new LuceneIndexStore(luceneDir, Lucene.INDEX_VERSION);
}

/**
Expand All @@ -192,7 +195,7 @@ public void close() {
*/
public void deleteAll() {
close();
FileUtils.delete(luceneDir);
indexStore.delete();
}

/**
Expand Down Expand Up @@ -441,12 +444,9 @@ public List<QueryResult> queryFor(String queryText, int page, int pageSize, Stri

private IndexWriter getWriter() throws IOException {
if (writer == null) {
Directory directory = FSDirectory.open(luceneDir.toPath());

if (!luceneDir.exists()) {
luceneDir.mkdirs();
}
indexStore.create();

Directory directory = FSDirectory.open(indexStore.getPath());
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
config.setOpenMode(OpenMode.CREATE_OR_APPEND);
Expand Down
98 changes: 98 additions & 0 deletions src/main/java/com/gitblit/utils/LuceneIndexStore.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
/*
* Copyright 2017 gitblit.com.
*
* Licensed 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 com.gitblit.utils;

import java.io.File;
import java.nio.file.Path;

/**
* @author Florian Zschocke
*
* @since 1.9.0
*/
public class LuceneIndexStore
{

public static final int LUCENE_CODEC_VERSION = 54;

protected File indexFolder;

/**
* Constructor for a base folder that contains the version specific index folders
* and an index version.
*
* @param luceneFolder
* Path to the base folder for the Lucene indices, i.e. the common "lucene" directory.
* @param indexVersion
* Version of the index definition
*/
public LuceneIndexStore(File luceneFolder, int indexVersion)
{
this.indexFolder = new File(luceneFolder, indexVersion + "_" + LUCENE_CODEC_VERSION);
}



/**
* Create the Lucene index directory for this index version and Lucene codec version
*/
public void create()
{
if (! indexFolder.exists()) {
indexFolder.mkdirs();
}
}


/**
* Delete the Lucene index directory for this index version and Lucene codec version
*
* @return True if the directory could successfully be deleted.
*/
public boolean delete()
{
if (indexFolder.exists()) {
return FileUtils.delete(indexFolder);
}
return true;
}



/**
* @return The Path to the index folder
*/
public Path getPath()
{
return indexFolder.toPath();
}



/**
* Check if an index of the respective version, or compatible, already exists.
*
* @return True if an index exists, False otherwise
*/
public boolean hasIndex()
{
return indexFolder.exists() &&
indexFolder.isDirectory() &&
(indexFolder.list().length > 1);
}

}
Loading

0 comments on commit 71a27dd

Please sign in to comment.