drill-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Chris Westin" <chriswesti...@gmail.com>
Subject Re: Review Request 34004: DRILL-1942: Improved memory allocator
Date Thu, 11 Jun 2015 22:58:49 GMT

-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/34004/
-----------------------------------------------------------

(Updated June 11, 2015, 3:58 p.m.)


Review request for drill and Jacques Nadeau.


Bugs: DRILL-1942
    https://issues.apache.org/jira/browse/DRILL-1942


Repository: drill-git


Description
-------

Rewritten direct memory allocator. Simplified interface, and use, along with a means to support
additional allocation policies in the future. There are features in the allocator and in DrillBuf
that make finding leaks easier, as well as better enforcement of limits. New features include
transfer of buffers, and better slicing support.

This is a preliminary patch to get the review started because it touches a lot of files (readers
and record batches were made AutoCloseable in order to cover cleanup). Subsequent reviews
can use the differential view to just see additional changes. The new allocator is in BaseAllocator.java
(along with derived classes RootAllocator and ChildAllocator); DrillBuf also has significant
changes. Most other changes in other files are just to use newer interfaces, or to change
cleanup() to close(), or to close subordinate objects that are newly (Auto)Closeable. 1There
are still a couple of things to do:
* Some TODO(cwestin)s to clean up tracing and debugging code, as well as adding javadoc
* Using the AllocatorOwner interface to replace the reallocation mechanism for FragmentContext
and OperatorContext so that the allocator doesn't know anything about those objects.


Diffs (updated)
-----

  common/src/main/java/org/apache/drill/common/DrillAutoCloseables.java PRE-CREATION 
  common/src/main/java/org/apache/drill/common/DrillCloseables.java PRE-CREATION 
  common/src/main/java/org/apache/drill/common/config/DrillConfig.java 522303f 
  common/src/main/java/org/apache/drill/common/config/NestedConfig.java 3fd885f 
  contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseRecordReader.java
9458db2 
  contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveRecordReader.java
5394ee3 
  contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoRecordReader.java
182f5a4 
  exec/java-exec/src/main/codegen/templates/AbstractFieldWriter.java 1b5dad1 
  exec/java-exec/src/main/codegen/templates/BaseWriter.java ada410d 
  exec/java-exec/src/main/codegen/templates/ComplexWriters.java 49c75d1 
  exec/java-exec/src/main/codegen/templates/FixedValueVectors.java 1059bfb 
  exec/java-exec/src/main/codegen/templates/JsonOutputRecordWriter.java ea643f0 
  exec/java-exec/src/main/codegen/templates/ListWriters.java 6df4248 
  exec/java-exec/src/main/codegen/templates/MapWriters.java 6ee8035 
  exec/java-exec/src/main/codegen/templates/NullableValueVectors.java 9d03efb 
  exec/java-exec/src/main/codegen/templates/ParquetOutputRecordWriter.java 0d24041 
  exec/java-exec/src/main/codegen/templates/RepeatedValueVectors.java c0fba66 
  exec/java-exec/src/main/codegen/templates/StringOutputRecordWriter.java f704cca 
  exec/java-exec/src/main/codegen/templates/VariableLengthVectors.java 7aa7415 
  exec/java-exec/src/main/java/io/netty/buffer/DrillBuf.java 7f80f7a 
  exec/java-exec/src/main/java/io/netty/buffer/FakeAllocator.java 721aff9 
  exec/java-exec/src/main/java/io/netty/buffer/PooledByteBufAllocatorL.java 2ca79f0 
  exec/java-exec/src/main/java/io/netty/buffer/UnsafeDirectLittleEndian.java e332b13 
  exec/java-exec/src/main/java/org/apache/drill/exec/ExecConstants.java be8c7a0 
  exec/java-exec/src/main/java/org/apache/drill/exec/TestMemoryRetention.java 37e5389 
  exec/java-exec/src/main/java/org/apache/drill/exec/cache/AbstractStreamSerializable.java
ef488d6 
  exec/java-exec/src/main/java/org/apache/drill/exec/cache/LoopedAbstractDrillSerializable.java
d2a7458 
  exec/java-exec/src/main/java/org/apache/drill/exec/cache/VectorAccessibleSerializable.java
8e2ce96 
  exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java 5b28f16 
  exec/java-exec/src/main/java/org/apache/drill/exec/client/DumpCat.java 55d9cf3 
  exec/java-exec/src/main/java/org/apache/drill/exec/client/PrintingResultsListener.java f5a119d

  exec/java-exec/src/main/java/org/apache/drill/exec/exception/FragmentSetupException.java
c276846 
  exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/MappifyUtility.java e27234f

  exec/java-exec/src/main/java/org/apache/drill/exec/memory/Accountor.java eb932ad 
  exec/java-exec/src/main/java/org/apache/drill/exec/memory/AllocationPolicy.java PRE-CREATION

  exec/java-exec/src/main/java/org/apache/drill/exec/memory/AllocationPolicyAgent.java PRE-CREATION

  exec/java-exec/src/main/java/org/apache/drill/exec/memory/AllocationReservation.java PRE-CREATION

  exec/java-exec/src/main/java/org/apache/drill/exec/memory/AllocatorOwner.java PRE-CREATION

  exec/java-exec/src/main/java/org/apache/drill/exec/memory/AllocatorsStatsMXBean.java PRE-CREATION

  exec/java-exec/src/main/java/org/apache/drill/exec/memory/AtomicRemainder.java 057cfa6 
  exec/java-exec/src/main/java/org/apache/drill/exec/memory/BaseAllocator.java PRE-CREATION

  exec/java-exec/src/main/java/org/apache/drill/exec/memory/BufferAllocator.java c233ac5 
  exec/java-exec/src/main/java/org/apache/drill/exec/memory/BufferLedger.java PRE-CREATION

  exec/java-exec/src/main/java/org/apache/drill/exec/memory/ChainedAllocatorOwner.java PRE-CREATION

  exec/java-exec/src/main/java/org/apache/drill/exec/memory/ChildAllocator.java PRE-CREATION

  exec/java-exec/src/main/java/org/apache/drill/exec/memory/OutOfMemoryException.java 063f1c1

  exec/java-exec/src/main/java/org/apache/drill/exec/memory/OutOfMemoryRuntimeException.java
305eabd 
  exec/java-exec/src/main/java/org/apache/drill/exec/memory/RootAllocator.java PRE-CREATION

  exec/java-exec/src/main/java/org/apache/drill/exec/memory/RootAllocatorStatsMXBean.java
PRE-CREATION 
  exec/java-exec/src/main/java/org/apache/drill/exec/memory/TopLevelAllocator.java a78deb6

  exec/java-exec/src/main/java/org/apache/drill/exec/ops/BufferManager.java c953bb3 
  exec/java-exec/src/main/java/org/apache/drill/exec/ops/FragmentContext.java b108924 
  exec/java-exec/src/main/java/org/apache/drill/exec/ops/OperatorContext.java 7cc52ba 
  exec/java-exec/src/main/java/org/apache/drill/exec/ops/OperatorContextImpl.java 6dbd880

  exec/java-exec/src/main/java/org/apache/drill/exec/ops/QueryContext.java 9e2f210 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/ScanBatch.java f56dae3

  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/ScreenCreator.java 5b4d7bd

  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/SingleSenderCreator.java
67062f3 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/TopN/PriorityQueueTemplate.java
369c0ec 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/TopN/TopNBatch.java 9f6bea9

  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/WriterRecordBatch.java
15fb7b5 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggBatch.java
b753574 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/HashAggTemplate.java
1b90dd8 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/StreamingAggBatch.java
c1c5cb9 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/broadcastsender/BroadcastSenderRootExec.java
d2282c8 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/filter/FilterRecordBatch.java
5eee9df 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/HashJoinBatch.java
dd53477 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/MergeJoinBatch.java
6466f70 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/MergeJoinBatchBuilder.java
1187bd6 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/NestedLoopJoinBatch.java
aa4b300 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/limit/LimitRecordBatch.java
eff9e61 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/mergereceiver/MergingRecordBatch.java
ce683cb 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/orderedpartitioner/OrderedPartitionRecordBatch.java
63b7eba 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/PartitionSenderRootExec.java
16d1400 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/producer/ProducerConsumerBatch.java
35bf3cd 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/sort/SortBatch.java 74b7d85

  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/sort/SortRecordBatchBuilder.java
e559ece 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/svremover/RemovingRecordBatch.java
aa9297e 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/trace/TraceRecordBatch.java
af45815 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/union/UnionAllRecordBatch.java
66bc3e3 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/unorderedreceiver/UnorderedReceiverBatch.java
66a2092 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/validate/IteratorValidatorBatchIterator.java
efd155e 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/window/WindowFrameRecordBatch.java
86d11d5 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/xsort/ExternalSortBatch.java
e88bc67 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/xsort/MSortTemplate.java
9b97e1c 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/xsort/PriorityQueueCopier.java
161ca6a 
  exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/xsort/PriorityQueueCopierTemplate.java
f7786b7 
  exec/java-exec/src/main/java/org/apache/drill/exec/record/AbstractRecordBatch.java 4e348bb

  exec/java-exec/src/main/java/org/apache/drill/exec/record/AbstractSingleRecordBatch.java
dd90cab 
  exec/java-exec/src/main/java/org/apache/drill/exec/record/RawFragmentBatch.java edd79ac

  exec/java-exec/src/main/java/org/apache/drill/exec/record/RecordBatch.java 6f10a1c 
  exec/java-exec/src/main/java/org/apache/drill/exec/record/RecordBatchLoader.java 1b8b7ce

  exec/java-exec/src/main/java/org/apache/drill/exec/record/VectorAccessible.java 9db1681

  exec/java-exec/src/main/java/org/apache/drill/exec/record/WritableBatch.java 308a8bc 
  exec/java-exec/src/main/java/org/apache/drill/exec/record/selection/SelectionVector2.java
7a7c012 
  exec/java-exec/src/main/java/org/apache/drill/exec/record/selection/SelectionVector4.java
69bc78f 
  exec/java-exec/src/main/java/org/apache/drill/exec/rpc/RpcDecoder.java 74a4afb 
  exec/java-exec/src/main/java/org/apache/drill/exec/rpc/data/DataServer.java 6f8e20b 
  exec/java-exec/src/main/java/org/apache/drill/exec/rpc/user/QueryDataBatch.java 914bd00

  exec/java-exec/src/main/java/org/apache/drill/exec/rpc/user/UserClient.java a8bad78 
  exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java d0a998e

  exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java e7a9a3c 
  exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractRecordReader.java 6e27628

  exec/java-exec/src/main/java/org/apache/drill/exec/store/RecordReader.java 61ccac5 
  exec/java-exec/src/main/java/org/apache/drill/exec/store/avro/AvroRecordReader.java a52fd22

  exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JSONRecordReader.java
3d789eb 
  exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JsonProcessor.java 4d8d4ba

  exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/reader/BaseJsonProcessor.java
7833631 
  exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/text/compliant/CompliantTextRecordReader.java
b2af32d 
  exec/java-exec/src/main/java/org/apache/drill/exec/store/mock/MockRecordReader.java fd97c48

  exec/java-exec/src/main/java/org/apache/drill/exec/store/mock/MockScanBatchCreator.java
74423bf 
  exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/columnreaders/ParquetRecordReader.java
58cf321 
  exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet2/DrillParquetReader.java
99ac19c 
  exec/java-exec/src/main/java/org/apache/drill/exec/store/pojo/PojoRecordReader.java cf98b83

  exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/MemoryIterator.java e02b413

  exec/java-exec/src/main/java/org/apache/drill/exec/store/text/DrillTextRecordReader.java
0322f36 
  exec/java-exec/src/main/java/org/apache/drill/exec/vector/AllocationHelper.java 7c77ca2

  exec/java-exec/src/main/java/org/apache/drill/exec/vector/BaseDataValueVector.java 0c6097c

  exec/java-exec/src/main/java/org/apache/drill/exec/vector/BaseValueVector.java 22f0fe7 
  exec/java-exec/src/main/java/org/apache/drill/exec/vector/BitVector.java 2fc5bf3 
  exec/java-exec/src/main/java/org/apache/drill/exec/vector/ValueVector.java e4a0997 
  exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/AbstractContainerVector.java
d14dca6 
  exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/AbstractMapVector.java
78846dc 
  exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/MapVector.java 4138839

  exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/RepeatedListVector.java
c061029 
  exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/RepeatedMapVector.java
e5d48dd 
  exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/DrillBufInputStream.java
1061a5c 
  exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReader.java 095d8c6

  exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/impl/AbstractBaseWriter.java
ec8c00b 
  exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/impl/ComplexWriterImpl.java
a4a35e2 
  exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/impl/VectorContainerWriter.java
6b6ab46 
  exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/writer/FieldWriter.java
3faa4f7 
  exec/java-exec/src/main/java/org/apache/drill/exec/work/batch/SpoolingRawBatchBuffer.java
2a79e42 
  exec/java-exec/src/main/java/org/apache/drill/exec/work/foreman/Foreman.java 49d0c94 
  exec/java-exec/src/main/java/org/apache/drill/exec/work/foreman/ForemanException.java 32a99ad

  exec/java-exec/src/test/java/org/apache/drill/BaseTestQuery.java f8ec090 
  exec/java-exec/src/test/java/org/apache/drill/PlanTestBase.java f909681 
  exec/java-exec/src/test/java/org/apache/drill/PlanningBase.java da033f7 
  exec/java-exec/src/test/java/org/apache/drill/QueryTestUtil.java e218d6c 
  exec/java-exec/src/test/java/org/apache/drill/TestTpchPlanning.java 707ea78 
  exec/java-exec/src/test/java/org/apache/drill/exec/client/DumpCatTest.java 7c58b19 
  exec/java-exec/src/test/java/org/apache/drill/exec/compile/bytecode/ReplaceMethodInvoke.java
bc2d929 
  exec/java-exec/src/test/java/org/apache/drill/exec/expr/ExpressionTest.java 239a099 
  exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestByteComparisonFunctions.java
1e9a47c 
  exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestCastFunctions.java 3ba8743

  exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestMathFunctions.java 4f06a9d

  exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestNewMathFunctions.java 880184e

  exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestRepeatedFunction.java 73c7508

  exec/java-exec/src/test/java/org/apache/drill/exec/memory/TestAllocators.java 74ce225 
  exec/java-exec/src/test/java/org/apache/drill/exec/memory/TestBaseAllocator.java PRE-CREATION

  exec/java-exec/src/test/java/org/apache/drill/exec/memory/TestEndianess.java 48ddada 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/SimpleRootExec.java 42d2193

  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestCastFunctions.java
ffa8765 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestComparisonFunctions.java
c69c6f5 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestImplicitCastFunctions.java
03c6f41 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestOptiqPlans.java dc37071

  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFragmentRun.java
09ba1a5 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestSimpleFunctions.java
d551319 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestStringFunctions.java
d72c1e1 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestUnionExchange.java
9c24f79 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/agg/TestAgg.java b39566a

  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/common/TestHashTable.java
b02249d 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/filter/TestSimpleFilter.java
a069078 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestHashJoin.java
6c067fe 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/join/TestMergeJoin.java
18555c7 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/limit/TestSimpleLimit.java
7cdb41a 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/mergereceiver/TestMergingReceiver.java
0122c08 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/project/TestSimpleProjection.java
43c430a 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/sort/TestSimpleSort.java
f37624a 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/trace/TestTraceMultiRecordBatch.java
b82846e 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/trace/TestTraceOutputDump.java
1cb72ff 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/union/TestSimpleUnion.java
07de27f 
  exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/writer/TestWriter.java
f4d505d 
  exec/java-exec/src/test/java/org/apache/drill/exec/record/vector/TestLoad.java f57e765 
  exec/java-exec/src/test/java/org/apache/drill/exec/record/vector/TestValueVector.java 1564aea

  exec/java-exec/src/test/java/org/apache/drill/exec/server/DrillClientFactory.java 4230518

  exec/java-exec/src/test/java/org/apache/drill/exec/server/TestDrillbitResilience.java da69e9e

  exec/java-exec/src/test/java/org/apache/drill/exec/store/TestDirectCodecFactory.java 644144e

  exec/java-exec/src/test/java/org/apache/drill/exec/store/ischema/TestInfoSchemaFilterPushDown.java
b6e789b 
  exec/java-exec/src/test/java/org/apache/drill/exec/store/json/TestJsonRecordReader.java
bb1af9e 
  exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/FieldInfo.java 34f60ba

  exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/ParquetRecordReaderTest.java
8fdaa72 
  exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet/ParquetResultListener.java
6326478 
  exec/java-exec/src/test/java/org/apache/drill/exec/vector/TestSplitAndTransfer.java 4b3aa8a

  exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/TestEmptyPopulator.java
23cc316 
  exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/fn/TestJsonReaderWithSparseFiles.java
d674d47 
  exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/writer/TestComplexTypeReader.java
521a41d 
  exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/writer/TestComplexTypeWriter.java
cb7bef2 
  exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/writer/TestJsonReader.java
dfa89ca 
  exec/java-exec/src/test/java/org/apache/drill/exec/vector/complex/writer/TestRepeated.java
6e2a2b5 
  exec/java-exec/src/test/resources/logback.xml 2dcfed9 
  exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java 74c6655 

Diff: https://reviews.apache.org/r/34004/diff/


Testing
-------

Many unit tests run by hand. Currently trying to track down a problem where some query tests
(currently working with TestJsonReader, but several others exhibit the same behavior) work
with assertions enabled, but hang and time out with assertions disabled.

Will begin submitting for automated testing to see what the state of the rest of the world
is, but wanted to make this available to look at for now because of its size.


Thanks,

Chris Westin


Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message