/* * Mojito Distributed Hash Table (Mojito DHT) * Copyright (C) 2006-2007 LimeWire LLC * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package org.limewire.mojito.db; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.limewire.mojito.Context; import org.limewire.mojito.routing.RouteTable; import org.limewire.mojito.settings.DatabaseSettings; /** * Removes expired values from the local database. */ public class DatabaseCleaner implements Runnable { private static final Log LOG = LogFactory.getLog(DatabaseCleaner.class); private final Context context; private ScheduledFuture future; public DatabaseCleaner(Context context) { this.context = context; } /** * Starts the <code>DatabaseCleaner</code>. */ public synchronized void start() { if (future == null) { long delay = DatabaseSettings.DATABASE_CLEANER_PERIOD.getValue(); long initialDelay = delay; future = context.getDHTExecutorService() .scheduleWithFixedDelay(this, initialDelay, delay, TimeUnit.MILLISECONDS); } } /** * Stops the <code>DatabaseCleaner</code>. */ public synchronized void stop() { if (future != null) { future.cancel(true); future = null; } } /** * Removes all expired <code>DHTValueEntity</code> from the <code>Database</code>. */ private void cleanupDatabase() { EvictorManager evictorManager = context.getEvictorManager(); RouteTable routeTable = context.getRouteTable(); Database database = context.getDatabase(); synchronized (database) { for (DHTValueEntity entity : database.values()) { if (evictorManager.isExpired(routeTable, entity)) { if (LOG.isTraceEnabled()) { LOG.trace(entity + " is expired!"); } database.remove(entity.getPrimaryKey(), entity.getSecondaryKey()); } } } } public void run() { cleanupDatabase(); } }