@Override public void handleRequest( final DataInput input, final ActiveOperation.ResultHandler<Void> resultHandler, final ManagementRequestContext<Void> context) throws IOException { byte param = input.readByte(); // If it failed if (param != DomainControllerProtocol.PARAM_OK) { final byte errorCode = input.readByte(); final String message = input.readUTF(); resultHandler.failed( new SlaveRegistrationException( SlaveRegistrationException.ErrorCode.parseCode(errorCode), message)); return; } final ModelNode extensions = new ModelNode(); extensions.readExternal(input); context.executeAsync( new ManagementRequestContext.AsyncTask<Void>() { @Override public void execute(ManagementRequestContext<Void> voidManagementRequestContext) throws Exception { // final ModelNode subsystems = resolveSubsystemVersions(extensions); channelHandler.executeRequest( context.getOperationId(), new RegisterSubsystemsRequest(subsystems)); } }); }
@Override public void handleRequest( final DataInput input, final ResultHandler<Void> resultHandler, final ManagementRequestContext<ServerInventory> context) throws IOException { expectHeader(input, DomainServerProtocol.PARAM_SERVER_NAME); final String serverName = input.readUTF(); if (this.serverProcessName.equals(serverName)) { context.getAttachment().serverStarted(serverName); } else { throw new IOException("illegal server name " + serverName); } }
@Override public void handleRequest( final DataInput input, final ActiveOperation.ResultHandler<Void> resultHandler, final ManagementRequestContext<Void> context) throws IOException { byte param = input.readByte(); // If it failed if (param != DomainControllerProtocol.PARAM_OK) { final byte errorCode = input.readByte(); final String message = input.readUTF(); resultHandler.failed( new SlaveRegistrationException( SlaveRegistrationException.ErrorCode.parseCode(errorCode), message)); return; } final ModelNode domainModel = new ModelNode(); domainModel.readExternal(input); context.executeAsync( new ManagementRequestContext.AsyncTask<Void>() { @Override public void execute(ManagementRequestContext<Void> voidManagementRequestContext) throws Exception { // Apply the domain model final boolean success = applyDomainModel(domainModel); if (success) { channelHandler.executeRequest( context.getOperationId(), new CompleteRegistrationRequest(DomainControllerProtocol.PARAM_OK)); } else { channelHandler.executeRequest( context.getOperationId(), new CompleteRegistrationRequest(DomainControllerProtocol.PARAM_ERROR)); resultHandler.failed( new SlaveRegistrationException( SlaveRegistrationException.ErrorCode.UNKNOWN, "")); } } }); }
@Override protected ModelNode internalExecute( final ModelNode operation, final ManagementRequestContext<?> context, final OperationMessageHandler messageHandler, final ProxyOperationControl control, OperationAttachments attachments) { final OperationStepHandler handler; final String operationName = operation.require(OP).asString(); if (operationName.equals(PullDownDataForServerConfigOnSlaveHandler.OPERATION_NAME)) { handler = new PullDownDataForServerConfigOnSlaveHandler( SlaveChannelAttachments.getHostName(context.getChannel()), SlaveChannelAttachments.getTransformers(context.getChannel()), runtimeIgnoreTransformationRegistry); } else { throw HostControllerLogger.ROOT_LOGGER.cannotExecuteTransactionalOperationFromSlave( operationName); } Integer domainControllerLockId; if (operation .get(OPERATION_HEADERS) .hasDefined(DomainControllerLockIdUtils.DOMAIN_CONTROLLER_LOCK_ID)) { domainControllerLockId = operation .get(OPERATION_HEADERS, DomainControllerLockIdUtils.DOMAIN_CONTROLLER_LOCK_ID) .asInt(); } else { domainControllerLockId = null; } final Integer slaveLockId = operation .get(OPERATION_HEADERS, DomainControllerLockIdUtils.SLAVE_CONTROLLER_LOCK_ID) .asInt(); if (domainControllerLockId == null) { synchronized (this) { SlaveRequest slaveRequest = this.activeSlaveRequest; if (slaveRequest != null) { domainControllerLockId = slaveRequest.domainId; slaveRequest.refCount.incrementAndGet(); } } // TODO https://issues.jboss.org/browse/AS7-6809 If there are many slaves calling back many // of these threads will be blocked, and I // believe they are a finite resource } try { if (domainControllerLockId != null) { return executor.joinActiveOperation( operation, messageHandler, control, attachments, handler, domainControllerLockId); } else { ModelNode result = executor.executeAndAttemptLock( operation, messageHandler, control, attachments, new OperationStepHandler() { @Override public void execute(OperationContext context, ModelNode operation) throws OperationFailedException { // Grab the lock id and store it Integer domainControllerLockId = CurrentOperationIdHolder.getCurrentOperationID(); synchronized (this) { activeSlaveRequest = new SlaveRequest(domainControllerLockId); } context.addStep(operation, handler, OperationContext.Stage.MODEL); context.stepCompleted(); } }); return result; } } finally { synchronized (this) { SlaveRequest slaveRequest = this.activeSlaveRequest; if (slaveRequest != null) { int refcount = slaveRequest.refCount.decrementAndGet(); if (refcount == 0) { activeSlaveRequest = null; } } } } }