/* * Copyright (c) 2009-2011 by Bjoern Kolbeck, * Zuse Institute Berlin * * Licensed under the BSD License, see LICENSE file for details. * */ package org.xtreemfs.osd.operations; import org.xtreemfs.common.Capability; import org.xtreemfs.common.uuids.ServiceUUID; import org.xtreemfs.common.xloc.InvalidXLocationsException; import org.xtreemfs.common.xloc.XLocations; import org.xtreemfs.foundation.logging.Logging; import org.xtreemfs.foundation.pbrpc.generatedinterfaces.RPC.ErrorType; import org.xtreemfs.foundation.pbrpc.generatedinterfaces.RPC.POSIXErrno; import org.xtreemfs.foundation.pbrpc.generatedinterfaces.RPC.RPCHeader.ErrorResponse; import org.xtreemfs.foundation.pbrpc.utils.ErrorUtils; import org.xtreemfs.osd.OSDRequest; import org.xtreemfs.osd.OSDRequestDispatcher; import org.xtreemfs.osd.stages.StorageStage.InternalGetReplicaStateCallback; import org.xtreemfs.pbrpc.generatedinterfaces.OSD.ReplicaStatus; import org.xtreemfs.pbrpc.generatedinterfaces.OSD.xtreemfs_rwr_statusRequest; import org.xtreemfs.pbrpc.generatedinterfaces.OSDServiceConstants; public final class InternalRWRStatusOperation extends OSDOperation { final String sharedSecret; final ServiceUUID localUUID; public InternalRWRStatusOperation(OSDRequestDispatcher master) { super(master); sharedSecret = master.getConfig().getCapabilitySecret(); localUUID = master.getConfig().getUUID(); } @Override public int getProcedureId() { return OSDServiceConstants.PROC_ID_XTREEMFS_RWR_STATUS; } @Override public void startRequest(final OSDRequest rq) { final xtreemfs_rwr_statusRequest args = (xtreemfs_rwr_statusRequest)rq.getRequestArgs(); if (Logging.isDebug()) { Logging.logMessage(Logging.LEVEL_DEBUG, this,"RWR status request for file %s",args.getFileId()); } getState(rq,args); } public void getState(final OSDRequest rq, final xtreemfs_rwr_statusRequest args) { master.getStorageStage().internalGetReplicaState(args.getFileId(), rq.getLocationList().getLocalReplica().getStripingPolicy(), args.getMaxLocalObjVersion(), new InternalGetReplicaStateCallback() { @Override public void getReplicaStateComplete(ReplicaStatus localState, ErrorResponse error) { sendResult(rq, localState, error); } }); } public void sendResult(final OSDRequest rq, ReplicaStatus response, ErrorResponse error) { if (error != null) { rq.sendError(error); } else { //only locally rq.sendSuccess(response,null); } } @Override public ErrorResponse parseRPCMessage(OSDRequest rq) { try { xtreemfs_rwr_statusRequest rpcrq = (xtreemfs_rwr_statusRequest)rq.getRequestArgs(); rq.setFileId(rpcrq.getFileId()); rq.setCapability(new Capability(rpcrq.getFileCredentials().getXcap(), sharedSecret)); rq.setLocationList(new XLocations(rpcrq.getFileCredentials().getXlocs(), localUUID)); return null; } catch (InvalidXLocationsException ex) { return ErrorUtils.getErrorResponse(ErrorType.ERRNO, POSIXErrno.POSIX_ERROR_EINVAL, ex.toString()); } catch (Throwable ex) { return ErrorUtils.getInternalServerError(ex); } } @Override public boolean requiresCapability() { return true; } @Override public void startInternalEvent(Object[] args) { throw new UnsupportedOperationException("Not supported yet."); } }