You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2018/02/12 21:01:29 UTC
[2/2] activemq-artemis git commit: ARTEMIS-1675 Adding --safe option
on print-data
ARTEMIS-1675 Adding --safe option on print-data
This is good when you are a customer and an artemis engineer (e.g. me) asks your journal print-data but you can't do it because that would expose your user's data. If you do artemis data print --safe, that will only expose the journal structure without exposing user's data and eliminate any liability between the engineer and users.
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/996871e3
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/996871e3
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/996871e3
Branch: refs/heads/master
Commit: 996871e37cb520799ef659c01f1c6ab707dbe98d
Parents: 116b06a
Author: Clebert Suconic <cl...@apache.org>
Authored: Fri Feb 9 11:09:57 2018 -0500
Committer: Clebert Suconic <cl...@apache.org>
Committed: Mon Feb 12 16:01:09 2018 -0500
----------------------------------------------------------------------
.../artemis/cli/commands/tools/PrintData.java | 45 +++++++----
.../artemis/core/message/impl/CoreMessage.java | 2 +-
.../protocol/amqp/broker/AMQPMessage.java | 1 +
.../impl/journal/DescribeJournal.java | 82 ++++++++++++++------
.../impl/journal/LargeServerMessageImpl.java | 9 ++-
5 files changed, 96 insertions(+), 43 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/996871e3/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/PrintData.java
----------------------------------------------------------------------
diff --git a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/PrintData.java b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/PrintData.java
index 9771c5e..9345973 100644
--- a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/PrintData.java
+++ b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/PrintData.java
@@ -28,6 +28,7 @@ import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import io.airlift.airline.Command;
+import io.airlift.airline.Option;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
import org.apache.activemq.artemis.api.core.SimpleString;
@@ -64,6 +65,10 @@ import org.apache.activemq.artemis.utils.actors.ArtemisExecutor;
@Command(name = "print", description = "Print data records information (WARNING: don't use while a production server is running)")
public class PrintData extends DBOption {
+
+ @Option(name = "--safe", description = "It will print your data structure without showing your data")
+ private boolean safe = false;
+
private static final String BINDINGS_BANNER = "B I N D I N G S J O U R N A L";
private static final String MESSAGES_BANNER = "M E S S A G E S J O U R N A L";
static {
@@ -80,7 +85,7 @@ public class PrintData extends DBOption {
if (configuration.isJDBC()) {
printDataJDBC(configuration, context.out);
} else {
- printData(new File(getBinding()), new File(getJournal()), new File(getPaging()), context.out);
+ printData(new File(getBinding()), new File(getJournal()), new File(getPaging()), context.out, safe);
}
} catch (Exception e) {
treatError(e, "data", "print");
@@ -96,23 +101,26 @@ public class PrintData extends DBOption {
printBanner(out, BINDINGS_BANNER);
- DescribeJournal.printSurvivingRecords(storageManager.getBindingsJournal(), out);
+ DescribeJournal.printSurvivingRecords(storageManager.getBindingsJournal(), out, safe);
printBanner(out, MESSAGES_BANNER);
- DescribeJournal describeJournal = DescribeJournal.printSurvivingRecords(storageManager.getMessageJournal(), out);
+ DescribeJournal describeJournal = DescribeJournal.printSurvivingRecords(storageManager.getMessageJournal(), out, safe);
- printPages(describeJournal, storageManager, pagingmanager, out);
+ printPages(describeJournal, storageManager, pagingmanager, out, safe);
cleanup();
}
-
public static void printData(File bindingsDirectory, File messagesDirectory, File pagingDirectory) throws Exception {
- printData(bindingsDirectory, messagesDirectory, pagingDirectory, System.out);
+ printData(bindingsDirectory, messagesDirectory, pagingDirectory, false);
}
- public static void printData(File bindingsDirectory, File messagesDirectory, File pagingDirectory, PrintStream out) throws Exception {
+ public static void printData(File bindingsDirectory, File messagesDirectory, File pagingDirectory, boolean secret) throws Exception {
+ printData(bindingsDirectory, messagesDirectory, pagingDirectory, System.out, secret);
+ }
+
+ public static void printData(File bindingsDirectory, File messagesDirectory, File pagingDirectory, PrintStream out, boolean safe) throws Exception {
// Having the version on the data report is an information very useful to understand what happened
// When debugging stuff
Artemis.printBanner(out);
@@ -133,7 +141,7 @@ public class PrintData extends DBOption {
printBanner(out, BINDINGS_BANNER);
try {
- DescribeJournal.describeBindingsJournal(bindingsDirectory, out);
+ DescribeJournal.describeBindingsJournal(bindingsDirectory, out, safe);
} catch (Exception e) {
e.printStackTrace();
}
@@ -142,7 +150,7 @@ public class PrintData extends DBOption {
DescribeJournal describeJournal = null;
try {
- describeJournal = DescribeJournal.describeMessagesJournal(messagesDirectory, out);
+ describeJournal = DescribeJournal.describeMessagesJournal(messagesDirectory, out, safe);
} catch (Exception e) {
e.printStackTrace();
return;
@@ -151,7 +159,7 @@ public class PrintData extends DBOption {
try {
printBanner(out, "P A G I N G");
- printPages(pagingDirectory, describeJournal, out);
+ printPages(pagingDirectory, describeJournal, out, safe);
} catch (Exception e) {
e.printStackTrace();
return;
@@ -166,7 +174,7 @@ public class PrintData extends DBOption {
out.println("********************************************");
}
- private static void printPages(File pageDirectory, DescribeJournal describeJournal, PrintStream out) {
+ private static void printPages(File pageDirectory, DescribeJournal describeJournal, PrintStream out, boolean safe) {
try {
ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(1, ActiveMQThreadFactory.defaultThreadFactory());
@@ -183,7 +191,7 @@ public class PrintData extends DBOption {
addressSettingsRepository.setDefault(new AddressSettings());
PagingManager manager = new PagingManagerImpl(pageStoreFactory, addressSettingsRepository);
- printPages(describeJournal, sm, manager, out);
+ printPages(describeJournal, sm, manager, out, safe);
} catch (Exception e) {
e.printStackTrace();
}
@@ -192,7 +200,8 @@ public class PrintData extends DBOption {
private static void printPages(DescribeJournal describeJournal,
StorageManager sm,
PagingManager manager,
- PrintStream out) throws Exception {
+ PrintStream out,
+ boolean safe) throws Exception {
PageCursorsInfo cursorACKs = calculateCursorsInfo(describeJournal.getRecords());
Set<Long> pgTXs = cursorACKs.getPgTXs();
@@ -222,7 +231,15 @@ public class PrintData extends DBOption {
for (PagedMessage msg : msgs) {
msg.initMessage(sm);
- out.print("pg=" + pgid + ", msg=" + msgID + ",pgTX=" + msg.getTransactionID() + ",userMessageID=" + (msg.getMessage().getUserID() != null ? msg.getMessage().getUserID() : "") + ", msg=" + msg.getMessage());
+ if (safe) {
+ try {
+ out.print("pg=" + pgid + ", msg=" + msgID + ",pgTX=" + msg.getTransactionID() + ", msg=" + msg.getMessage().getClass().getSimpleName() + "(safe data, size=" + msg.getMessage().getPersistentSize() + ")");
+ } catch (Exception e) {
+ out.print("pg=" + pgid + ", msg=" + msgID + ",pgTX=" + msg.getTransactionID() + ", msg=" + msg.getMessage().getClass().getSimpleName() + "(safe data)");
+ }
+ } else {
+ out.print("pg=" + pgid + ", msg=" + msgID + ",pgTX=" + msg.getTransactionID() + ",userMessageID=" + (msg.getMessage().getUserID() != null ? msg.getMessage().getUserID() : "") + ", msg=" + msg.getMessage());
+ }
out.print(",Queues = ");
long[] q = msg.getQueueIDs();
for (int i = 0; i < q.length; i++) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/996871e3/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java
index 172cc18..9119a0d 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java
@@ -1128,7 +1128,7 @@ public class CoreMessage extends RefCountMessage implements ICoreMessage {
checkProperties();
return "CoreMessage[messageID=" + messageID + ",durable=" + isDurable() + ",userID=" + getUserID() + ",priority=" + this.getPriority() +
", timestamp=" + toDate(getTimestamp()) + ",expiration=" + toDate(getExpiration()) +
- ", durable=" + durable + ", address=" + getAddress() + ",properties=" + properties + "]@" + System.identityHashCode(this);
+ ", durable=" + durable + ", address=" + getAddress() + ",size=" + getPersistentSize() + ",properties=" + properties + "]@" + System.identityHashCode(this);
} catch (Throwable e) {
logger.warn("Error creating String for message: ", e);
return "ServerMessage[messageID=" + messageID + "]";
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/996871e3/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java
index 2d72cf9..56b0e6c 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java
@@ -1171,6 +1171,7 @@ public class AMQPMessage extends RefCountMessage {
return "AMQPMessage [durable=" + isDurable() +
", messageID=" + getMessageID() +
", address=" + getAddress() +
+ ", size=" + getEncodeSize() +
"]";
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/996871e3/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/DescribeJournal.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/DescribeJournal.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/DescribeJournal.java
index 6cd417b..2021012 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/DescribeJournal.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/DescribeJournal.java
@@ -75,6 +75,8 @@ import org.apache.activemq.artemis.core.persistence.impl.journal.codec.PageCount
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.PageCountRecordInc;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.PageUpdateTXEncoding;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.PendingLargeMessageEncoding;
+import org.apache.activemq.artemis.core.persistence.impl.journal.codec.PersistentAddressBindingEncoding;
+import org.apache.activemq.artemis.core.persistence.impl.journal.codec.PersistentQueueBindingEncoding;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.RefEncoding;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.ScheduledDeliveryEncoding;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
@@ -107,22 +109,22 @@ public final class DescribeJournal {
}
public static void describeBindingsJournal(final File bindingsDir) throws Exception {
- describeBindingsJournal(bindingsDir, System.out);
+ describeBindingsJournal(bindingsDir, System.out, false);
}
- public static void describeBindingsJournal(final File bindingsDir, PrintStream out) throws Exception {
+ public static void describeBindingsJournal(final File bindingsDir, PrintStream out, boolean safe) throws Exception {
SequentialFileFactory bindingsFF = new NIOSequentialFileFactory(bindingsDir, null, 1);
JournalImpl bindings = new JournalImpl(1024 * 1024, 2, 2, -1, 0, bindingsFF, "activemq-bindings", "bindings", 1);
- describeJournal(bindingsFF, bindings, bindingsDir, out);
+ describeJournal(bindingsFF, bindings, bindingsDir, out, safe);
}
public static DescribeJournal describeMessagesJournal(final File messagesDir) throws Exception {
- return describeMessagesJournal(messagesDir, System.out);
+ return describeMessagesJournal(messagesDir, System.out, false);
}
- public static DescribeJournal describeMessagesJournal(final File messagesDir, PrintStream out) throws Exception {
+ public static DescribeJournal describeMessagesJournal(final File messagesDir, PrintStream out, boolean safe) throws Exception {
SequentialFileFactory messagesFF = new NIOSequentialFileFactory(messagesDir, null, 1);
// Will use only default values. The load function should adapt to anything different
@@ -130,7 +132,7 @@ public final class DescribeJournal {
JournalImpl messagesJournal = new JournalImpl(defaultValues.getJournalFileSize(), defaultValues.getJournalMinFiles(), defaultValues.getJournalPoolFiles(), 0, 0, messagesFF, "activemq-data", "amq", 1);
- return describeJournal(messagesFF, messagesJournal, messagesDir, out);
+ return describeJournal(messagesFF, messagesJournal, messagesDir, out, safe);
}
/**
@@ -141,7 +143,8 @@ public final class DescribeJournal {
private static DescribeJournal describeJournal(SequentialFileFactory fileFactory,
JournalImpl journal,
final File path,
- PrintStream out) throws Exception {
+ PrintStream out,
+ boolean safe) throws Exception {
List<JournalFile> files = journal.orderFiles();
final Map<Long, PageSubscriptionCounterImpl> counters = new HashMap<>();
@@ -155,13 +158,13 @@ public final class DescribeJournal {
@Override
public void onReadUpdateRecordTX(final long transactionID, final RecordInfo recordInfo) throws Exception {
- out.println("operation@UpdateTX;txID=" + transactionID + "," + describeRecord(recordInfo));
+ out.println("operation@UpdateTX;txID=" + transactionID + "," + describeRecord(recordInfo, safe));
checkRecordCounter(recordInfo);
}
@Override
public void onReadUpdateRecord(final RecordInfo recordInfo) throws Exception {
- out.println("operation@Update;" + describeRecord(recordInfo));
+ out.println("operation@Update;" + describeRecord(recordInfo, safe));
checkRecordCounter(recordInfo);
}
@@ -180,7 +183,7 @@ public final class DescribeJournal {
@Override
public void onReadDeleteRecordTX(final long transactionID, final RecordInfo recordInfo) throws Exception {
- out.println("operation@DeleteRecordTX;txID=" + transactionID + "," + describeRecord(recordInfo));
+ out.println("operation@DeleteRecordTX;txID=" + transactionID + "," + describeRecord(recordInfo, safe));
}
@Override
@@ -195,12 +198,12 @@ public final class DescribeJournal {
@Override
public void onReadAddRecordTX(final long transactionID, final RecordInfo recordInfo) throws Exception {
- out.println("operation@AddRecordTX;txID=" + transactionID + "," + describeRecord(recordInfo));
+ out.println("operation@AddRecordTX;txID=" + transactionID + "," + describeRecord(recordInfo, safe));
}
@Override
public void onReadAddRecord(final RecordInfo recordInfo) throws Exception {
- out.println("operation@AddRecord;" + describeRecord(recordInfo));
+ out.println("operation@AddRecord;" + describeRecord(recordInfo, safe));
}
@Override
@@ -254,11 +257,12 @@ public final class DescribeJournal {
printCounters(out, counters);
}
- return printSurvivingRecords(journal, out);
+ return printSurvivingRecords(journal, out, safe);
}
public static DescribeJournal printSurvivingRecords(Journal journal,
- PrintStream out) throws Exception {
+ PrintStream out,
+ boolean safe) throws Exception {
final Map<Long, PageSubscriptionCounterImpl> counters = new HashMap<>();
out.println("### Surviving Records Summary ###");
@@ -282,11 +286,11 @@ public final class DescribeJournal {
List<RecordInfo> recordsToDelete) {
bufferFailingTransactions.append("Transaction " + transactionID + " failed with these records:\n");
for (RecordInfo info : records1) {
- bufferFailingTransactions.append("- " + describeRecord(info) + "\n");
+ bufferFailingTransactions.append("- " + describeRecord(info, safe) + "\n");
}
for (RecordInfo info : recordsToDelete) {
- bufferFailingTransactions.append("- " + describeRecord(info) + " <marked to delete>\n");
+ bufferFailingTransactions.append("- " + describeRecord(info, safe) + " <marked to delete>\n");
}
}
@@ -334,7 +338,7 @@ public final class DescribeJournal {
subsCounter.processReload();
}
- out.println(describeRecord(info, o));
+ out.println(describeRecord(info, o, safe));
if (subsCounter != null) {
out.println("##SubsCounter for queue=" + queueIDForCounter + ", value=" + subsCounter.getValue());
@@ -354,7 +358,7 @@ public final class DescribeJournal {
out.println(tx.getId());
for (RecordInfo info : tx.getRecords()) {
Object o = newObjectEncoding(info);
- out.println("- " + describeRecord(info, o));
+ out.println("- " + describeRecord(info, o, safe));
if (info.getUserRecordType() == 31) {
preparedMessageCount++;
} else if (info.getUserRecordType() == 32) {
@@ -370,7 +374,7 @@ public final class DescribeJournal {
}
for (RecordInfo info : tx.getRecordsToDelete()) {
- out.println("- " + describeRecord(info) + " <marked to delete>");
+ out.println("- " + describeRecord(info, safe) + " <marked to delete>");
}
}
@@ -387,13 +391,13 @@ public final class DescribeJournal {
out.println("message count=" + messageCount);
out.println("message reference count");
for (Map.Entry<Long, Integer> longIntegerEntry : messageRefCounts.entrySet()) {
- System.out.println("queue id " + longIntegerEntry.getKey() + ",count=" + longIntegerEntry.getValue());
+ out.println("queue id " + longIntegerEntry.getKey() + ",count=" + longIntegerEntry.getValue());
}
out.println("prepared message count=" + preparedMessageCount);
for (Map.Entry<Long, Integer> longIntegerEntry : preparedMessageRefCount.entrySet()) {
- System.out.println("queue id " + longIntegerEntry.getKey() + ",count=" + longIntegerEntry.getValue());
+ out.println("queue id " + longIntegerEntry.getKey() + ",count=" + longIntegerEntry.getValue());
}
journal.stop();
@@ -418,12 +422,40 @@ public final class DescribeJournal {
return subsCounter;
}
- private static String describeRecord(RecordInfo info) {
- return "recordID=" + info.id + ";userRecordType=" + info.userRecordType + ";isUpdate=" + info.isUpdate + ";compactCount=" + info.compactCount + ";" + newObjectEncoding(info);
+ private static boolean isSafe(Object obj) {
+ // these classes will have user's data and not considered safe
+ return !(obj instanceof PersistentAddressBindingEncoding ||
+ obj instanceof MessageDescribe ||
+ obj instanceof PersistentQueueBindingEncoding);
}
- private static String describeRecord(RecordInfo info, Object o) {
- return "recordID=" + info.id + ";userRecordType=" + info.userRecordType + ";isUpdate=" + info.isUpdate + ";compactCount=" + info.compactCount + ";" + o;
+ private static String toString(Object obj, boolean safe) {
+ if (obj == null) {
+ return "** null **";
+ }
+ if (safe && !isSafe(obj)) {
+ if (obj instanceof MessageDescribe) {
+ MessageDescribe describe = (MessageDescribe)obj;
+ try {
+ return describe.getMsg().getClass().getSimpleName() + "(safe data, size=" + describe.getMsg().getPersistentSize() + ")";
+ } catch (Throwable e) {
+ e.printStackTrace();
+ return describe.getMsg().getClass().getSimpleName() + "(safe data)";
+ }
+ } else {
+ return obj.getClass().getSimpleName() + "(safe data)";
+ }
+ } else {
+ return obj.toString();
+ }
+ }
+
+ private static String describeRecord(RecordInfo info, boolean safe) {
+ return "recordID=" + info.id + ";userRecordType=" + info.userRecordType + ";isUpdate=" + info.isUpdate + ";compactCount=" + info.compactCount + ";" + toString(newObjectEncoding(info), safe);
+ }
+
+ private static String describeRecord(RecordInfo info, Object o, boolean safe) {
+ return "recordID=" + info.id + ";userRecordType=" + info.userRecordType + ";isUpdate=" + info.isUpdate + ";compactCount=" + info.compactCount + ";" + toString(o, safe);
}
private static String encode(final byte[] data) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/996871e3/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessageImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessageImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessageImpl.java
index dabb039..287b261 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessageImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessageImpl.java
@@ -354,9 +354,12 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
}
@Override
public String toString() {
- return "LargeServerMessage[messageID=" + messageID + ",durable=" + isDurable() + ",userID=" + getUserID() + ",priority=" + this.getPriority() +
- ", timestamp=" + toDate(getTimestamp()) + ",expiration=" + toDate(getExpiration()) +
- ", durable=" + durable + ", address=" + getAddress() + ",properties=" + (properties != null ? properties.toString() : "") + "]@" + System.identityHashCode(this);
+ try {
+ return "LargeServerMessage[messageID=" + messageID + ",durable=" + isDurable() + ",userID=" + getUserID() + ",priority=" + this.getPriority() + ", timestamp=" + toDate(getTimestamp()) + ",expiration=" + toDate(getExpiration()) + ", durable=" + durable + ", address=" + getAddress() + ",size=" + getPersistentSize() + ",properties=" + (properties != null ? properties.toString() : "") + "]@" + System.identityHashCode(this);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "LargeServerMessage[messageID=" + messageID + "]";
+ }
}
@Override