@Override public void onDeliverRequest(PublishRequest req) { try { // // TODO remove 4 lines below - just for debug // byte[] details = req.getMessage(); // if (req.getEventType() == 1413) { // System.out.println("zzz"); // } JCsyncAbstractOperation op = JCsyncAbstractOperation.encode(req.getMessage()); op.setReqestID(req.getTransactionID()); log.trace( this.pubsubLayer.getNodeInfo().getName() + " (onDeliverRequest) - [publisher]:" + req.getPublisher() + ", [node relay]:" + req.getSourceInfo() + ": " + op); if (this.checkIfAlreadyReceived(req)) { log.trace( this.pubsubLayer.getNodeInfo().getName() + " (onDeliverRequest): - received request that was aready received, skipping ... : " + op); return; } // check that this node can hold this request JCSyncAbstractSharedObject so = this.sharedObjects.get(op.getObjectID()); if (so != null) { if ((op.getOperationType() & OP_REQ_GENERIC) == OP_REQ_GENERIC) { if (op.getOperationType() == OP_REQ_TRANSFER_OBJECT) { // there is no need to inform consistency manager about this kind of request, just send // response and indication sendResponse(req, PubSubConstants.RESP_SUCCESS); synchronized (so.operationIdIncrementLocker) { log.trace( getNodeInfo().getName() + ": transferring shared object with current operation id: " + so.getCurrentOperationID() + ", to node: " + req.getPublisher()); JCsyncAbstractOperation op_ = JCsyncAbstractOperation.get_OP_IND_TRANSFER_OBJECT( op.getObjectID(), so.encode(), req.getPublisher()); op_.setReqestID(op.getReqestID()); sendMessage(req, op_, false); } } else { // if this node is a root if (getAssignedTopic(req.getTopicID()) .isTopicRoot(this.pubsubLayer.getNodeInfo().getID())) { AbstractConsistencyManager acm = getConsistencyManager(req.getTopicID()); if (acm != null) { log.trace( "(onDeliverRequest) - passing operation to consistency model: " + op.toString()); acm.requestReceived(req, op); } else { log.fatal( "(onDeliverRequest) - there is no registered consistency manager for this operation: " + op.toString()); } } else { log.trace( "(onDeliverRequest) - forwarding operation request to the parent node: " + op.toString()); this.pubsubLayer.forwardToParent(req, getAssignedTopic(req.getTopicID())); } } } else { log.fatal("(onDeliverRequest) - unhandled operation type: " + op.toString()); } } else { if (op.getOperationType() == OP_REQ_TRANSFER_OBJECT) { log.trace( getNodeInfo().getName() + ": (onDeliverRequest) - shared object not found!: " + op.toString() + ", forwarding request to the topic owner: " + op.toString()); this.pubsubLayer.forwardToOtherNode( req, this.pubsubLayer.getTopic(op.getObjectID()).getOwner().getNodeInfo()); } else { log.fatal( getNodeInfo().getName() + ": (onDeliverRequest) - shared object not found!: " + op.toString()); sendResponse(req, PubSubConstants.RESP_DOESNOTEXIST); } } } catch (Exception e) { log.error("An error occurred:", e); } }
/** * Sends operation as a pub-sub message thought overlay. If the <tt>blocking</tt> value is * <tt>true</tt> then working thread will be suspended until the response and indication (if * required) will be received from the overlay, if <tt>blocking</tt> value is <tt>false</tt> then * working thread will not be suspended and method returns <tt>null</tt>.<br> * Typically used to sends requests. * * @param op operation that will be send * @param blocking determines whenever the calling thread will be suspended until the results of * given operation will be received. * @return the results of given operation or <tt>null</tt> if the blocking argument value is set * to <tt>false</tt> * @throws Exception any error which was occurred during this operation */ @Override public Object sendMessage(JCsyncAbstractOperation op, boolean blocking) throws Exception { // if the topic for this object is unknown then throw new exception try { this.request_response_locker.writeLock().lock(); if (getAssignedTopic(op.getObjectID()) == null) { throw ObjectNotExistsException.instance(); } // try to get the consistency manager if there is already selected AbstractConsistencyManager acm = getConsistencyManager(op.getObjectID()); if (acm == null) { acm = this.dcManager; } short type = op.getOperationType(); if ((type & OP_REQ_GENERIC) == OP_REQ_GENERIC) { acm.beforeRequestSend(op, blocking); this.pubsubLayer.getCustomAlgorith().registerSharedObjectName(op.getObjectID()); Transaction t = this.pubsubLayer .getCustomAlgorith() .nextPublishTransaction(op.getObjectID(), op.getOperationType()); op.setReqestID(t.getID()); log.trace( "(sendMessage) - operation sent (blocking=[" + blocking + "]) operation: " + op.toString()); this.messagesToSend.put(new MessageToSend(op, t)); this.request_response_locker.writeLock().unlock(); Object result = acm.afterRequestSend(op, blocking); return result; } else if ((type & OP_INDICATION_GENERIC) == OP_INDICATION_GENERIC) { acm.beforeRequestSend(op, blocking); this.pubsubLayer.getCustomAlgorith().registerSharedObjectName(op.getObjectID()); Transaction t = this.pubsubLayer .getCustomAlgorith() .nextPublishTransaction(op.getObjectID(), op.getOperationType()); op.setReqestID(t.getID()); log.trace( "(sendMessage) - operation sent (blocking=[" + blocking + "]) operation: " + op.toString()); this.messagesToSend.put(new MessageToSend(op, t)); this.request_response_locker.writeLock().unlock(); Object result = acm.afterRequestSend(op, blocking); return result; } else { log.error("Unhandled operation type: " + op.toString()); } } catch (Exception e) { throw e; } finally { if (this.request_response_locker.writeLock().getHoldCount() > 0 && this.request_response_locker.writeLock().isHeldByCurrentThread()) { this.request_response_locker.writeLock().unlock(); } } return null; }