/* * Copyright (C) 2008 Universidade Federal de Campina Grande * * This file is part of OurGrid. * * OurGrid is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package org.ourgrid.peer.business.controller; import java.util.List; import org.ourgrid.common.internal.IResponseTO; import org.ourgrid.common.internal.response.LoggerResponseTO; import org.ourgrid.common.internal.response.ReleaseResponseTO; import org.ourgrid.common.statistics.control.WorkerControl; import org.ourgrid.common.util.StringUtil; import org.ourgrid.peer.business.controller.allocation.RedistributionController; import org.ourgrid.peer.business.controller.messages.WorkerMessages; import org.ourgrid.peer.business.dao.PeerDAOFactory; import org.ourgrid.peer.dao.AllocationDAO; import org.ourgrid.peer.response.DisposeRemoteWorkerResponseTO; import org.ourgrid.peer.to.RemoteAllocableWorker; import org.ourgrid.peer.to.Request; import org.ourgrid.reqtrace.Req; /** * Implement Peer actions when a remote worker fail. */ public class RemoteWorkerFailureController { private static RemoteWorkerFailureController instance = null; public static RemoteWorkerFailureController getInstance() { if (instance == null) { instance = new RemoteWorkerFailureController(); } return instance; } private RemoteWorkerFailureController() {} public void doNotifyRecovery(List<IResponseTO> responses, String remoteWorkerAddress, String remoteWorkerPublicKey, String myUserAtServer) { AllocationDAO allocationDAO = PeerDAOFactory.getInstance().getAllocationDAO(); RemoteAllocableWorker remoteAllocableWorker = allocationDAO.getNotRecoveredRemoteAllocableWorker(remoteWorkerAddress); //DeploymentID workerDeploymentID = serviceManager.getStubDeploymentID(worker); if (allocationDAO.getRemoteAllocableWorker(remoteWorkerPublicKey) != null) { responses.add(new LoggerResponseTO(WorkerMessages.getReceivingAlreadyAllocatedRemoteWorkerMessage( remoteWorkerAddress), LoggerResponseTO.WARN)); return; } WorkerControl.getInstance().addRemoteWorker(responses, remoteAllocableWorker.getWorkerSpecification(), remoteAllocableWorker.getProviderCertificateDN(), myUserAtServer); responses.add(new LoggerResponseTO(WorkerMessages.getReceivedRemoteWorkerMessage(remoteAllocableWorker.getProviderAddress(), remoteWorkerAddress), LoggerResponseTO.DEBUG)); PeerDAOFactory.getInstance().getAllocationDAO().recoverRemoteWorker(remoteWorkerAddress, remoteWorkerPublicKey); RedistributionController.getInstance().redistributeRemoteWorker(responses, remoteAllocableWorker); } /** * Notifies that a remote worker has failed * @param failedWorker The remote worker that has failed. * @param remoteWorkerID The DeploymentID of the remote worker that has failed. */ @Req("REQ114") public void doNotifyFailure(List<IResponseTO> responses, String remoteWorkerAddress, String remoteWorkerPublicKey) { RemoteAllocableWorker remoteAllocableWorker = PeerDAOFactory.getInstance().getAllocationDAO().getRemoteAllocableWorker( remoteWorkerPublicKey); if (remoteAllocableWorker == null) { responses.add(new LoggerResponseTO(WorkerMessages.getUnknownOrDisposedRemoteWorkerFailureMessage(remoteWorkerAddress), LoggerResponseTO.DEBUG)); return; } if (remoteAllocableWorker.isDelivered()) { responses.add(new LoggerResponseTO(WorkerMessages.getAlreadyDeliveredRemoteWorkerFailureMessage(remoteWorkerAddress), LoggerResponseTO.DEBUG)); } responses.add(new LoggerResponseTO(WorkerMessages.getRemoteWorkerFailureMessage(remoteWorkerAddress), LoggerResponseTO.DEBUG)); String providerAddress = remoteAllocableWorker.getProviderAddress(); String workerAddress = remoteAllocableWorker.getWorkerAddress(); String workerPubKey = remoteAllocableWorker.getWorkerPubKey(); //Remove and release worker WorkerControl.getInstance().removeRemoteWorker(responses, StringUtil.addressToUserAtServer(workerAddress)); PeerDAOFactory.getInstance().getAllocationDAO().removeRemoteAllocableWorker(workerPubKey); ReleaseResponseTO releaseTO = new ReleaseResponseTO(); releaseTO.setStubAddress(workerAddress); responses.add(releaseTO); //Dispose to its provider DisposeRemoteWorkerResponseTO to = new DisposeRemoteWorkerResponseTO(); to.setProviderAddress(providerAddress); to.setWorkerAddress(workerAddress); to.setWorkerPublicKey(workerPubKey); responses.add(to); Request request = remoteAllocableWorker.getRequest(); if (request != null) { request.removeAllocableWorker(remoteAllocableWorker); } } }