| | |
| | | */ |
| | | package org.opends.server.replication.server.changelog.api; |
| | | |
| | | import java.util.Set; |
| | | |
| | | import org.opends.server.replication.common.CSN; |
| | | import org.opends.server.replication.common.ServerState; |
| | | import org.opends.server.replication.protocol.UpdateMsg; |
| | | import org.opends.server.types.DN; |
| | | |
| | | /** |
| | | * The changelogDB stores the replication data on persistent storage. |
| | | * <p> |
| | | * This interface allows to: |
| | | * <ul> |
| | | * <li>set the storage directory and the purge interval</li> |
| | | * <li>get access to the {@link ChangeNumberIndexDB}</li> |
| | | * <li>query or control the replication domain database(s) (composed of one or |
| | | * more ReplicaDBs)</li> |
| | | * <li>query/update each ReplicaDB</li> |
| | | * </ul> |
| | | * This interface is the entry point for the changelog database which stores the |
| | | * replication data on persistent storage. It allows to control the overall |
| | | * database or access more specialized interfaces. |
| | | */ |
| | | public interface ChangelogDB |
| | | { |
| | | |
| | | // DB control methods |
| | | |
| | | /** |
| | | * Initializes the replication database by reading its previous state and |
| | | * building the relevant ReplicaDBs according to the previous state. This |
| | |
| | | */ |
| | | ChangeNumberIndexDB getChangeNumberIndexDB(); |
| | | |
| | | // Domain methods |
| | | |
| | | /** |
| | | * Returns the serverIds for the servers that are or have been part of the |
| | | * provided replication domain. |
| | | * Returns the {@link ReplicationDomainDB} object. |
| | | * |
| | | * @param baseDN |
| | | * the replication domain baseDN |
| | | * @return an unmodifiable set of integers holding the serverIds |
| | | * @return the {@link ReplicationDomainDB} object |
| | | */ |
| | | Set<Integer> getDomainServerIds(DN baseDN); |
| | | |
| | | /** |
| | | * Get the number of changes for the specified replication domain. |
| | | * |
| | | * @param baseDN |
| | | * the replication domain baseDN |
| | | * @return the number of changes. |
| | | */ |
| | | long getDomainChangesCount(DN baseDN); |
| | | |
| | | /** |
| | | * Returns the oldest {@link CSN}s of each serverId for the specified |
| | | * replication domain. |
| | | * |
| | | * @param baseDN |
| | | * the replication domain baseDN |
| | | * @return a new ServerState object holding the {serverId => oldest CSN} |
| | | * mapping. If a replica DB is empty or closed, the oldest CSN will be |
| | | * null for that replica. The caller owns the generated ServerState. |
| | | */ |
| | | ServerState getDomainOldestCSNs(DN baseDN); |
| | | |
| | | /** |
| | | * Returns the newest {@link CSN}s of each serverId for the specified |
| | | * replication domain. |
| | | * |
| | | * @param baseDN |
| | | * the replication domain baseDN |
| | | * @return a new ServerState object holding the {serverId => newest CSN} Map. |
| | | * If a replica DB is empty or closed, the newest CSN will be null for |
| | | * that replica. The caller owns the generated ServerState. |
| | | */ |
| | | ServerState getDomainNewestCSNs(DN baseDN); |
| | | |
| | | /** |
| | | * Retrieves the latest trim date for the specified replication domain. |
| | | * |
| | | * @param baseDN |
| | | * the replication domain baseDN |
| | | * @return the domain latest trim date |
| | | */ |
| | | long getDomainLatestTrimDate(DN baseDN); |
| | | |
| | | /** |
| | | * Shutdown all the replica databases for the specified replication domain. |
| | | * |
| | | * @param baseDN |
| | | * the replication domain baseDN |
| | | */ |
| | | void shutdownDomain(DN baseDN); |
| | | |
| | | /** |
| | | * Removes all the data relating to the specified replication domain and |
| | | * shutdown all its replica databases. In particular, it will: |
| | | * <ol> |
| | | * <li>remove all the changes from the replica databases</li> |
| | | * <li>remove all knowledge of the serverIds in this domain</li> |
| | | * <li>remove any knowledge of the current generationId for this domain</li> |
| | | * </ol> |
| | | * |
| | | * @param baseDN |
| | | * the replication domain baseDN |
| | | * @throws ChangelogException |
| | | * If a database problem happened |
| | | */ |
| | | void removeDomain(DN baseDN) throws ChangelogException; |
| | | |
| | | // serverId methods |
| | | |
| | | /** |
| | | * Return the number of changes inclusive between 2 provided {@link CSN}s for |
| | | * the specified serverId and replication domain. i.e. the <code>from</code> |
| | | * and <code>to</code> CSNs are included in the count. |
| | | * <p> |
| | | * Note that: |
| | | * <ol> |
| | | * <li>If <code>from</code> is null, the count starts at the oldest CSN in the |
| | | * database.</li> |
| | | * <li>If <code>to</code> is null, the count is 0.</li> |
| | | * <li>If both from and to are present, then the count includes them both |
| | | * <code>to</code> is null, the count ends at the newest CSN in the database. |
| | | * </li> |
| | | * <li>incidentally, if both <code>from</code> and <code>to</code> are null, |
| | | * the total count of entries in the replica database is returned.</li> |
| | | * </ol> |
| | | * <h6>Example</h6> |
| | | * <p> |
| | | * Given the following replica database for baseDN "dc=example,dc=com" and |
| | | * serverId 1: |
| | | * |
| | | * <pre> |
| | | * CSN1 <= Oldest |
| | | * CSN2 |
| | | * CSN3 |
| | | * CSN4 |
| | | * CSN5 <= Newest |
| | | * </pre> |
| | | * |
| | | * Then: |
| | | * |
| | | * <pre> |
| | | * assertEquals(getCount("dc=example,dc=com", 1, CSN1, CSN1), 1); |
| | | * assertEquals(getCount("dc=example,dc=com", 1, CSN1, CSN2), 2); |
| | | * assertEquals(getCount("dc=example,dc=com", 1, CSN1, CSN5), 5); |
| | | * assertEquals(getCount("dc=example,dc=com", 1, null, CSN5), 5); |
| | | * assertEquals(getCount("dc=example,dc=com", 1, CSN1, null), 0); |
| | | * assertEquals(getCount("dc=example,dc=com", 1, null, null), 5); |
| | | * </pre> |
| | | * |
| | | * @param baseDN |
| | | * the replication domain baseDN |
| | | * @param serverId |
| | | * the serverId on which to act |
| | | * @param from |
| | | * The older CSN where to start the count |
| | | * @param to |
| | | * The newer CSN where to end the count |
| | | * @return The computed number of changes |
| | | */ |
| | | long getCount(DN baseDN, int serverId, CSN from, CSN to); |
| | | |
| | | /** |
| | | * Returns the {@link CSN} situated immediately after the specified |
| | | * {@link CSN} for the specified serverId and replication domain according to |
| | | * the order specified by {@link CSN#compareTo(CSN)}. If an Exception occurs |
| | | * in this method, then it returns the oldest possible CSN for the provided |
| | | * serverId. |
| | | * |
| | | * @param baseDN |
| | | * the replication domain baseDN |
| | | * @param serverId |
| | | * the serverId for which we want the information |
| | | * @param startAfterCSN |
| | | * The position where the iterator must start |
| | | * @return the CSN immediately after startAfterCSN, or null if no CSN exist |
| | | * after startAfterCSN |
| | | */ |
| | | CSN getCSNAfter(DN baseDN, int serverId, CSN startAfterCSN); |
| | | |
| | | /** |
| | | * Generates a {@link ReplicaDBCursor} for the specified serverId and |
| | | * replication domain starting after the provided CSN. |
| | | * <p> |
| | | * The cursor is already advanced to the record after startAfterCSN. |
| | | * <p> |
| | | * When the cursor is not used anymore, client code MUST call the |
| | | * {@link ReplicaDBCursor#close()} method to free the resources and locks used |
| | | * by the cursor. |
| | | * |
| | | * @param baseDN |
| | | * the replication domain baseDN |
| | | * @param serverId |
| | | * Identifier of the server for which the cursor is created |
| | | * @param startAfterCSN |
| | | * Starting point for the cursor. If null, start from the oldest CSN |
| | | * @return a non null {@link ReplicaDBCursor} |
| | | */ |
| | | ReplicaDBCursor getCursorFrom(DN baseDN, int serverId, CSN startAfterCSN); |
| | | |
| | | /** |
| | | * for the specified serverId and replication domain. |
| | | * |
| | | * @param baseDN |
| | | * the replication domain baseDN |
| | | * @param serverId |
| | | * the serverId on which to act |
| | | * @param updateMsg |
| | | * the update message to publish to the replicaDB |
| | | * @return true if a db had to be created to publish this message |
| | | * @throws ChangelogException |
| | | * If a database problem happened |
| | | */ |
| | | boolean publishUpdateMsg(DN baseDN, int serverId, UpdateMsg updateMsg) |
| | | throws ChangelogException; |
| | | |
| | | ReplicationDomainDB getReplicationDomainDB(); |
| | | } |