/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2010, 2015 Oracle and/or its affiliates. All rights reserved.
*
*/
package repmgrtests;
import org.junit.Test;
import static org.junit.Assert.*;
import java.io.File;
/**
* Test of Replication Manager's ability to discriminate between
* per-connection wire protocol versions. When configured to use
* heartbeats, a modern repmgr nevertheless should ignore them when
* talking to a v1 connection.
*/
// TODO: it might make more sense to refer to sites with a name, which
// could double as the env directory name.
//
public class TestMixedHeartbeats extends AbstractUpgTest {
public interface Ops {
public void setConfig(Config c);
public void joinExistingClient(int site, boolean useHB)
throws Exception;
public void becomeMaster(int site) throws Exception;
public MyStats getStats(int site) throws Exception;
public void checkMinVersion() throws Exception;
public void checkpoint(int site) throws Exception;
}
public interface Ops46 {
public void setConfig(Config c);
public void createMaster(int site, boolean configureClient)
throws Exception;
public void establishClient(int site, boolean configureMaster)
throws Exception;
public void shutDown(int siteId) throws Exception;
public void remove(int site) throws Exception;
public void checkMaxVersion() throws Exception;
}
public TestMixedHeartbeats() {
super("46", "repmgrtests.V46impl", "repmgrtests.CurrentImpl");
}
@Test public void upg() throws Exception {
Ops46 oldGroup = (Ops46)oldGroup_o;
Ops currentGroup = (Ops)currentGroup_o;
// also: ask DB its version, and make sure it's what we expect
// (or at least in reasonable range),
// otherwise we have no business running this test.
// create a v1 master, maybe add some data
// create a v2 client to join (configured for hb), wait for start-up done
// maybe write some new txns at master, see that they get to client
// pause for hb monitor time expiration
// verify that no election has been called (check election stats at each site, I guess)
// shut down v1 master
// verify that client site takes over (use nsites == 2, and don't disable kluge)
// upgrade site 1, and have it rejoin as a client
// pause again, verify no add'l election (not counting the one take-over we know about)
// (maybe we don't need fiddler, since we've already tested normal v2 hb operation)
//
// V1 operations:
// create master
// write some txns
// read some stats
// shut down, recover, remove (for upgrade)
// v2 operations:
// join a group, wait for start-up done
// read some stats
// run a checkpoint
//
// version-independent configuration:
// master port 6000
// client port 6001
// base directory (site directories to be generated by some simple rule?)
File testdir = new File("TESTDIR");
Util.rm_rf(testdir);
testdir.mkdir();
Config config = new Config(testdir);
oldGroup.setConfig(config);
currentGroup.setConfig(config);
oldGroup.createMaster(0, false);
oldGroup.establishClient(1, true);
currentGroup.joinExistingClient(1, true);
// Even though the v1 site clearly cannot be sending heartbeats,
// the v2 site should be smart enough not to consider that an
// error, even though it is configured for heartbeats.
//
MyStats s1 = currentGroup.getStats(1);
long initialCount = s1.elections;
long initialEgen = s1.egen;
Thread.sleep(10000);
s1 = currentGroup.getStats(1);
assertEquals(initialCount, s1.elections);
assertEquals(initialEgen, s1.egen);
// Shut down master, verify that client takes over.
//
oldGroup.shutDown(0);
currentGroup.becomeMaster(1);
s1 = currentGroup.getStats(1);
assertEquals(initialCount+1, s1.elections);
assertTrue("Site 1 is now master", s1.envId == s1.master);
// Upgrade the former master (site 0), and rejoin the group.
// NB: IINM, this form of upgrade works when the log formats may have
// changed, but database formats have not. I guess if a
// future release changes database formats, we'll have to go
// through a bit more work to do this upgrade in the test here.
//
oldGroup.remove(0);
currentGroup.checkpoint(0);
currentGroup.joinExistingClient(0, true);
// Now site 1 is master, and site 0 has rejoined as a client, both running
// 4.7 (or higher). Pause again; heartbeats should be flowing, and there
// should be no interruption for elections.
//
MyStats s0 = currentGroup.getStats(0);
assertTrue(s0.envId != s0.master);
s1 = currentGroup.getStats(1);
assertTrue(s1.envId == s1.master);
initialCount = s0.elections;
initialEgen = s0.egen;
Thread.sleep(10000);
s0 = currentGroup.getStats(0);
assertEquals(initialCount, s0.elections);
assertEquals(initialEgen, s0.egen);
}
// TODO: during mixed mode, write some txns at master to verify that
// acks can be transmitted correctly. (Shall we check that the master
// really does recognize that it has a site connected?)
}