From 59a0e0cae4a717d92ccf08aa56d427015498becf Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Fri, 07 Sep 2007 08:57:27 +0000
Subject: [PATCH]
---
opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java | 242 +++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 226 insertions(+), 16 deletions(-)
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
index 414dd88..8061015 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -25,16 +25,16 @@
* Portions Copyright 2006-2007 Sun Microsystems, Inc.
*/
package org.opends.server.replication.server;
-import org.opends.messages.*;
-import static org.opends.server.loggers.ErrorLogger.logError;
import static org.opends.messages.ReplicationMessages.*;
-
-import org.opends.messages.MessageBuilder;
+import static org.opends.server.loggers.ErrorLogger.logError;
+import static org.opends.server.loggers.debug.DebugLogger.debugEnabled;
+import static org.opends.server.loggers.debug.DebugLogger.getTracer;
+import static org.opends.server.util.ServerConstants.EOL;
import static org.opends.server.util.StaticUtils.getFileForPath;
-import static org.opends.server.util.StaticUtils.stackTraceToSingleLineString;
import java.io.File;
import java.io.IOException;
+import java.io.StringReader;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
@@ -47,22 +47,35 @@
import java.util.List;
import java.util.Set;
+import org.opends.messages.Message;
+import org.opends.messages.MessageBuilder;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.server.MonitorProviderCfg;
import org.opends.server.admin.std.server.ReplicationServerCfg;
+import org.opends.server.api.Backend;
+import org.opends.server.api.BackupTaskListener;
+import org.opends.server.api.ExportTaskListener;
+import org.opends.server.api.ImportTaskListener;
import org.opends.server.api.MonitorProvider;
+import org.opends.server.api.RestoreTaskListener;
import org.opends.server.config.ConfigException;
import org.opends.server.core.DirectoryServer;
-import org.opends.server.replication.protocol.ReplSessionSecurity;
+import org.opends.server.loggers.LogLevel;
+import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.replication.protocol.ProtocolSession;
+import org.opends.server.replication.protocol.ReplSessionSecurity;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeType;
import org.opends.server.types.AttributeValue;
+import org.opends.server.types.BackupConfig;
import org.opends.server.types.ConfigChangeResult;
import org.opends.server.types.DN;
+import org.opends.server.types.Entry;
+import org.opends.server.types.LDIFExportConfig;
+import org.opends.server.types.LDIFImportConfig;
+import org.opends.server.types.RestoreConfig;
import org.opends.server.types.ResultCode;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-import org.opends.server.loggers.debug.DebugTracer;
+import org.opends.server.util.LDIFReader;
import com.sleepycat.je.DatabaseException;
@@ -77,7 +90,9 @@
* It is responsible for creating the replication server cache and managing it
*/
public class ReplicationServer extends MonitorProvider<MonitorProviderCfg>
- implements Runnable, ConfigurationChangeListener<ReplicationServerCfg>
+ implements Runnable, ConfigurationChangeListener<ReplicationServerCfg>,
+ BackupTaskListener, RestoreTaskListener, ImportTaskListener,
+ ExportTaskListener
{
private short serverId;
private String serverURL;
@@ -108,6 +123,12 @@
private boolean stopListen = false;
private ReplSessionSecurity replSessionSecurity;
+ // For the backend associated to this replication server,
+ // DN of the config entry of the backend
+ private DN backendConfigEntryDN;
+ // ID of the backend
+ private static final String backendId = "replicationChanges";
+
/**
* The tracer object for the debug logger.
*/
@@ -120,11 +141,10 @@
* @throws ConfigException When Configuration is invalid.
*/
public ReplicationServer(ReplicationServerCfg configuration)
- throws ConfigException
+ throws ConfigException
{
super("Replication Server" + configuration.getReplicationPort());
- shutdown = false;
replicationPort = configuration.getReplicationPort();
replicationServerId = (short) configuration.getReplicationServerId();
replicationServers = configuration.getReplicationServer();
@@ -162,6 +182,21 @@
initialize(replicationServerId, replicationPort);
configuration.addChangeListener(this);
DirectoryServer.registerMonitorProvider(this);
+
+ try
+ {
+ backendConfigEntryDN = DN.decode(
+ "ds-cfg-backend-id=" + backendId + ",cn=Backends,cn=config");
+ } catch (Exception e) {}
+
+ // Creates the backend associated to this ReplicationServer
+ // if it does not exist.
+ createBackend();
+
+ DirectoryServer.registerBackupTaskListener(this);
+ DirectoryServer.registerRestoreTaskListener(this);
+ DirectoryServer.registerExportTaskListener(this);
+ DirectoryServer.registerImportTaskListener(this);
}
@@ -315,6 +350,8 @@
*/
private void initialize(short changelogId, int changelogPort)
{
+ shutdown = false;
+
try
{
/*
@@ -458,7 +495,7 @@
dbEnv.shutdown();
}
DirectoryServer.deregisterMonitorProvider(getMonitorInstanceName());
- }
+}
/**
@@ -492,10 +529,7 @@
}
catch(Exception e)
{
- TRACER.debugInfo(
- "In RS <" + getMonitorInstanceName() +
- " Exception in clearGenerationId" +
- stackTraceToSingleLineString(e) + e.getLocalizedMessage());
+ TRACER.debugCaught(LogLevel.ALL, e);
}
}
@@ -730,4 +764,180 @@
{
return serverId;
}
+
+ /**
+ * Creates the backend associated to this replication server.
+ * @throws ConfigException
+ */
+ private void createBackend()
+ throws ConfigException
+ {
+ try
+ {
+ String ldif = makeLdif(
+ "dn: ds-cfg-backend-id="+backendId+",cn=Backends,cn=config",
+ "objectClass: top",
+ "objectClass: ds-cfg-backend",
+ "objectClass: ds-cfg-je-backend",
+ "ds-cfg-backend-base-dn: dc="+backendId,
+ "ds-cfg-backend-enabled: true",
+ "ds-cfg-backend-writability-mode: enabled",
+ "ds-cfg-backend-class: " +
+ "org.opends.server.replication.server.ReplicationBackend",
+ "ds-cfg-backend-id: " + backendId,
+ "ds-cfg-backend-import-temp-directory: importTmp",
+ "ds-cfg-backend-directory: " + getFileForPath(dbDirname));
+
+ LDIFImportConfig ldifImportConfig = new LDIFImportConfig(
+ new StringReader(ldif));
+ LDIFReader reader = new LDIFReader(ldifImportConfig);
+ Entry backendConfigEntry = reader.readEntry();
+ if (!DirectoryServer.getConfigHandler().entryExists(backendConfigEntryDN))
+ {
+ // Add the replication backend
+ DirectoryServer.getConfigHandler().addEntry(backendConfigEntry, null);
+ }
+ }
+ catch(Exception e)
+ {
+ MessageBuilder mb = new MessageBuilder();
+ mb.append(e.getLocalizedMessage());
+ Message msg = ERR_CHECK_CREATE_REPL_BACKEND_FAILED.get(mb.toString());
+ throw new ConfigException(msg, e);
+
+ }
+ }
+
+ private static String makeLdif(String... lines)
+ {
+ StringBuilder buffer = new StringBuilder();
+ for (String line : lines) {
+ buffer.append(line).append(EOL);
+ }
+ // Append an extra line so we can append LDIF Strings.
+ buffer.append(EOL);
+ return buffer.toString();
+ }
+
+ /**
+ * Do what needed when the config object related to this replication server
+ * is deleted from the server configuration.
+ */
+ public void remove()
+ {
+ if (debugEnabled())
+ TRACER.debugInfo("RS " +getMonitorInstanceName()+
+ " starts removing");
+
+ shutdown();
+ removeBackend();
+
+ DirectoryServer.deregisterBackupTaskListener(this);
+ DirectoryServer.deregisterRestoreTaskListener(this);
+ DirectoryServer.deregisterExportTaskListener(this);
+ DirectoryServer.deregisterImportTaskListener(this);
+ }
+
+ /**
+ * Removes the backend associated to this Replication Server that has been
+ * created when this replication server was created.
+ */
+ protected void removeBackend()
+ {
+ try
+ {
+ if (!DirectoryServer.getConfigHandler().entryExists(backendConfigEntryDN))
+ {
+ // Delete the replication backend
+ DirectoryServer.getConfigHandler().deleteEntry(backendConfigEntryDN,
+ null);
+ }
+ }
+ catch(Exception e)
+ {
+ MessageBuilder mb = new MessageBuilder();
+ mb.append(e.getLocalizedMessage());
+ Message msg = ERR_DELETE_REPL_BACKEND_FAILED.get(mb.toString());
+ logError(msg);
+ }
+ }
+ /**
+ * {@inheritDoc}
+ */
+ public void processBackupBegin(Backend backend, BackupConfig config)
+ {
+ // Nothing is needed at the moment
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void processBackupEnd(Backend backend, BackupConfig config,
+ boolean successful)
+ {
+ // Nothing is needed at the moment
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void processRestoreBegin(Backend backend, RestoreConfig config)
+ {
+ if (backend.getBackendID().equals(backendId))
+ shutdown();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void processRestoreEnd(Backend backend, RestoreConfig config,
+ boolean successful)
+ {
+ if (backend.getBackendID().equals(backendId))
+ initialize(this.replicationServerId, this.replicationPort);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void processImportBegin(Backend backend, LDIFImportConfig config)
+ {
+ // Nothing is needed at the moment
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void processImportEnd(Backend backend, LDIFImportConfig config,
+ boolean successful)
+ {
+ // Nothing is needed at the moment
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void processExportBegin(Backend backend, LDIFExportConfig config)
+ {
+ if (debugEnabled())
+ TRACER.debugInfo("RS " +getMonitorInstanceName()+
+ " Export starts");
+ if (backend.getBackendID().equals(backendId))
+ {
+ // Retrieves the backend related to this domain
+ // backend =
+ ReplicationBackend b =
+ (ReplicationBackend)DirectoryServer.getBackend(backendId);
+ b.setServer(this);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void processExportEnd(Backend backend, LDIFExportConfig config,
+ boolean successful)
+ {
+ // Nothing is needed at the moment
+ }
}
--
Gitblit v1.10.0