File.separator + clusterID;
logger.logToAll(Logger.INFO,
"Restore persistent store for HA cluster " + clusterID + " from backup dir: " + backupDir);
FileStore fileStore = new FileStore(backupDir, false);
// Brokers table.
JDBCStore jdbcStore = null;
try {
// Re-create the jdbc store
doRecreate();
jdbcStore = (JDBCStore)StoreManager.getStore();
/*
* For data that are not broker specific, i.e. properties, change
* records, consumers, brokers, and sessions, we will retrieve
* those data from the top level directory (a.k.a cluster filestore).
*/
// Properties table
List haBrokers = null;
Properties properties = fileStore.getAllProperties();
Iterator propItr = properties.entrySet().iterator();
while (propItr.hasNext()) {
Map.Entry entry = (Map.Entry)propItr.next();
String name = (String)entry.getKey();
if (name.equals(STORE_PROPERTY_HABROKERS)) {
// Retrieve all HABrokerInfo from a property
haBrokers = (List)entry.getValue();
} else {
jdbcStore.updateProperty(name, entry.getValue(), false);
}
}
propItr = null; properties = null;
if (haBrokers == null || haBrokers.isEmpty()) {
throw new BrokerException(br.getKString(
BrokerResources.X_LOAD_ALL_BROKERINFO_FAILED));
}
// Configuration Change Record table
List<ChangeRecordInfo> records = fileStore.getAllConfigRecords();
for (int i = 0, len = records.size(); i < len; i++) {
jdbcStore.storeConfigChangeRecord(
records.get(i).getTimestamp(),
records.get(i).getRecord(), false);
}
records = null;
// Consumer table
Consumer[] consumerArray = fileStore.getAllInterests();
for (int i = 0; i < consumerArray.length; i++) {
jdbcStore.storeInterest(consumerArray[i], false);
}
consumerArray = null;
// Broker & Session table.
Iterator bkrItr = haBrokers.iterator();
while (bkrItr.hasNext()) {
HABrokerInfo bkrInfo = (HABrokerInfo)bkrItr.next();
jdbcStore.addBrokerInfo(bkrInfo, false);
}
/*
* For each broker in the cluster, we will retrieve broker specific
* data, destinations, messages, transactions, acknowledgements
* from their own filestore (a.k.a broker filestore).
*/
bkrItr = haBrokers.iterator();
while (bkrItr.hasNext()) {
// Backup data for each broker
HABrokerInfo bkrInfo = (HABrokerInfo)bkrItr.next();
String brokerID = bkrInfo.getId();
long sessionID = bkrInfo.getSessionID();
logger.logToAll(Logger.INFO,
"Restore persistent data for broker " + brokerID);
FileStore bkrFS = null;
JMSBridgeStore jmsbridgeStore = null;
try {
String instanceRootDir = backupDir + File.separator + brokerID;
bkrFS = new FileStore(instanceRootDir, false);
// Destination table.
Destination[] dstArray = bkrFS.getAllDestinations();
for (int i = 0, len = dstArray.length; i < len; i++) {
DestinationUID did = dstArray[i].getDestinationUID();
Destination dst = jdbcStore.getDestination(did);
if (dst == null) {
// Store the destination if not found
jdbcStore.storeDestination(dstArray[i], sessionID);
}
}
// Retrieve messages for each destination.
for (int i = 0, len = dstArray.length; i < len; i++) {
for (Enumeration e = bkrFS.messageEnumeration(dstArray[i]);
e.hasMoreElements();) {
DestinationUID did = dstArray[i].getDestinationUID();
Packet message = (Packet)e.nextElement();
SysMessageID mid = message.getSysMessageID();
// Get interest states for the message; Consumer State table
HashMap stateMap = bkrFS.getInterestStates(did, mid);
if (stateMap == null || stateMap.isEmpty()) {
jdbcStore.storeMessage(
did, message, null, null, sessionID, false);
} else {
int size = stateMap.size();
ConsumerUID[] iids = new ConsumerUID[size];
int[] states = new int[size];
Iterator stateItr = stateMap.entrySet().iterator();
int j = 0;
while (stateItr.hasNext()) {
Map.Entry entry = (Map.Entry)stateItr.next();
iids[j] = (ConsumerUID)entry.getKey();
states[j] = ((Integer)entry.getValue()).intValue();
j++;
}
jdbcStore.storeMessage(
did, message, iids, states, sessionID, false);
}
}
}
// Transaction table
Collection txnList = bkrFS.getTransactions(brokerID);
Iterator txnItr = txnList.iterator();
while (txnItr.hasNext()) {
TransactionUID tid = (TransactionUID)txnItr.next();
TransactionInfo txnInfo = bkrFS.getTransactionInfo(tid);
TransactionAcknowledgement txnAck[] =
bkrFS.getTransactionAcks(tid);
jdbcStore.storeTransaction(tid, txnInfo, sessionID);
for (int i = 0, len = txnAck.length; i < len; i++) {
jdbcStore.storeTransactionAck(tid, txnAck[i], false);
}
}
/**************************************************
* JMSBridge
**************************************************/
Properties bp = new Properties();
bp.setProperty("instanceRootDir", instanceRootDir);
bp.setProperty("reset", "false");
bp.setProperty("logdomain", "imqdbmgr");
jmsbridgeStore = (JMSBridgeStore)BridgeServiceManager.getExportedService(
"com.sun.messaging.bridge.service.JMSBridgeStore", "JMS", bp);
if (jmsbridgeStore != null) {
List bnames = jmsbridgeStore.getJMSBridges(null);
String bname = null;
Iterator itr = bnames.iterator();
while (itr.hasNext()) {
bname = (String)itr.next();
jdbcStore.addJMSBridge(bname, true, null);
}
jmsbridgeStore.closeJMSBridgeStore();
jmsbridgeStore = null;
bname = null;
itr = bnames.iterator();
while (itr.hasNext()) {
bname = (String)itr.next();
bp.setProperty("jmsbridge", bname);
if (jmsbridgeStore != null) {
jmsbridgeStore.closeJMSBridgeStore();
jmsbridgeStore = null;
}
logger.logToAll(logger.INFO, "Restore JMS bridge "+bname);
jmsbridgeStore = (JMSBridgeStore)BridgeServiceManager.getExportedService(
"com.sun.messaging.bridge.service.JMSBridgeStore", "JMS", bp);
List xids = jmsbridgeStore.getTMLogRecordKeysByName(bname, null);
logger.logToAll(logger.INFO, "\tRestore JMS bridge "+bname+" with "+xids.size()+" TM log records");
String xid = null;
byte[] lr = null;
Iterator itr1 = xids.iterator();
while (itr1.hasNext()) {
xid = (String)itr1.next();
lr = jmsbridgeStore.getTMLogRecord(xid, bname, null);
if (lr == null) {
logger.logToAll(Logger.INFO,
"JMSBridge TM log record not found for "+xid);
continue;
}
jdbcStore.storeTMLogRecord(xid, lr, bname, true, null);
}
}
}
} finally {
bkrFS.close();
if (jmsbridgeStore != null) jmsbridgeStore.closeJMSBridgeStore();
}
}
logger.logToAll(Logger.INFO, "Restore persistent store complete.");