use of com.sun.messaging.jmq.jmsserver.persist.api.ChangeRecordInfo in project openmq by eclipse-ee4j.
the class JDBCShareConfigChangeStore method migrateOldTableData.
private void migrateOldTableData(Connection conn, String oldTable) throws BrokerException {
ShareConfigRecordDAO dao = dbmgr.getDAOFactory().getShareConfigRecordDAO();
long totalwait = 30000L;
ChangeRecordInfo resetcri = ChangeRecord.makeResetRecord(true);
while (true) {
try {
dbmgr.lockTables(conn, true, resetcri);
break;
} catch (BrokerException e) {
String ecode = e.getErrorCode();
if (ecode != null && ecode.equals(br.E_SHARECC_TABLE_LOCKED_BY)) {
if (!dbmgr.getIsClosing() && totalwait > 0L) {
try {
Thread.sleep(5000L);
} catch (Exception ee) {
}
totalwait -= 5000L;
continue;
}
throw e;
}
if (ecode != null && ecode.equals(br.E_SHARECC_TABLE_NOT_EMPTY)) {
// someone else migrated
return;
}
throw e;
}
}
Object[] logargs = { "", oldTable, dao.getTableName() };
logger.log(logger.INFO, br.getKString(br.I_SHARECC_MIGRATING_DB, logargs));
ArrayList<ChangeRecordInfo> newcris = new ArrayList<>();
try {
String sql = "SELECT * FROM " + oldTable;
List<ChangeRecordInfo> cris = dao.getAllRecords(conn, sql);
List<ChangeRecord> records = ChangeRecord.compressRecords(cris);
ChangeRecordInfo newcri = null;
ChangeRecord rec = null;
Iterator<ChangeRecord> itr = records.iterator();
while (itr.hasNext()) {
rec = itr.next();
if (rec.isDiscard()) {
continue;
}
newcri = new ChangeRecordInfo((Long) null, rec.getUUID(), rec.getBytes(), rec.getOperation(), rec.getUniqueKey(), System.currentTimeMillis());
newcri.setDuraAdd(rec.isDuraAdd());
newcri.setResetUUID(resetcri.getUUID());
newcris.add(newcri);
}
Object[] args = { newcris.size() + "(" + cris.size() + ")", oldTable, dao.getTableName() };
logger.log(logger.INFO, br.getKString(br.I_SHARECC_MIGRATING_DB, args));
} catch (Exception e) {
String emsg = br.getKString(br.X_SHARECC_PROCESS_DATA_FOR_MIGRATION, oldTable);
logger.logStack(logger.ERROR, emsg, e);
throw new BrokerException(emsg, e);
}
dao.insertAll(newcris, oldTable);
logger.log(logger.INFO, br.getKString(br.I_SHARECC_MIGRATED_DB, oldTable, dao.getTableName()));
try {
String[] olds = new String[1];
olds[0] = oldTable;
DBTool.dropTables(conn, olds, true, true, dbmgr);
logger.log(logger.INFO, br.getKString(br.I_DB_TABLE_DELETED, oldTable));
} catch (Exception e) {
logger.log(logger.WARNING, e.getMessage(), e);
} finally {
try {
dbmgr.lockTables(conn, false);
} catch (Exception e) {
String emsg = br.getKString(br.X_SHARECC_UNLOCK_TABLE_AFTER_MIGRATION, e.getMessage());
logger.logStack(logger.ERROR, emsg, e);
throw new BrokerException(emsg, e);
}
}
}
use of com.sun.messaging.jmq.jmsserver.persist.api.ChangeRecordInfo in project openmq by eclipse-ee4j.
the class ShareConfigRecordDAOImpl method getAllRecords.
@Override
public ArrayList<ChangeRecordInfo> getAllRecords(Connection conn, String query) throws BrokerException {
String sql = (query == null ? selectAllSQL : query);
ArrayList<ChangeRecordInfo> records = new ArrayList<>();
boolean myConn = false;
PreparedStatement pstmt = null;
ResultSet rs = null;
Exception myex = null;
try {
// Get a connection
CommDBManager mgr = getDBManager();
if (conn == null) {
conn = mgr.getConnection(true);
myConn = true;
}
pstmt = mgr.createPreparedStatement(conn, sql);
rs = pstmt.executeQuery();
long seqv = -1;
String uuidv = null;
byte[] buf = null;
int typv = 0;
long tsv = -1;
ChangeRecordInfo cri = null;
boolean foundreset = false;
while (rs.next()) {
try {
seqv = rs.getLong(1);
uuidv = rs.getString(2);
buf = Util.readBytes(rs, 3);
typv = rs.getInt(4);
if (typv == ChangeRecordInfo.TYPE_RESET_PERSISTENCE) {
foundreset = true;
}
tsv = rs.getLong(5);
cri = new ChangeRecordInfo(Long.valueOf(seqv), uuidv, buf, typv, null, tsv);
cri.setIsSelectAll(true);
records.add(cri);
} catch (IOException e) {
IOException ex = getDBManager().wrapIOException("[" + selectAllSQL + "]", e);
logger.logStack(Logger.ERROR, BrokerResources.X_PARSE_CONFIGRECORD_FAILED, String.valueOf(seqv), ex);
throw new BrokerException(ex.getMessage(), Status.PRECONDITION_FAILED);
}
}
if (!foundreset) {
throw new BrokerException("Unexpected: shared cluster change record table [" + (query == null ? getTableName() : sql) + "] has no reset record", Status.PRECONDITION_FAILED);
}
} catch (Exception e) {
myex = e;
try {
if ((conn != null) && !conn.getAutoCommit()) {
conn.rollback();
}
} catch (SQLException rbe) {
logger.log(Logger.ERROR, BrokerResources.X_DB_ROLLBACK_FAILED + "[" + sql + "]", rbe);
}
Exception ex;
if (e instanceof BrokerException) {
throw (BrokerException) e;
} else if (e instanceof SQLException) {
ex = getDBManager().wrapSQLException("[" + sql + "]", (SQLException) e);
} else {
ex = e;
}
throw new BrokerException(br.getKString(br.X_SHARECC_QUERY_ALL_RECORDS_FAIL + "[" + (query == null ? getTableName() : sql) + "]", ex.getMessage()), ex);
} finally {
if (myConn) {
closeSQLObjects(rs, pstmt, conn, myex);
} else {
closeSQLObjects(rs, pstmt, null, myex);
}
}
return records;
}
use of com.sun.messaging.jmq.jmsserver.persist.api.ChangeRecordInfo in project openmq by eclipse-ee4j.
the class DBTool method doRestoreSharecc.
/**
* Restore the shared table for cluster config change record from a file
*/
private void doRestoreSharecc() throws BrokerException {
Properties props = System.getProperties();
String clusterID = Globals.getClusterID();
String backupfile = (String) props.get(ShareConfigChangeStore.CLUSTER_SHARECC_PROP_PREFIX + ".backupfile");
logger.logToAll(Logger.INFO, br.getKString(br.I_SHARECC_RESTORE, clusterID, backupfile));
ShareConfigChangeDBManager mgr = ShareConfigChangeDBManager.getDBManager();
Connection conn = null;
Exception myex = null;
try {
List<ChangeRecordInfo> records = ChangeRecord.prepareRestoreRecords(backupfile);
ShareConfigRecordDAO dao = mgr.getDAOFactory().getShareConfigRecordDAO();
Globals.getLogger().logToAll(Logger.INFO, br.getKString(br.I_SHARECC_RESTORE_RECORDS, String.valueOf(records.size()), backupfile));
conn = mgr.getConnection(true);
ChangeRecordInfo resetcri = ChangeRecord.makeResetRecord(true);
try {
mgr.lockTables(conn, true, resetcri);
Connection myconn = null;
Exception myee = null;
try {
myconn = mgr.getConnection(false);
Util.RetryStrategy retry = null;
do {
try {
Iterator itr = records.iterator();
ChangeRecordInfo cri = null;
while (itr.hasNext()) {
cri = (ChangeRecordInfo) itr.next();
if (cri.getType() == ChangeRecordInfo.TYPE_RESET_PERSISTENCE) {
itr.remove();
continue;
}
cri.setResetUUID(resetcri.getUUID());
cri.setTimestamp(System.currentTimeMillis());
dao.insert(myconn, cri);
}
myconn.commit();
break;
} catch (Exception e) {
if (retry == null) {
retry = new Util.RetryStrategy(mgr);
}
retry.assertShouldRetry(e);
}
} while (true);
} catch (BrokerException e) {
myee = e;
throw e;
} finally {
Util.close(null, null, myconn, myee, mgr);
}
} finally {
try {
mgr.lockTables(conn, false);
} catch (Exception e) {
logger.log(Logger.WARNING, br.getKString(br.X_SHARECC_UNLOCK_TABLE, e.toString()), e);
}
}
logger.logToAll(Logger.INFO, br.getKString(br.I_SHARECC_RESTORE_RECORDS_SUCCESS, Globals.getClusterID(), backupfile));
} catch (Exception e) {
myex = e;
String emsg = br.getKString(br.E_SHARECC_RESTORE_RECORDS_FAIL, e.getMessage());
Globals.getLogger().logToAll(Logger.ERROR, emsg, e);
if (e instanceof BrokerException) {
throw (BrokerException) e;
}
throw new BrokerException(emsg, e);
} finally {
Util.close(null, null, conn, myex, mgr);
}
}
use of com.sun.messaging.jmq.jmsserver.persist.api.ChangeRecordInfo in project openmq by eclipse-ee4j.
the class DBTool method doRestore.
/*
* Restore the JDBC store from filebased backup files.
*/
private void doRestore() throws BrokerException {
if (!Globals.getHAEnabled()) {
throw new BrokerException(br.getKString(BrokerResources.I_HA_NOT_ENABLE, dbmgr.getBrokerID()));
}
// instantiate the file store.
Properties props = System.getProperties();
String clusterID = Globals.getClusterID();
String backupDir = (String) props.get(Globals.IMQ + ".backupdir") + File.separator + clusterID;
logger.logToAll(Logger.INFO, "Restore persistent store for HA cluster " + clusterID + " from backup dir: " + backupDir);
final 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(JMSBridgeStore.class, "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(JMSBridgeStore.class, "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.");
} catch (Throwable ex) {
ex.printStackTrace();
throw new BrokerException(ex.getMessage());
} finally {
assert fileStore != null;
try {
fileStore.close();
} catch (Exception e) {
e.printStackTrace();
}
StoreManager.releaseStore(true);
}
}
use of com.sun.messaging.jmq.jmsserver.persist.api.ChangeRecordInfo in project openmq by eclipse-ee4j.
the class ConfigRecordDAOImpl method getAllRecords.
/**
* Return all records together with their corresponding timestamps.
*
* @param conn database connection
* @return a list of ChangeRecordInfo
*/
@Override
public List<ChangeRecordInfo> getAllRecords(Connection conn) throws BrokerException {
ArrayList records = new ArrayList();
boolean myConn = false;
PreparedStatement pstmt = null;
ResultSet rs = null;
Exception myex = null;
try {
// Get a connection
DBManager dbMgr = DBManager.getDBManager();
if (conn == null) {
conn = dbMgr.getConnection(true);
myConn = true;
}
pstmt = dbMgr.createPreparedStatement(conn, selectAllSQL);
rs = pstmt.executeQuery();
while (rs.next()) {
long createdTS = -1;
try {
createdTS = rs.getLong(2);
byte[] buf = Util.readBytes(rs, 1);
records.add(new ChangeRecordInfo(buf, createdTS));
} catch (IOException e) {
// fail to load one record; just log the record TS
IOException ex = DBManager.wrapIOException("[" + selectAllSQL + "]", e);
logger.logStack(Logger.ERROR, BrokerResources.X_PARSE_CONFIGRECORD_FAILED, String.valueOf(createdTS), ex);
}
}
} catch (Exception e) {
myex = e;
try {
if ((conn != null) && !conn.getAutoCommit()) {
conn.rollback();
}
} catch (SQLException rbe) {
logger.log(Logger.ERROR, BrokerResources.X_DB_ROLLBACK_FAILED, rbe);
}
Exception ex;
if (e instanceof BrokerException) {
throw (BrokerException) e;
} else if (e instanceof SQLException) {
ex = DBManager.wrapSQLException("[" + selectAllSQL + "]", (SQLException) e);
} else {
ex = e;
}
throw new BrokerException(br.getKString(BrokerResources.X_LOAD_CONFIGRECORDS_FAILED), ex);
} finally {
if (myConn) {
Util.close(rs, pstmt, conn, myex);
} else {
Util.close(rs, pstmt, null, myex);
}
}
return records;
}
Aggregations