| | |
| | | |
| | | import static com.persistit.Transaction.CommitPolicy.*; |
| | | import static java.util.Arrays.*; |
| | | |
| | | import static org.opends.messages.BackendMessages.*; |
| | | import static org.opends.messages.ConfigMessages.*; |
| | | import static org.opends.messages.JebMessages.*; |
| | |
| | | import java.io.File; |
| | | import java.io.FilenameFilter; |
| | | import java.util.HashMap; |
| | | import java.util.LinkedHashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | import org.forgerock.i18n.LocalizableMessage; |
| | | import org.forgerock.i18n.slf4j.LocalizedLogger; |
| | |
| | | import org.forgerock.opendj.ldap.ByteString; |
| | | import org.opends.server.admin.server.ConfigurationChangeListener; |
| | | import org.opends.server.admin.std.server.PersistitBackendCfg; |
| | | import org.opends.server.api.AlertGenerator; |
| | | import org.opends.server.api.DiskSpaceMonitorHandler; |
| | | import org.opends.server.backends.pluggable.spi.Cursor; |
| | | import org.opends.server.backends.pluggable.spi.Importer; |
| | |
| | | import org.opends.server.core.MemoryQuota; |
| | | import org.opends.server.core.ServerContext; |
| | | import org.opends.server.extensions.DiskSpaceMonitor; |
| | | import org.opends.server.types.DN; |
| | | import org.opends.server.types.FilePermission; |
| | | |
| | | import com.persistit.Configuration; |
| | |
| | | /** PersistIt database implementation of the {@link Storage} engine. */ |
| | | @SuppressWarnings("javadoc") |
| | | public final class PersistItStorage implements Storage, ConfigurationChangeListener<PersistitBackendCfg>, |
| | | DiskSpaceMonitorHandler, AlertGenerator |
| | | DiskSpaceMonitorHandler |
| | | { |
| | | private static final String VOLUME_NAME = "dj"; |
| | | /** The buffer / page size used by the PersistIt storage. */ |
| | |
| | | private PersistitBackendCfg config; |
| | | private DiskSpaceMonitor diskMonitor; |
| | | private MemoryQuota memQuota; |
| | | private StorageStatus storageStatus = StorageStatus.working(); |
| | | |
| | | /** |
| | | * Creates a new persistit storage with the provided configuration. |
| | |
| | | final BufferPoolConfiguration bufferPoolCfg = getBufferPoolCfg(); |
| | | bufferPoolCfg.setMaximumCount(Integer.MAX_VALUE); |
| | | |
| | | diskMonitor = serverContext.getDiskSpaceMonitor(); |
| | | memQuota = serverContext.getMemoryQuota(); |
| | | if (cfg.getDBCacheSize() > 0) |
| | | { |
| | |
| | | memQuota.releaseMemory(memQuota.memPercentToBytes(config.getDBCachePercent())); |
| | | } |
| | | config.removePersistitChangeListener(this); |
| | | DirectoryServer.deregisterMonitorProvider(diskMonitor); |
| | | DirectoryServer.deregisterAlertGenerator(this); |
| | | diskMonitor.deregisterMonitoredDirectory(getDirectory(), this); |
| | | } |
| | | |
| | | private BufferPoolConfiguration getBufferPoolCfg() |
| | |
| | | { |
| | | throw new StorageRuntimeException(e); |
| | | } |
| | | // Register as disk space monitor handler |
| | | diskMonitor = newDiskMonitor(config); |
| | | DirectoryServer.registerMonitorProvider(diskMonitor); |
| | | //Register as an AlertGenerator. |
| | | DirectoryServer.registerAlertGenerator(this); |
| | | diskMonitor.registerMonitoredDirectory( |
| | | config.getBackendId() + " backend", |
| | | getDirectory(), |
| | | config.getDiskLowThreshold(), |
| | | config.getDiskFullThreshold(), |
| | | this); |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | |
| | | |
| | | setDBDirPermissions(cfg, newBackendDirectory); |
| | | } |
| | | diskMonitor.setFullThreshold(cfg.getDiskFullThreshold()); |
| | | diskMonitor.setLowThreshold(cfg.getDiskLowThreshold()); |
| | | |
| | | diskMonitor.registerMonitoredDirectory( |
| | | config.getBackendId() + " backend", |
| | | getDirectory(), |
| | | cfg.getDiskLowThreshold(), |
| | | cfg.getDiskFullThreshold(), |
| | | this); |
| | | config = cfg; |
| | | } |
| | | catch (Exception e) |
| | |
| | | @Override |
| | | public StorageStatus getStorageStatus() |
| | | { |
| | | if (diskMonitor.isFullThresholdReached()) |
| | | { |
| | | return StorageStatus.unusable(WARN_JEB_OUT_OF_DISK_SPACE.get()); |
| | | } |
| | | if (diskMonitor.isLowThresholdReached()) |
| | | { |
| | | return StorageStatus.lockedDown(WARN_JEB_OUT_OF_DISK_SPACE.get()); |
| | | } |
| | | return StorageStatus.working(); |
| | | return storageStatus; |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public void diskFullThresholdReached(DiskSpaceMonitor monitor) { |
| | | LocalizableMessage msg = ERR_JEB_DISK_FULL_THRESHOLD_REACHED.get( |
| | | monitor.getDirectory().getPath(), config.getBackendId(), monitor.getFreeSpace(), |
| | | Math.max(monitor.getLowThreshold(), monitor.getFullThreshold())); |
| | | DirectoryServer.sendAlertNotification(this, ALERT_TYPE_DISK_FULL, msg); |
| | | public void diskFullThresholdReached(File directory, long thresholdInBytes) { |
| | | storageStatus = StorageStatus.unusable( |
| | | WARN_DISK_SPACE_FULL_THRESHOLD_CROSSED.get(directory.getFreeSpace(), directory.getAbsolutePath(), |
| | | thresholdInBytes, config.getBackendId())); |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public void diskLowThresholdReached(DiskSpaceMonitor monitor) { |
| | | LocalizableMessage msg = ERR_JEB_DISK_LOW_THRESHOLD_REACHED.get( |
| | | monitor.getDirectory().getPath(), config.getBackendId(), monitor.getFreeSpace(), |
| | | Math.max(monitor.getLowThreshold(), monitor.getFullThreshold())); |
| | | DirectoryServer.sendAlertNotification(this, ALERT_TYPE_DISK_SPACE_LOW, msg); |
| | | public void diskLowThresholdReached(File directory, long thresholdInBytes) { |
| | | storageStatus = StorageStatus.lockedDown( |
| | | WARN_DISK_SPACE_LOW_THRESHOLD_CROSSED.get(directory.getFreeSpace(), directory.getAbsolutePath(), |
| | | thresholdInBytes, config.getBackendId())); |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public void diskSpaceRestored(DiskSpaceMonitor monitor) { |
| | | logger.error(NOTE_JEB_DISK_SPACE_RESTORED, monitor.getFreeSpace(), |
| | | monitor.getDirectory().getPath(), config.getBackendId(), |
| | | Math.max(monitor.getLowThreshold(), monitor.getFullThreshold())); |
| | | } |
| | | |
| | | private DiskSpaceMonitor newDiskMonitor(PersistitBackendCfg config) throws Exception |
| | | { |
| | | File parentDirectory = getFileForPath(config.getDBDirectory()); |
| | | File backendDirectory = new File(parentDirectory, config.getBackendId()); |
| | | DiskSpaceMonitor dm = new DiskSpaceMonitor(config.getBackendId() + " backend", |
| | | backendDirectory, config.getDiskLowThreshold(), config.getDiskFullThreshold(), |
| | | 5, TimeUnit.SECONDS, this); |
| | | dm.initializeMonitorProvider(null); |
| | | return dm; |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public DN getComponentEntryDN() { |
| | | return config.dn(); |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public String getClassName() { |
| | | return PersistItStorage.class.getName(); |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public Map<String, String> getAlerts() |
| | | { |
| | | Map<String, String> alerts = new LinkedHashMap<String, String>(); |
| | | alerts.put(ALERT_TYPE_DISK_SPACE_LOW, ALERT_DESCRIPTION_DISK_SPACE_LOW); |
| | | alerts.put(ALERT_TYPE_DISK_FULL, ALERT_DESCRIPTION_DISK_FULL); |
| | | return alerts; |
| | | public void diskSpaceRestored(File directory, long lowThresholdInBytes, long fullThresholdInBytes) { |
| | | storageStatus = StorageStatus.working(); |
| | | } |
| | | } |
| | | |