예제 #1
0
        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);
            }
        }
예제 #2
0
        //  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
        }