Skip to content

Commit

Permalink
Merge pull request #9274 from mmusgrov/WFLY-6942
Browse files Browse the repository at this point in the history
WFLY-6942 Add a CLI op to remove txn participants
  • Loading branch information
kabir committed Oct 25, 2016
2 parents f4a05d2 + de81356 commit 35ff7b3
Show file tree
Hide file tree
Showing 7 changed files with 127 additions and 32 deletions.
@@ -0,0 +1,50 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2012, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This 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 2.1 of
* the License, or (at your option) any later version.
*
* This software 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 software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.jboss.as.txn.subsystem;

import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.OperationStepHandler;
import org.jboss.as.controller.operations.common.Util;
import org.jboss.dmr.ModelNode;

public class LogStoreParticipantDeleteHandler extends LogStoreParticipantOperationHandler {
private LogStoreProbeHandler probeHandler = null;

public LogStoreParticipantDeleteHandler(LogStoreProbeHandler probeHandler) {
super("remove");

this.probeHandler = probeHandler;
}

void refreshParticipant(OperationContext context) {
final ModelNode operation = Util.createEmptyOperation("refresh-log-store", context.getCurrentAddress().getParent().getParent());

context.addStep(operation, new OperationStepHandler() {
@Override
public void execute(OperationContext context, ModelNode operation) throws OperationFailedException {
probeHandler.execute(context, operation);
}
}, OperationContext.Stage.MODEL);
}
}
@@ -0,0 +1,66 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2012, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This 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 2.1 of
* the License, or (at your option) any later version.
*
* This software 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 software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.jboss.as.txn.subsystem;

import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.OperationStepHandler;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.registry.Resource;
import org.jboss.dmr.ModelNode;

import javax.management.MBeanServer;
import javax.management.ObjectName;

abstract class LogStoreParticipantOperationHandler implements OperationStepHandler {

private String operationName;

public LogStoreParticipantOperationHandler(String operationName) {
this.operationName = operationName;
}

public void execute(OperationContext context, ModelNode operation) throws OperationFailedException {

MBeanServer mbs = TransactionExtension.getMBeanServer(context);
final Resource resource = context.readResource(PathAddress.EMPTY_ADDRESS);

try {
// Get the internal object name
final ObjectName on = LogStoreResource.getObjectName(resource);

// Invoke the MBean operation
mbs.invoke(on, operationName, null, null);

} catch (Exception e) {
throw new OperationFailedException("JMX error: " + e.getMessage());
}

// refresh the attributes of this participant (the status attribute should have changed to PREPARED
refreshParticipant(context);

context.completeStep(OperationContext.RollbackHandler.NOOP_ROLLBACK_HANDLER);
}

abstract void refreshParticipant(OperationContext context);
}
Expand Up @@ -23,42 +23,18 @@
package org.jboss.as.txn.subsystem;

import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.OperationStepHandler;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.registry.Resource;
import org.jboss.dmr.ModelNode;

import javax.management.MBeanServer;
import javax.management.ObjectName;

public class LogStoreParticipantRecoveryHandler implements OperationStepHandler {

private LogStoreParticipantRefreshHandler refreshHandler = null;
public class LogStoreParticipantRecoveryHandler extends LogStoreParticipantOperationHandler {
private LogStoreParticipantRefreshHandler refreshHandler = null;

public LogStoreParticipantRecoveryHandler(LogStoreParticipantRefreshHandler refreshHandler) {
super("clearHeuristic");

this.refreshHandler = refreshHandler;
}

public void execute(OperationContext context, ModelNode operation) throws OperationFailedException {

MBeanServer mbs = TransactionExtension.getMBeanServer(context);
final Resource resource = context.readResource(PathAddress.EMPTY_ADDRESS);

try {
// Get the internal object name
final ObjectName on = LogStoreResource.getObjectName(resource);

// Invoke the MBean operation
mbs.invoke(on, "clearHeuristic", null, null);

} catch (Exception e) {
throw new OperationFailedException("JMX error: ", e);
}

// refresh the attributes of this participant (the status attribute should have changed to PREPARED
// refresh the attributes of this participant (the status attribute should have changed to PREPARED
void refreshParticipant(OperationContext context) {
context.addStep(refreshHandler, OperationContext.Stage.MODEL, true);

context.completeStep(OperationContext.RollbackHandler.NOOP_ROLLBACK_HANDLER);
}
}
Expand Up @@ -61,7 +61,7 @@ public void execute(OperationContext context, ModelNode operation) throws Operat
// Replace the model
resource.writeModel(model);
} catch (Exception e) {
throw new OperationFailedException("JMX error: ", e);
throw new OperationFailedException("JMX error: " + e.getMessage());
}

context.completeStep(OperationContext.RollbackHandler.NOOP_ROLLBACK_HANDLER);
Expand Down
Expand Up @@ -50,9 +50,11 @@ public void registerOperations(ManagementResourceRegistration resourceRegistrati
super.registerOperations(resourceRegistration);

final LogStoreParticipantRefreshHandler refreshHandler = LogStoreParticipantRefreshHandler.INSTANCE;
final LogStoreProbeHandler probeHandler = LogStoreProbeHandler.INSTANCE;

resourceRegistration.registerOperationHandler(new SimpleOperationDefinition(LogStoreConstants.REFRESH, getResourceDescriptionResolver()), refreshHandler);
resourceRegistration.registerOperationHandler(new SimpleOperationDefinition(LogStoreConstants.RECOVER, getResourceDescriptionResolver()), new LogStoreParticipantRecoveryHandler(refreshHandler));
resourceRegistration.registerOperationHandler(new SimpleOperationDefinition(LogStoreConstants.DELETE, getResourceDescriptionResolver()), new LogStoreParticipantDeleteHandler(probeHandler));
}

@Override
Expand Down
Expand Up @@ -64,7 +64,7 @@ public class TransactionExtension implements Extension {
static final ModelVersion MODEL_VERSION_EAP62 = ModelVersion.create(1, 3);
static final ModelVersion MODEL_VERSION_EAP63 = ModelVersion.create(1, 4);
static final ModelVersion MODEL_VERSION_EAP64 = ModelVersion.create(1, 5);
private static final ModelVersion CURRENT_MODEL_VERSION = ModelVersion.create(3, 1, 0);
private static final ModelVersion CURRENT_MODEL_VERSION = ModelVersion.create(3, 2, 0);


private static final ServiceName MBEAN_SERVER_SERVICE_NAME = ServiceName.JBOSS.append("mbean", "server");
Expand Down
Expand Up @@ -53,6 +53,7 @@ transactions.average-commit-time=The average time of transaction commit in nanos
transactions.log-store.transaction.delete=Remove this transaction log. WARNING after this operation the transaction manager will have no knowledge of the transaction and will therefore never be able to recover it. If you are sure that the transaction is complete then the operation is safe. The representation of the transaction log is removed from the model too.
transactions.log-store.transaction.participant.refresh=Refresh the management view of the attributes of this participant record by querying the transaction log. (Note that the read-resource operaton only reads the model, hence the need for this refresh operation).
transactions.log-store.transaction.participant.recover=If this record is in a heuristic state then attempt to replay the commit phase of the 2PC transaction.
transactions.log-store.transaction.participant.delete=Attempt to remove this participant from its containing transaction log. If the participant is an XA resource and if it is in a heuristic state then attempt will be made to call forget on the actual resource and if the forget call fails then the remove operation will also fail.

transactions.log-store=Representation of the transaction logging storage mechanism.
transactions.log-store.add=Add a representation of the transaction logging storage mechanism.
Expand Down

0 comments on commit 35ff7b3

Please sign in to comment.