| | |
| | | /** Generation id for a fully empty domain. */ |
| | | public static final long EMPTY_DN_GENID = GenerationIdChecksum.EMPTY_BACKEND_GENERATION_ID; |
| | | |
| | | /** The group a replication server and a replication domain are in unless told otherwise. */ |
| | | protected static final int DEFAULT_GROUP_ID = 1; |
| | | |
| | | /** |
| | | * The group of a broker which is in none. Assured replication does not cross group ids, |
| | | * so such a broker is never waited for and never waits: it is all a broker which only |
| | | * publishes and reads updates needs. |
| | | */ |
| | | private static final int NO_GROUP_ID = -1; |
| | | |
| | | /** How many times {@link #assertMonitorAttrValueStays} reads a value by default. */ |
| | | private static final int MONITOR_ATTR_SAMPLES = 5; |
| | | |
| | |
| | | int serverId, int windowSize, int port, int timeout, |
| | | long generationId) throws Exception |
| | | { |
| | | final DomainFakeCfg config = newFakeCfg(baseDN, serverId, port); |
| | | return openReplicationSession( |
| | | newFakeCfg(baseDN, serverId, port), windowSize, timeout, generationId); |
| | | } |
| | | |
| | | /** |
| | | * Open a session to the local ReplicationServer which takes part in assured replication. |
| | | * <p> |
| | | * Assured replication does not cross group ids, so a broker whose updates are to be |
| | | * acknowledged by the replicas of this server has to be in the group of the replication |
| | | * server: an update published by a broker of another group is acknowledged on the spot, |
| | | * by the replication server itself, and says nothing about what any replica did with it. |
| | | * <p> |
| | | * The group cuts both ways, and this broker does not acknowledge anything: the |
| | | * replication server expects an ack from every replica of its group whatever that |
| | | * replica is configured for, so a SAFE_READ update published by anyone else while this |
| | | * broker is connected waits out the {@code assured-timeout} of the server. Publish the |
| | | * assured updates from this broker, and open only one of them. |
| | | * |
| | | * @param baseDN the suffix the session is opened for |
| | | * @param serverId the id this broker takes |
| | | * @param windowSize the window size of the session |
| | | * @param port the port of the local replication server |
| | | * @param timeout the read timeout of the session, or 0 for none |
| | | * @return the connected broker |
| | | * @throws Exception if the session could not be opened |
| | | */ |
| | | protected ReplicationBroker openAssuredReplicationSession(final DN baseDN, |
| | | int serverId, int windowSize, int port, int timeout) throws Exception |
| | | { |
| | | return openReplicationSession(newFakeCfg(baseDN, serverId, port, DEFAULT_GROUP_ID), |
| | | windowSize, timeout, getGenerationId(baseDN)); |
| | | } |
| | | |
| | | private ReplicationBroker openReplicationSession(final DomainFakeCfg config, |
| | | int windowSize, int timeout, long generationId) throws Exception |
| | | { |
| | | config.setWindowSize(windowSize); |
| | | |
| | | final ReplicationBroker broker = new ReplicationBroker( |
| | |
| | | |
| | | protected DomainFakeCfg newFakeCfg(final DN baseDN, int serverId, int port) |
| | | { |
| | | DomainFakeCfg fakeCfg = new DomainFakeCfg(baseDN, serverId, newTreeSet("127.0.0.1:" + port)); |
| | | return newFakeCfg(baseDN, serverId, port, NO_GROUP_ID); |
| | | } |
| | | |
| | | protected DomainFakeCfg newFakeCfg(final DN baseDN, int serverId, int port, int groupId) |
| | | { |
| | | DomainFakeCfg fakeCfg = |
| | | new DomainFakeCfg(baseDN, serverId, newTreeSet("127.0.0.1:" + port), groupId); |
| | | fakeCfg.setHeartbeatInterval(100000); |
| | | fakeCfg.setChangetimeHeartbeatInterval(500); |
| | | return fakeCfg; |