From 28f013678002f13af8e84803e68ab2ec9d9ba6ec Mon Sep 17 00:00:00 2001
From: dugan <dugan@localhost>
Date: Sat, 26 Sep 2009 18:34:25 +0000
Subject: [PATCH] Remove un-needed files.
---
/dev/null | 679 --------------------------------------------------------
1 files changed, 0 insertions(+), 679 deletions(-)
diff --git a/opends/src/server/org/opends/server/backends/jeb/IndexRebuildThread.java b/opends/src/server/org/opends/server/backends/jeb/IndexRebuildThread.java
deleted file mode 100644
index 85fc389..0000000
--- a/opends/src/server/org/opends/server/backends/jeb/IndexRebuildThread.java
+++ /dev/null
@@ -1,1104 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE
- * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
- * add the following below this CDDL HEADER, with the fields enclosed
- * by brackets "[]" replaced with your own identifying information:
- * Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- *
- *
- * Copyright 2006-2008 Sun Microsystems, Inc.
- */
-package org.opends.server.backends.jeb;
-import org.opends.messages.Message;
-
-import org.opends.server.api.DirectoryThread;
-
-import com.sleepycat.je.*;
-
-import org.opends.server.types.*;
-
-import static org.opends.messages.JebMessages.
- ERR_JEB_MISSING_DN2ID_RECORD;
-import static org.opends.messages.JebMessages.
- ERR_JEB_REBUILD_INDEX_FAILED;
-import static org.opends.messages.JebMessages.
- ERR_JEB_REBUILD_INSERT_ENTRY_FAILED;
-import static org.opends.server.loggers.ErrorLogger.logError;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-import org.opends.server.loggers.debug.DebugTracer;
-import static org.opends.server.util.StaticUtils.stackTraceToSingleLineString;
-
-
-/**
- * A thread to do the actual work of rebuilding an index.
- */
-public class IndexRebuildThread extends DirectoryThread
-{
- /**
- * The tracer object for the debug logger.
- */
- private static final DebugTracer TRACER = getTracer();
-
- /**
- * The entry container.
- */
- EntryContainer ec = null;
-
- /**
- * The internal database/indexType to rebuild.
- */
- IndexType indexType = null;
-
- /**
- * The attribute indexType to rebuild.
- */
- AttributeIndex attrIndex = null;
-
- /**
- * The VLV index to rebuild.
- */
- VLVIndex vlvIndex = null;
-
- /**
- * The indexType to rebuild.
- */
- Index index = null;
-
- /**
- * The ID2ENTRY database.
- */
- ID2Entry id2entry = null;
-
- /**
- * The number of total entries to rebuild. An negative value indicates this
- * value is not yet known.
- */
- long totalEntries = -1;
-
- /**
- * The number of entries processed.
- */
- long processedEntries = 0;
-
- /**
- * The number of entries rebuilt successfully.
- */
- long rebuiltEntries = 0;
-
- /**
- * The number of entries rebuilt with possible duplicates.
- */
- long duplicatedEntries = 0;
-
- /**
- * The number of entries that were skipped because they were not applicable
- * for the indexType or because an error occurred.
- */
- long skippedEntries = 0;
-
- /**
- * The types of internal indexes that are rebuildable.
- */
- enum IndexType
- {
- DN2ID, DN2URI, ID2CHILDREN, ID2SUBTREE, INDEX, ATTRIBUTEINDEX, VLVINDEX
- }
-
- /**
- * Construct a new index rebuild thread to rebuild a system index.
- *
- * @param ec The entry container to rebuild in.
- * @param index The index type to rebuild.
- */
- IndexRebuildThread(EntryContainer ec, IndexType index)
- {
- super("Index Rebuild Thread " + ec.getDatabasePrefix() + "_" +
- index.toString());
- this.ec = ec;
- this.indexType = index;
- this.id2entry = ec.getID2Entry();
- }
-
- /**
- * Construct a new index rebuild thread to rebuild an index.
- *
- * @param ec The entry container to rebuild in.
- * @param index The index to rebuild.
- */
- IndexRebuildThread(EntryContainer ec, Index index)
- {
- super("Index Rebuild Thread " + index.getName());
- this.ec = ec;
- this.indexType = IndexType.INDEX;
- this.index = index;
- this.id2entry = ec.getID2Entry();
- }
-
- /**
- * Construct a new index rebuild thread to rebuild an attribute index.
- *
- * @param ec The entry container to rebuild in.
- * @param index The attribute index to rebuild.
- */
- IndexRebuildThread(EntryContainer ec, AttributeIndex index)
- {
- super("Index Rebuild Thread " + index.getName());
- this.ec = ec;
- this.indexType = IndexType.ATTRIBUTEINDEX;
- this.attrIndex = index;
- this.id2entry = ec.getID2Entry();
- }
-
- /**
- * Construct a new index rebuild thread to rebuild an VLV index.
- *
- * @param ec The entry container to rebuild in.
- * @param vlvIndex The VLV index to rebuild.
- */
- IndexRebuildThread(EntryContainer ec, VLVIndex vlvIndex)
- {
- super("Index Rebuild Thread " + vlvIndex.getName());
- this.ec = ec;
- this.indexType = IndexType.VLVINDEX;
- this.vlvIndex = vlvIndex;
- this.id2entry = ec.getID2Entry();
- }
-
- /**
- * Clear the database and prep it for the rebuild.
- *
- * @throws DatabaseException if a JE databse error occurs while clearing
- * the database being rebuilt.
- */
- public void clearDatabase() throws DatabaseException
- {
- if(indexType == null)
- {
- //TODO: throw error
- if(debugEnabled())
- {
- TRACER.debugError("No index type specified. Rebuild process " +
- "terminated.");
- }
-
- return;
- }
- if(indexType == IndexType.ATTRIBUTEINDEX && attrIndex == null)
- {
- //TODO: throw error
- if(debugEnabled())
- {
- TRACER.debugError("No attribute index specified. Rebuild process " +
- "terminated.");
- }
-
- return;
- }
-
- if(indexType == IndexType.INDEX && index == null)
- {
- //TODO: throw error
- if(debugEnabled())
- {
- TRACER.debugError("No index specified. Rebuild process terminated.");
- }
-
- return;
- }
-
- if(indexType == IndexType.VLVINDEX && vlvIndex == null)
- {
- //TODO: throw error
- if(debugEnabled())
- {
- TRACER.debugError("No VLV index specified. Rebuild process " +
- "terminated.");
- }
-
- return;
- }
-
- switch(indexType)
- {
- case DN2ID :
- ec.clearDatabase(ec.getDN2ID());
- break;
- case DN2URI :
- ec.clearDatabase(ec.getDN2URI());
- break;
- case ID2CHILDREN :
- ec.clearDatabase(ec.getID2Children());
- ec.getID2Children().setRebuildStatus(true);
- break;
- case ID2SUBTREE :
- ec.clearDatabase(ec.getID2Subtree());
- ec.getID2Subtree().setRebuildStatus(true);
- break;
- case ATTRIBUTEINDEX :
- ec.clearAttributeIndex(attrIndex);
- attrIndex.setRebuildStatus(true);
- break;
- case VLVINDEX :
- ec.clearDatabase(vlvIndex);
- vlvIndex.setRebuildStatus(true);
- break;
- case INDEX :
- ec.clearDatabase(index);
- index.setRebuildStatus(true);
- }
- }
-
- /**
- * Start the rebuild process.
- */
- public void run()
- {
- if(indexType == null)
- {
- //TODO: throw error
- if(debugEnabled())
- {
- TRACER.debugError("No index type specified. Rebuild process " +
- "terminated.");
- }
-
- return;
- }
- if(indexType == IndexType.ATTRIBUTEINDEX && attrIndex == null)
- {
- //TODO: throw error
- if(debugEnabled())
- {
- TRACER.debugError("No attribute index specified. Rebuild process " +
- "terminated.");
- }
-
- return;
- }
-
- if(indexType == IndexType.INDEX && index == null)
- {
- //TODO: throw error
- if(debugEnabled())
- {
- TRACER.debugError("No index specified. Rebuild process terminated.");
- }
-
- return;
- }
-
- if(indexType == IndexType.VLVINDEX && vlvIndex == null)
- {
- //TODO: throw error
- if(debugEnabled())
- {
- TRACER.debugError("No VLV index specified. Rebuild process " +
- "terminated.");
- }
-
- return;
- }
-
- try
- {
- totalEntries = getTotalEntries();
-
- switch(indexType)
- {
- case DN2ID : rebuildDN2ID();
- break;
- case DN2URI : rebuildDN2URI();
- break;
- case ID2CHILDREN : rebuildID2Children();
- break;
- case ID2SUBTREE : rebuildID2Subtree();
- break;
- case ATTRIBUTEINDEX : rebuildAttributeIndex(attrIndex);
- break;
- case VLVINDEX : rebuildVLVIndex(vlvIndex);
- break;
- case INDEX : rebuildAttributeIndex(index);
- }
-
- if(debugEnabled())
- {
- TRACER.debugVerbose("Rebuilt %d entries", rebuiltEntries);
- }
- }
- catch(Exception e)
- {
- Message message = ERR_JEB_REBUILD_INDEX_FAILED.get(
- this.getName(), stackTraceToSingleLineString(e));
- logError(message);
-
- if(debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- }
- }
-
- /**
- * Rebuild an interal DN2ID database.
- *
- * @throws DatabaseException If an error occurs during the rebuild.
- */
- private void rebuildDN2ID() throws DatabaseException
- {
- DN2ID dn2id = ec.getDN2ID();
-
- if(debugEnabled())
- {
- TRACER.debugInfo("Initiating rebuild of the %s database",
- dn2id.getName());
- TRACER.debugVerbose("%d entries will be rebuilt", totalEntries);
- }
-
-
- //Iterate through the id2entry database and insert associated dn2id
- //records.
- Cursor cursor = id2entry.openCursor(null, CursorConfig.READ_COMMITTED);
- try
- {
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry data = new DatabaseEntry();
- LockMode lockMode = LockMode.DEFAULT;
-
- OperationStatus status;
- for (status = cursor.getFirst(key, data, lockMode);
- status == OperationStatus.SUCCESS;
- status = cursor.getNext(key, data, lockMode))
- {
- Transaction txn = ec.beginTransaction();
- try
- {
- EntryID entryID = new EntryID(key);
- Entry entry = ID2Entry.entryFromDatabase(
- ByteString.wrap(data.getData()),
- ec.getRootContainer().getCompressedSchema());
-
- // Insert into dn2id.
- if (dn2id.insert(txn, entry.getDN(), entryID))
- {
- rebuiltEntries++;
- }
- else
- {
- // The entry ID already exists in the database.
- // This could happen if some other process got to this entry
- // before we did. Since the backend should be offline, this
- // might be a problem.
- duplicatedEntries++;
- if(debugEnabled())
- {
- TRACER.debugInfo("Unable to insert entry with DN %s and ID %d " +
- "into the DN2ID database because it already exists.",
- entry.getDN().toString(), entryID.longValue());
- }
- }
- EntryContainer.transactionCommit(txn);
- processedEntries++;
- }
- catch (Exception e)
- {
- EntryContainer.transactionAbort(txn);
- skippedEntries++;
-
- Message message = ERR_JEB_REBUILD_INSERT_ENTRY_FAILED.get(
- dn2id.getName(), stackTraceToSingleLineString(e));
- logError(message);
-
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- }
- }
- }
- finally
- {
- cursor.close();
- }
- }
-
- /**
- * Rebuild the ID2URI internal database.
- *
- * @throws DatabaseException if an error occurs during rebuild.
- */
- private void rebuildDN2URI() throws DatabaseException
- {
- DN2URI dn2uri = ec.getDN2URI();
-
- if(debugEnabled())
- {
- TRACER.debugInfo("Initiating rebuild of the %s database",
- dn2uri.getName());
- TRACER.debugVerbose("%d entries will be rebuilt", totalEntries);
- }
-
-
- //Iterate through the id2entry database and insert associated dn2uri
- //records.
- Cursor cursor = id2entry.openCursor(null, CursorConfig.READ_COMMITTED);
- try
- {
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry data = new DatabaseEntry();
- LockMode lockMode = LockMode.DEFAULT;
-
-
- OperationStatus status;
- for (status = cursor.getFirst(key, data, lockMode);
- status == OperationStatus.SUCCESS;
- status = cursor.getNext(key, data, lockMode))
- {
- Transaction txn = ec.beginTransaction();
- try
- {
- EntryID entryID = new EntryID(key);
- Entry entry = ID2Entry.entryFromDatabase(
- ByteString.wrap(data.getData()),
- ec.getRootContainer().getCompressedSchema());
-
- // Insert into dn2uri.
- if (dn2uri.addEntry(txn, entry))
- {
- rebuiltEntries++;
- }
- else
- {
- // The entry DN and URIs already exists in the database.
- // This could happen if some other process got to this entry
- // before we did. Since the backend should be offline, this
- // might be a problem.
- duplicatedEntries++;
- if(debugEnabled())
- {
- TRACER.debugInfo("Unable to insert entry with DN %s and ID %d " +
- "into the DN2URI database because it already exists.",
- entry.getDN().toString(), entryID.longValue());
- }
- }
- EntryContainer.transactionCommit(txn);
- processedEntries++;
- }
- catch (Exception e)
- {
- EntryContainer.transactionAbort(txn);
- skippedEntries++;
-
- Message message = ERR_JEB_REBUILD_INSERT_ENTRY_FAILED.get(
- dn2uri.getName(), stackTraceToSingleLineString(e));
- logError(message);
-
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- }
- }
- }
- finally
- {
- cursor.close();
- }
- }
-
- /**
- * Rebuild the ID2Subtree internal index. This depends on the DN2ID and DN2URI
- * databases being complete.
- *
- * @throws DatabaseException if an error occurs during rebuild.
- */
- private void rebuildID2Children() throws DatabaseException
- {
- Index id2children = ec.getID2Children();
-
- if(debugEnabled())
- {
- TRACER.debugInfo("Initiating rebuild of the %s index",
- id2children.getName());
- TRACER.debugVerbose("%d entries will be rebuilt", totalEntries);
- }
-
-
- DN2ID dn2id = ec.getDN2ID();
- DN2URI dn2uri = ec.getDN2URI();
-
- //Iterate through the id2entry database and insert associated dn2children
- //records.
- Cursor cursor = id2entry.openCursor(null, CursorConfig.READ_COMMITTED);
- try
- {
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry data = new DatabaseEntry();
- LockMode lockMode = LockMode.DEFAULT;
-
- OperationStatus status;
- for (status = cursor.getFirst(key, data, lockMode);
- status == OperationStatus.SUCCESS;
- status = cursor.getNext(key, data, lockMode))
- {
- Transaction txn = ec.beginTransaction();
- try
- {
- EntryID entryID = new EntryID(key);
- Entry entry = ID2Entry.entryFromDatabase(
- ByteString.wrap(data.getData()),
- ec.getRootContainer().getCompressedSchema());
-
- // Check that the parent entry exists.
- DN parentDN = ec.getParentWithinBase(entry.getDN());
- if (parentDN != null)
- {
- // Check for referral entries above the target.
- dn2uri.targetEntryReferrals(entry.getDN(), null);
-
- // Read the parent ID from dn2id.
- EntryID parentID = dn2id.get(txn, parentDN, LockMode.DEFAULT);
- if (parentID != null)
- {
- // Insert into id2children for parent ID.
- if(id2children.insertID(txn, parentID.getDatabaseEntry(),
- entryID))
- {
- rebuiltEntries++;
- }
- else
- {
- // The entry already exists in the database.
- // This could happen if some other process got to this entry
- // before we did. Since the backend should be offline, this
- // might be a problem.
- if(debugEnabled())
- {
- duplicatedEntries++;
- TRACER.debugInfo("Unable to insert entry with DN %s and " +
- "ID %d into the DN2Subtree database because it already " +
- "exists.",
- entry.getDN().toString(), entryID.longValue());
- }
- }
- }
- else
- {
- Message msg = ERR_JEB_MISSING_DN2ID_RECORD.get(
- parentDN.toNormalizedString());
- throw new JebException(msg);
- }
- }
- else
- {
- skippedEntries++;
- }
- EntryContainer.transactionCommit(txn);
- processedEntries++;
- }
- catch (Exception e)
- {
- EntryContainer.transactionAbort(txn);
- skippedEntries++;
-
- Message message = ERR_JEB_REBUILD_INSERT_ENTRY_FAILED.get(
- id2children.getName(), stackTraceToSingleLineString(e));
- logError(message);
-
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- }
- }
- id2children.setRebuildStatus(false);
- id2children.setTrusted(null, true);
- }
- finally
- {
- cursor.close();
- }
- }
-
- /**
- * Rebuild the ID2Subtree internal index. This depends on the DN2ID and DN2URI
- * databases being complete.
- *
- * @throws DatabaseException if an error occurs during rebuild.
- */
- private void rebuildID2Subtree() throws DatabaseException
- {
- Index id2subtree = ec.getID2Subtree();
-
- if(debugEnabled())
- {
- TRACER.debugInfo("Initiating rebuild of the %s index",
- id2subtree.getName());
- TRACER.debugVerbose("%d entries will be rebuilt", totalEntries);
- }
-
-
- DN2ID dn2id = ec.getDN2ID();
- DN2URI dn2uri = ec.getDN2URI();
-
- //Iterate through the id2entry database and insert associated dn2subtree
- //records.
- Cursor cursor = id2entry.openCursor(null, CursorConfig.READ_COMMITTED);
- try
- {
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry data = new DatabaseEntry();
- LockMode lockMode = LockMode.DEFAULT;
-
- OperationStatus status;
- for (status = cursor.getFirst(key, data, lockMode);
- status == OperationStatus.SUCCESS;
- status = cursor.getNext(key, data, lockMode))
- {
- Transaction txn = ec.beginTransaction();
- try
- {
- EntryID entryID = new EntryID(key);
- Entry entry = ID2Entry.entryFromDatabase(
- ByteString.wrap(data.getData()),
- ec.getRootContainer().getCompressedSchema());
-
- // Check that the parent entry exists.
- DN parentDN = ec.getParentWithinBase(entry.getDN());
- if (parentDN != null)
- {
- boolean success = true;
-
- // Check for referral entries above the target.
- dn2uri.targetEntryReferrals(entry.getDN(), null);
-
- // Read the parent ID from dn2id.
- EntryID parentID = dn2id.get(txn, parentDN, LockMode.DEFAULT);
- if (parentID != null)
- {
- // Insert into id2subtree for parent ID.
- if(!id2subtree.insertID(txn, parentID.getDatabaseEntry(),
- entryID))
- {
- success = false;
- }
-
- // Iterate up through the superior entries, starting above the
- // parent.
- for (DN dn = ec.getParentWithinBase(parentDN); dn != null;
- dn = ec.getParentWithinBase(dn))
- {
- // Read the ID from dn2id.
- EntryID nodeID = dn2id.get(null, dn, LockMode.DEFAULT);
- if (nodeID != null)
- {
- // Insert into id2subtree for this node.
- if(!id2subtree.insertID(null, nodeID.getDatabaseEntry(),
- entryID))
- {
- success = false;
- }
- }
- else
- {
- Message msg =
- ERR_JEB_MISSING_DN2ID_RECORD.get(dn.toNormalizedString());
- throw new JebException(msg);
- }
- }
- }
- else
- {
- Message msg = ERR_JEB_MISSING_DN2ID_RECORD.get(
- parentDN.toNormalizedString());
- throw new JebException(msg);
- }
-
- if(success)
- {
- rebuiltEntries++;
- }
- else
- {
- // The entry already exists in the database.
- // This could happen if some other process got to this entry
- // before we did. Since the backend should be offline, this
- // might be a problem.
- if(debugEnabled())
- {
- duplicatedEntries++;
- TRACER.debugInfo("Unable to insert entry with DN %s and ID " +
- "%d into the DN2Subtree database because it already " +
- "exists.", entry.getDN().toString(), entryID.longValue());
- }
- }
- }
- else
- {
- skippedEntries++;
- }
- EntryContainer.transactionCommit(txn);
- processedEntries++;
- }
- catch (Exception e)
- {
- EntryContainer.transactionAbort(txn);
- skippedEntries++;
-
- Message message = ERR_JEB_REBUILD_INSERT_ENTRY_FAILED.get(
- id2subtree.getName(), stackTraceToSingleLineString(e));
- logError(message);
-
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- }
- }
- id2subtree.setRebuildStatus(false);
- id2subtree.setTrusted(null, true);
- }
- finally
- {
- cursor.close();
- }
- }
-
- /**
- * Rebuild the attribute index.
- *
- * @param index The indexType to rebuild.
- * @throws DatabaseException if an error occurs during rebuild.
- */
- private void rebuildAttributeIndex(AttributeIndex index)
- throws DatabaseException
- {
- if(debugEnabled())
- {
- TRACER.debugInfo("Initiating rebuild of the %s index",
- index.getName());
- TRACER.debugVerbose("%d entries will be rebuilt", totalEntries);
- }
-
- //Iterate through the id2entry database and insert associated indexType
- //records.
- Cursor cursor = id2entry.openCursor(null, CursorConfig.READ_COMMITTED);
- try
- {
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry data = new DatabaseEntry();
- LockMode lockMode = LockMode.DEFAULT;
-
- OperationStatus status;
- for (status = cursor.getFirst(key, data, lockMode);
- status == OperationStatus.SUCCESS;
- status = cursor.getNext(key, data, lockMode))
- {
- Transaction txn = ec.beginTransaction();
- try
- {
- EntryID entryID = new EntryID(key);
- Entry entry = ID2Entry.entryFromDatabase(
- ByteString.wrap(data.getData()),
- ec.getRootContainer().getCompressedSchema());
-
- // Insert into attribute indexType.
- if(index.addEntry(txn, entryID, entry))
- {
- rebuiltEntries++;
- }
- else
- {
- // The entry already exists in one or more entry sets.
- // This could happen if some other process got to this entry
- // before we did. Since the backend should be offline, this
- // might be a problem.
- if(debugEnabled())
- {
- duplicatedEntries++;
- TRACER.debugInfo("Unable to insert entry with DN %s and ID %d " +
- "into the DN2Subtree database because it already " +
- "exists.",
- entry.getDN().toString(), entryID.longValue());
- }
- }
- EntryContainer.transactionCommit(txn);
- processedEntries++;
- }
- catch (Exception e)
- {
- EntryContainer.transactionAbort(txn);
- skippedEntries++;
-
- Message message = ERR_JEB_REBUILD_INSERT_ENTRY_FAILED.get(
- index.getName(), stackTraceToSingleLineString(e));
- logError(message);
-
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- }
- }
- index.setRebuildStatus(false);
- index.setTrusted(null, true);
- }
- finally
- {
- cursor.close();
- }
- }
-
- /**
- * Rebuild the VLV index.
- *
- * @param vlvIndex The VLV index to rebuild.
- * @throws DatabaseException if an error occurs during rebuild.
- */
- private void rebuildVLVIndex(VLVIndex vlvIndex)
- throws DatabaseException
- {
-
- //Iterate through the id2entry database and insert associated indexType
- //records.
- Cursor cursor = id2entry.openCursor(null, CursorConfig.READ_COMMITTED);
- try
- {
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry data = new DatabaseEntry();
- LockMode lockMode = LockMode.DEFAULT;
-
- OperationStatus status;
- for (status = cursor.getFirst(key, data, lockMode);
- status == OperationStatus.SUCCESS;
- status = cursor.getNext(key, data, lockMode))
- {
- Transaction txn = ec.beginTransaction();
- try
- {
- EntryID entryID = new EntryID(key);
- Entry entry = ID2Entry.entryFromDatabase(
- ByteString.wrap(data.getData()),
- ec.getRootContainer().getCompressedSchema());
-
- // Insert into attribute indexType.
- if(vlvIndex.addEntry(txn, entryID, entry))
- {
- rebuiltEntries++;
- }
- else
- {
- // The entry already exists in one or more entry sets.
- // This could happen if some other process got to this entry
- // before we did. Since the backend should be offline, this
- // might be a problem.
- if(debugEnabled())
- {
- duplicatedEntries++;
- TRACER.debugInfo("Unable to insert entry with DN %s and ID %d " +
- "into the VLV index %s because it already " +
- "exists.",
- entry.getDN().toString(), entryID.longValue(),
- vlvIndex.getName());
- }
- }
-
- EntryContainer.transactionCommit(txn);
- processedEntries++;
- }
- catch (Exception e)
- {
- EntryContainer.transactionAbort(txn);
- skippedEntries++;
-
- Message message = ERR_JEB_REBUILD_INSERT_ENTRY_FAILED.get(
- vlvIndex.getName(), stackTraceToSingleLineString(e));
- logError(message);
-
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- }
- }
- vlvIndex.setRebuildStatus(false);
- vlvIndex.setTrusted(null, true);
- }
- finally
- {
- cursor.close();
- }
- }
-
- /**
- * Rebuild the partial attribute index.
- *
- * @param index The indexType to rebuild.
- * @throws DatabaseException if an error occurs during rebuild.
- */
- private void rebuildAttributeIndex(Index index)
- throws DatabaseException
- {
- if(debugEnabled())
- {
- TRACER.debugInfo("Initiating rebuild of the %s attribute index",
- index.getName());
- TRACER.debugVerbose("%d entries will be rebuilt", totalEntries);
- }
-
- //Iterate through the id2entry database and insert associated indexType
- //records.
- Cursor cursor = id2entry.openCursor(null, CursorConfig.READ_COMMITTED);
- try
- {
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry data = new DatabaseEntry();
- LockMode lockMode = LockMode.DEFAULT;
-
- OperationStatus status;
- for (status = cursor.getFirst(key, data, lockMode);
- status == OperationStatus.SUCCESS;
- status = cursor.getNext(key, data, lockMode))
- {
- Transaction txn = ec.beginTransaction();
- try
- {
- EntryID entryID = new EntryID(key);
- Entry entry = ID2Entry.entryFromDatabase(
- ByteString.wrap(data.getData()),
- ec.getRootContainer().getCompressedSchema());
-
- // Insert into attribute indexType.
- if(index.addEntry(txn, entryID, entry))
- {
- rebuiltEntries++;
- }
- else
- {
- // The entry already exists in one or more entry sets.
- // This could happen if some other process got to this entry
- // before we did. Since the backend should be offline, this
- // might be a problem.
- if(debugEnabled())
- {
- duplicatedEntries++;
- TRACER.debugInfo("Unable to insert entry with DN %s and ID %d " +
- "into the DN2Subtree database because it already " +
- "exists.",
- entry.getDN().toString(), entryID.longValue());
- }
- }
- EntryContainer.transactionCommit(txn);
- processedEntries++;
- }
- catch (Exception e)
- {
- EntryContainer.transactionAbort(txn);
- skippedEntries++;
-
- Message message = ERR_JEB_REBUILD_INSERT_ENTRY_FAILED.get(
- index.getName(), stackTraceToSingleLineString(e));
- logError(message);
-
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- }
- }
- index.setRebuildStatus(false);
- index.setTrusted(null, true);
- }
- finally
- {
- cursor.close();
- }
- }
-
- /**
- * Get the total entries to process in the rebuild.
- *
- * @return The total entries to process.
- * @throws DatabaseException if an error occurs while getting the total
- * number of entries to process.
- */
- public long getTotalEntries() throws DatabaseException
- {
- //If total entries is not calculated yet, do it now.
- if(totalEntries < 0)
- {
- totalEntries = id2entry.getRecordCount();
- }
- return totalEntries;
- }
-
- /**
- * Get the number of entries processed in the rebuild.
- *
- * @return The total entries processed.
- */
- public long getProcessedEntries()
- {
- return processedEntries;
- }
-
- /**
- * Get the number of entries successfully rebuilt.
- *
- * @return The number of entries successfully rebuilt.
- */
- public long getRebuiltEntries()
- {
- return rebuiltEntries;
- }
-
- /**
- * Get the number of entries that encountered duplicated indexType values in
- * the rebuild process.
- *
- * @return The number of entries that encountered duplicated indexType values
- * in the rebuild process.
- */
- public long getDuplicatedEntries()
- {
- return duplicatedEntries;
- }
-
- /**
- * Get the number of entries skipped because they were either not applicable
- * or an error occurred during the process.
- *
- * @return The number of entries skipped.
- */
- public long getSkippedEntries()
- {
- return skippedEntries;
- }
-
- /**
- * Get the index type being rebuilt by this thread.
- *
- * @return The index type being rebuilt by this thread.
- */
- public IndexType getIndexType()
- {
- return indexType;
- }
-}
-
-
diff --git a/opends/src/server/org/opends/server/backends/jeb/RebuildJob.java b/opends/src/server/org/opends/server/backends/jeb/RebuildJob.java
deleted file mode 100644
index 3d9e55e..0000000
--- a/opends/src/server/org/opends/server/backends/jeb/RebuildJob.java
+++ /dev/null
@@ -1,679 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE
- * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at
- * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
- * add the following below this CDDL HEADER, with the fields enclosed
- * by brackets "[]" replaced with your own identifying information:
- * Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- *
- *
- * Copyright 2006-2008 Sun Microsystems, Inc.
- */
-package org.opends.server.backends.jeb;
-import org.opends.messages.Message;
-
-import org.opends.server.types.*;
-
-import java.util.ArrayList;
-import java.util.TimerTask;
-import java.util.Timer;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.locks.ReentrantLock;
-
-import com.sleepycat.je.DatabaseException;
-import com.sleepycat.je.StatsConfig;
-import com.sleepycat.je.EnvironmentStats;
-
-import static org.opends.server.loggers.ErrorLogger.logError;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-import org.opends.server.loggers.debug.DebugTracer;
-import org.opends.server.core.DirectoryServer;
-import static org.opends.messages.JebMessages.
- ERR_JEB_ATTRIBUTE_INDEX_NOT_CONFIGURED;
-import static org.opends.messages.JebMessages.
- NOTE_JEB_REBUILD_PROGRESS_REPORT;
-import static org.opends.messages.JebMessages.
- NOTE_JEB_REBUILD_FINAL_STATUS;
-import static org.opends.messages.JebMessages.
- NOTE_JEB_REBUILD_CACHE_AND_MEMORY_REPORT;
-import static org.opends.messages.JebMessages.
- ERR_JEB_REBUILD_INDEX_CONFLICT;
-import static org.opends.messages.JebMessages.
- NOTE_JEB_REBUILD_START;
-import static org.opends.messages.JebMessages.
- ERR_JEB_VLV_INDEX_NOT_CONFIGURED;
-/**
- * Runs a index rebuild process on the backend. Each index selected for rebuild
- * will be done from scratch by first clearing out the database for that index.
- * Different threads will be used to rebuild each index.
- * The rebuild process can run concurrently with the backend online and
- * performing write and read operations. However, during the rebuild process,
- * other reader and writer activeThreads might notice inconsistencies in index
- * databases being rebuilt. They can safely ignore these inconsistencies as long
- * as a rebuild is in progress.
- */
-public class RebuildJob
-{
- /**
- * The tracer object for the debug logger.
- */
- private static final DebugTracer TRACER = getTracer();
-
- /**
- * The rebuild configuraiton.
- */
- private RebuildConfig rebuildConfig;
-
- /**
- * The root container used for the verify job.
- */
- private RootContainer rootContainer;
-
- /**
- * The number of milliseconds between job progress reports.
- */
- private long progressInterval = 10000;
-
- /**
- * The waiting rebuild threads created to process the rebuild.
- */
- private CopyOnWriteArrayList<IndexRebuildThread> waitingThreads =
- new CopyOnWriteArrayList<IndexRebuildThread>();
-
- /**
- * The active rebuild threads created to process the rebuild.
- */
- private CopyOnWriteArrayList<IndexRebuildThread> activeThreads =
- new CopyOnWriteArrayList<IndexRebuildThread>();
-
- /**
- * The completed rebuild threads used to process the rebuild.
- */
- private CopyOnWriteArrayList<IndexRebuildThread> completedThreads =
- new CopyOnWriteArrayList<IndexRebuildThread>();
-
- /**
- * Rebuild jobs currently running.
- */
- private static CopyOnWriteArrayList<RebuildJob> rebuildJobs =
- new CopyOnWriteArrayList<RebuildJob>();
-
- /**
- * A mutex that will be used to provide threadsafe access to methods changing
- * the set of currently running rebuild jobs.
- */
- private static ReentrantLock jobsMutex = new ReentrantLock();
-
- /**
- * This class reports progress of the rebuild job at fixed intervals.
- */
- class ProgressTask extends TimerTask
- {
- /**
- * The number of records that had been processed at the time of the
- * previous progress report.
- */
- private long previousProcessed = 0;
-
- /**
- * The time in milliseconds of the previous progress report.
- */
- private long previousTime;
-
- /**
- * The environment statistics at the time of the previous report.
- */
- private EnvironmentStats prevEnvStats;
-
- /**
- * The number of bytes in a megabyte.
- * Note that 1024*1024 bytes may eventually become known as a mebibyte(MiB).
- */
- private static final int bytesPerMegabyte = 1024*1024;
- /**
- * Create a new verify progress task.
- * @throws DatabaseException An error occurred while accessing the JE
- * database.
- */
- public ProgressTask() throws DatabaseException
- {
- previousTime = System.currentTimeMillis();
- prevEnvStats =
- rootContainer.getEnvironmentStats(new StatsConfig());
- }
-
- /**
- * The action to be performed by this timer task.
- */
- public void run()
- {
- long latestTime = System.currentTimeMillis();
- long deltaTime = latestTime - previousTime;
-
- if (deltaTime == 0)
- {
- return;
- }
-
- long totalEntries = 0;
- long latestProcessed = 0;
-
- ArrayList<IndexRebuildThread> allThreads =
- new ArrayList<IndexRebuildThread>(waitingThreads);
- allThreads.addAll(activeThreads);
- allThreads.addAll(completedThreads);
-
- for(IndexRebuildThread thread : allThreads)
- {
- try
- {
- totalEntries += thread.getTotalEntries();
- latestProcessed += thread.getProcessedEntries();
-
- if(debugEnabled())
- {
- TRACER.debugVerbose("Rebuild thread %s stats: total %d " +
- "processed %d rebuilt %d duplicated %d skipped %d",
- thread.getTotalEntries(), thread.getProcessedEntries(),
- thread.getRebuiltEntries(),
- thread.getDuplicatedEntries(),
- thread.getSkippedEntries());
- }
- }
- catch(Exception e)
- {
- if(debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- }
- }
-
- long deltaCount = (latestProcessed - previousProcessed);
- float rate = 1000f*deltaCount / deltaTime;
- float completed = 0;
- if(totalEntries > 0)
- {
- completed = 100f*latestProcessed / totalEntries;
- }
-
- Message message = NOTE_JEB_REBUILD_PROGRESS_REPORT.get(
- completed, latestProcessed, totalEntries, rate);
- logError(message);
-
- try
- {
- Runtime runtime = Runtime.getRuntime();
- long freeMemory = runtime.freeMemory() / bytesPerMegabyte;
-
- EnvironmentStats envStats =
- rootContainer.getEnvironmentStats(new StatsConfig());
- long nCacheMiss =
- envStats.getNCacheMiss() - prevEnvStats.getNCacheMiss();
-
- float cacheMissRate = 0;
- if (deltaCount > 0)
- {
- cacheMissRate = nCacheMiss/(float)deltaCount;
- }
-
- message = NOTE_JEB_REBUILD_CACHE_AND_MEMORY_REPORT.get(
- freeMemory, cacheMissRate);
- logError(message);
-
- prevEnvStats = envStats;
- }
- catch (DatabaseException e)
- {
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- }
-
-
- previousProcessed = latestProcessed;
- previousTime = latestTime;
- }
- }
-
- /**
- * Construct a new rebuild job.
- *
- * @param rebuildConfig The configuration to use for this rebuild job.
- */
- public RebuildJob(RebuildConfig rebuildConfig)
- {
- this.rebuildConfig = rebuildConfig;
- }
-
- private static void addJob(RebuildJob job)
- throws DatabaseException, JebException
- {
- //Make sure there are no running rebuild jobs
- jobsMutex.lock();
-
- try
- {
- for(RebuildJob otherJob : rebuildJobs)
- {
- String conflictIndex =
- job.rebuildConfig.checkConflicts(otherJob.rebuildConfig);
- if(conflictIndex != null)
- {
- if(debugEnabled())
- {
- TRACER.debugError("Conflit detected. This job config: %s, " +
- "That job config: %s.",
- job.rebuildConfig, otherJob.rebuildConfig);
- }
-
- Message msg = ERR_JEB_REBUILD_INDEX_CONFLICT.get(conflictIndex);
- throw new JebException(msg);
- }
- }
-
- //No conflicts are found. Add the job to the list of currently running
- // jobs.
- rebuildJobs.add(job);
- }
- finally
- {
- jobsMutex.unlock();
- }
- }
-
- private static void removeJob(RebuildJob job)
- {
- jobsMutex.lock();
-
- rebuildJobs.remove(job);
-
- jobsMutex.unlock();
- }
-
- /**
- * Initiate the rebuild process on a backend.
- *
- * @param rootContainer The root container to rebuild in.
- * @throws DirectoryException If an error occurs during the rebuild process.
- * @throws DatabaseException If a JE database error occurs during the rebuild
- * process.
- * @throws JebException If a JE database error occurs during the rebuild
- * process.
- */
- public void rebuildBackend(RootContainer rootContainer)
- throws DirectoryException, DatabaseException, JebException
- {
- //TODO: Add check for only performing internal indexType rebuilds when
- // backend is offline.
-
- addJob(this);
-
- try
- {
- this.rootContainer = rootContainer;
- EntryContainer entryContainer =
- rootContainer.getEntryContainer(rebuildConfig.getBaseDN());
-
- ArrayList<String> rebuildList = rebuildConfig.getRebuildList();
-
- if(!rebuildList.isEmpty())
- {
-
- for (String index : rebuildList)
- {
- IndexRebuildThread rebuildThread;
- String lowerName = index.toLowerCase();
- if (lowerName.equals("dn2id"))
- {
- rebuildThread = new IndexRebuildThread(entryContainer,
- IndexRebuildThread.IndexType.DN2ID);
- }
- else if (lowerName.equals("dn2uri"))
- {
- rebuildThread = new IndexRebuildThread(entryContainer,
- IndexRebuildThread.IndexType.DN2URI);
- }
- else if (lowerName.equals("id2children"))
- {
- rebuildThread = new IndexRebuildThread(entryContainer,
- IndexRebuildThread.IndexType.ID2CHILDREN);
- }
- else if (lowerName.equals("id2subtree"))
- {
- rebuildThread = new IndexRebuildThread(entryContainer,
- IndexRebuildThread.IndexType.ID2SUBTREE);
- }
- else if (lowerName.startsWith("vlv."))
- {
- if(lowerName.length() < 5)
- {
- Message msg = ERR_JEB_VLV_INDEX_NOT_CONFIGURED.get(lowerName);
- throw new JebException(msg);
- }
-
- VLVIndex vlvIndex =
- entryContainer.getVLVIndex(lowerName.substring(4));
- if(vlvIndex == null)
- {
- Message msg =
- ERR_JEB_VLV_INDEX_NOT_CONFIGURED.get(lowerName.substring(4));
- throw new JebException(msg);
- }
-
- rebuildThread = new IndexRebuildThread(entryContainer, vlvIndex);
- }
- else
- {
- String[] attrIndexParts = lowerName.split("\\.");
- if(attrIndexParts.length <= 0)
- {
- Message msg = ERR_JEB_ATTRIBUTE_INDEX_NOT_CONFIGURED.get(index);
- throw new JebException(msg);
- }
-
- AttributeType attrType =
- DirectoryServer.getAttributeType(attrIndexParts[0]);
-
- if (attrType == null)
- {
- Message msg = ERR_JEB_ATTRIBUTE_INDEX_NOT_CONFIGURED.get(index);
- throw new JebException(msg);
- }
- AttributeIndex attrIndex =
- entryContainer.getAttributeIndex(attrType);
- if (attrIndex == null)
- {
- Message msg = ERR_JEB_ATTRIBUTE_INDEX_NOT_CONFIGURED.get(index);
- throw new JebException(msg);
- }
-
- if(attrIndexParts.length > 1)
- {
- Index partialAttrIndex = null;
- if(attrIndexParts[1].equals("presence"))
- {
- partialAttrIndex = attrIndex.presenceIndex;
- }
- else if(attrIndexParts[1].equals("equality"))
- {
- partialAttrIndex = attrIndex.equalityIndex;
- }
- else if(attrIndexParts[1].equals("substring"))
- {
- partialAttrIndex = attrIndex.substringIndex;
- }
- else if(attrIndexParts[1].equals("ordering"))
- {
- partialAttrIndex = attrIndex.orderingIndex;
- }
- else if(attrIndexParts[1].equals("approximate"))
- {
- partialAttrIndex = attrIndex.approximateIndex;
- }
-
- if(partialAttrIndex == null)
- {
- Message msg = ERR_JEB_ATTRIBUTE_INDEX_NOT_CONFIGURED.get(index);
- throw new JebException(msg);
- }
-
- rebuildThread =
- new IndexRebuildThread(entryContainer, partialAttrIndex);
- }
- else
- {
- rebuildThread = new IndexRebuildThread(entryContainer,
- attrIndex);
- }
- }
-
- waitingThreads.add(rebuildThread);
-
- if(debugEnabled())
- {
- TRACER.debugInfo("Created rebuild thread %s",
- rebuildThread.getName());
- }
- }
-
- //Log a start message.
- long totalToProcess = 0;
-
- for(IndexRebuildThread thread : waitingThreads)
- {
- totalToProcess += thread.getTotalEntries();
- }
-
- StringBuilder sb = new StringBuilder();
- for(String index : rebuildList)
- {
- if(sb.length() > 0)
- {
- sb.append(", ");
- }
- sb.append(index);
- }
- Message message =
- NOTE_JEB_REBUILD_START.get(sb.toString(), totalToProcess);
- logError(message);
-
- // Make a note of the time we started.
- long startTime = System.currentTimeMillis();
-
- // Start a timer for the progress report.
- Timer timer = new Timer();
- TimerTask progressTask = new ProgressTask();
- timer.scheduleAtFixedRate(progressTask, progressInterval,
- progressInterval);
-
- entryContainer.exclusiveLock.lock();
- try
- {
- for(IndexRebuildThread thread : waitingThreads)
- {
- thread.clearDatabase();
- }
- }
- finally
- {
- if(!rebuildConfig.includesSystemIndex())
- {
- entryContainer.exclusiveLock.unlock();
- }
- }
-
-
- if(!rebuildConfig.includesSystemIndex())
- {
- entryContainer.sharedLock.lock();
- }
- try
- {
- while(!waitingThreads.isEmpty())
- {
- dispatchThreads();
- joinThreads();
- }
- }
- finally
- {
- timer.cancel();
- if(rebuildConfig.includesSystemIndex())
- {
- entryContainer.exclusiveLock.unlock();
- }
- else
- {
- entryContainer.sharedLock.unlock();
- }
- }
-
- long totalProcessed = 0;
- long totalRebuilt = 0;
- long totalDuplicated = 0;
- long totalSkipped = 0;
-
- for(IndexRebuildThread thread : completedThreads)
- {
- totalProcessed += thread.getProcessedEntries();
- totalRebuilt += thread.getRebuiltEntries();
- totalDuplicated += thread.getDuplicatedEntries();
- totalSkipped += thread.getSkippedEntries();
- }
-
- long finishTime = System.currentTimeMillis();
- long totalTime = (finishTime - startTime);
-
- float rate = 0;
- if (totalTime > 0)
- {
- rate = 1000f*totalProcessed / totalTime;
- }
-
- message = NOTE_JEB_REBUILD_FINAL_STATUS.get(
- totalProcessed, totalTime/1000, rate);
- logError(message);
-
- if(debugEnabled())
- {
- TRACER.debugInfo("Detailed overall rebuild job stats: rebuilt %d, " +
- "duplicated %d, skipped %d",
- totalRebuilt, totalDuplicated, totalSkipped);
- }
- }
- }
- finally
- {
- removeJob(this);
- }
-
- }
-
- /**
- * Dispatch a set of threads based on their dependency and ordering.
- */
- private void dispatchThreads() throws DatabaseException
- {
- for(IndexRebuildThread t : waitingThreads)
- {
- boolean start = true;
-
- //Check to see if we have exceeded the max number of threads to use at
- //one time.
- if(rebuildConfig.getMaxRebuildThreads() > 0 &&
- activeThreads.size() > rebuildConfig.getMaxRebuildThreads())
- {
- if(debugEnabled())
- {
- TRACER.debugInfo("Delaying the start of thread %s because " +
- "the max number of rebuild threads has been reached.");
- }
- start = false;
- }
-
- /**
- * We may need to start the threads in stages since the rebuild process
- * of some index types (id2children, id2subtree) depends on another
- * index being rebuilt to be completed first.
- */
- if(t.getIndexType() == IndexRebuildThread.IndexType.ID2CHILDREN ||
- t.getIndexType() == IndexRebuildThread.IndexType.ID2SUBTREE)
- {
- //Check to see if we have any waiting threads that needs to go
- //first
- for(IndexRebuildThread t2 : waitingThreads)
- {
- if(t2.getIndexType() == IndexRebuildThread.IndexType.DN2ID ||
- t2.getIndexType() == IndexRebuildThread.IndexType.DN2URI)
- {
- //We gotta wait for these to start before running the
- //rebuild on ID2CHILDREN or ID2SUBTREE
-
- if(debugEnabled())
- {
- TRACER.debugInfo("Delaying the start of thread %s because " +
- "it depends on another index rebuilt to " +
- "go first.", t.getName());
- }
- start = false;
- break;
- }
- }
-
- //Check to see if we have any active threads that needs to
- //finish first
- for(IndexRebuildThread t3 : activeThreads)
- {
- if(t3.getIndexType() == IndexRebuildThread.IndexType.DN2ID ||
- t3.getIndexType() == IndexRebuildThread.IndexType.DN2URI)
- {
- //We gotta wait for these to start before running the
- //rebuild on ID2CHILDREN or ID2SUBTREE
-
- if(debugEnabled())
- {
- TRACER.debugInfo("Delaying the start of thread %s because " +
- "it depends on another index being rebuilt to " +
- "finish.", t.getName());
- }
- start = false;
- break;
- }
- }
- }
-
- if(start)
- {
- if(debugEnabled())
- {
- TRACER.debugInfo("Starting rebuild thread %s.", t.getName());
- }
- waitingThreads.remove(t);
- activeThreads.add(t);
- t.start();
- }
- }
- }
-
- /**
- * Wait for all worker activeThreads to exit.
- */
- private void joinThreads()
- {
- for (IndexRebuildThread t : activeThreads)
- {
- try
- {
- t.join();
-
- if(debugEnabled())
- {
- TRACER.debugInfo("Rebuild thread %s finished.", t.getName());
- }
- activeThreads.remove(t);
- completedThreads.add(t);
- }
- catch (InterruptedException ie)
- {
- // No action needed?
- }
- }
- }
-}
--
Gitblit v1.10.0