protected void restoreTable(RestoreTable rtm) { String tableName = rtm.getTableName(); int version = rtm.getTableVersion(); int myversion = DatabaseStateImpl.getInstance().getTableVersion(tableName); Logger.getInstance().log( "Restore table '" + tableName + "' to version " + version + " - my is " + myversion, LOGGING_NAME, Logger.Level.INFO); if( myversion < version) { try { DbConnectorImpl.getInstance().importTable(tableName, version, rtm.getTableDump()); } catch (ImportTableException e) { Logger.getInstance().log("ImportTableException" + e.Message, LOGGING_NAME, Logger.Level.WARNING); } } else { Logger.getInstance().log( "Table skipped - my version is newer or equal", LOGGING_NAME, Logger.Level.INFO); } }
// throws TimeoutException, InterruptedException public void Restore() { Message msg; Message.MessageType[] incentiveReply = { Message.MessageType.RESTORE_ACK, Message.MessageType.RESTORE_NACK }; Logger.getInstance().log( "Starting restoration - sending incentive : " + targetNode.ToString(), LOGGING_NAME, Logger.Level.INFO); // send restore incentive TcpSender.getInstance().sendToNode(new RestoreIncentive(), targetNode); // receive reply setTimeout(RESTORE_TIMEOUT); msg = accept(incentiveReply, targetNode); if(msg is RestoreNack) { Logger.getInstance().log( "Restore rejected by node : " + targetNode.ToString(), LOGGING_NAME, Logger.Level.INFO); return; } Logger.getInstance().log( "Restore accepted by node, sending tables' versions : " + targetNode.ToString(), LOGGING_NAME, Logger.Level.INFO); // TODO: tutaj nie moze byc zadnych transakcji // TODO: lock whole database ( all tables ) RestoreTableList rtl = new RestoreTableList(DatabaseStateImpl.getInstance().getTableVersions()); TcpSender.getInstance().sendToNode(rtl, targetNode); Logger.getInstance().log( "Awaiting ack : " + targetNode.ToString(), LOGGING_NAME, Logger.Level.INFO); // receive reply setTimeout(RESTORE_TIMEOUT); msg = accept(Message.MessageType.RESTORE_ACK, targetNode); Logger.getInstance().log( "Got ack, trasfering tables : " + targetNode.ToString(), LOGGING_NAME, Logger.Level.INFO); // send all tables foreach(TableVersion tv in rtl.getTables()) { Logger.getInstance().log( "Transfering table '" + tv.Name + "' version " + tv.Version + " : " + targetNode.ToString(), LOGGING_NAME, Logger.Level.INFO); String dump; try { dump = DbConnectorImpl.getInstance().dumpTable(tv.Name); RestoreTable rt = new RestoreTable(tv.Version, tv.Name, dump); TcpSender.getInstance().sendToNode(rt, targetNode); } catch (DumpTableException e) { Logger.getInstance().log( "DumpTableException " + e.Message, LOGGING_NAME, Logger.Level.WARNING); RestoreTable rt = new RestoreTable(tv.Version, tv.Name, ""); TcpSender.getInstance().sendToNode(rt, targetNode); } } // finished }