This is an automated email from the ASF dual-hosted git repository.

mboehm7 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/systemds.git


The following commit(s) were added to refs/heads/main by this push:
     new b054bd8cce [MINOR] Improved code coverage bufferpool and related 
components
b054bd8cce is described below

commit b054bd8cce515a413b23bd91dd8ebb054736f166
Author: Matthias Boehm <[email protected]>
AuthorDate: Fri Aug 16 15:18:17 2024 +0200

    [MINOR] Improved code coverage bufferpool and related components
---
 .../runtime/controlprogram/caching/ByteBuffer.java |   6 +-
 .../caching/CacheMaintenanceService.java           |  19 +--
 .../controlprogram/caching/CacheStatistics.java    |  17 ---
 .../controlprogram/caching/CacheableData.java      |   4 +-
 .../runtime/controlprogram/caching/PageCache.java  |   5 +-
 .../controlprogram/parfor/RemoteParForUtils.java   |  40 -------
 .../sysds/runtime/frame/data/FrameBlock.java       |   5 +-
 .../sysds/runtime/matrix/data/MatrixBlock.java     |   4 +
 .../sysds/runtime/meta/DataCharacteristics.java    | 131 +++++---------------
 .../sysds/runtime/meta/MatrixCharacteristics.java  |  30 ++++-
 .../sysds/runtime/meta/TensorCharacteristics.java  |  86 +++++++++++++
 .../test/functions/caching/BufferpoolLeakTest.java |  22 +++-
 .../functions/caching/CachingPWriteExportTest.java |  11 +-
 .../functions/caching/KeyBufferPoolComponents.java | 133 +++++++++++++++++++++
 .../sysds/test/functions/caching/UMMTest.java      |   2 +
 15 files changed, 318 insertions(+), 197 deletions(-)

diff --git 
a/src/main/java/org/apache/sysds/runtime/controlprogram/caching/ByteBuffer.java 
b/src/main/java/org/apache/sysds/runtime/controlprogram/caching/ByteBuffer.java
index 8c74de792f..48da215f88 100644
--- 
a/src/main/java/org/apache/sysds/runtime/controlprogram/caching/ByteBuffer.java
+++ 
b/src/main/java/org/apache/sysds/runtime/controlprogram/caching/ByteBuffer.java
@@ -25,6 +25,7 @@ import java.io.DataInputStream;
 import java.io.DataOutput;
 import java.io.IOException;
 
+import org.apache.sysds.runtime.DMLRuntimeException;
 import org.apache.sysds.runtime.data.DenseBlockLDRB;
 import org.apache.sysds.runtime.frame.data.FrameBlock;
 import org.apache.sysds.runtime.matrix.data.MatrixBlock;
@@ -51,8 +52,7 @@ public class ByteBuffer
        }
 
        public void serializeBlock( CacheBlock<?> cb ) 
-               throws IOException
-       {       
+       {
                _shallow = cb.isShallowSerialize(true);
                _matrix = (cb instanceof MatrixBlock);
                
@@ -77,7 +77,7 @@ public class ByteBuffer
                        }
                }
                catch(Exception ex) {
-                       throw new IOException("Failed to serialize cache 
block.", ex);
+                       throw new DMLRuntimeException("Failed to serialize 
cache block.", ex);
                }
                
                _serialized = true;
diff --git 
a/src/main/java/org/apache/sysds/runtime/controlprogram/caching/CacheMaintenanceService.java
 
b/src/main/java/org/apache/sysds/runtime/controlprogram/caching/CacheMaintenanceService.java
index f4454e66d9..ca68183653 100644
--- 
a/src/main/java/org/apache/sysds/runtime/controlprogram/caching/CacheMaintenanceService.java
+++ 
b/src/main/java/org/apache/sysds/runtime/controlprogram/caching/CacheMaintenanceService.java
@@ -19,10 +19,8 @@
 
 package org.apache.sysds.runtime.controlprogram.caching;
 
-import org.apache.sysds.runtime.DMLRuntimeException;
 import org.apache.sysds.runtime.util.LocalFileUtils;
 
-import java.io.IOException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -48,14 +46,8 @@ public class CacheMaintenanceService
                //sync or async file delete
                if( CacheableData.CACHING_ASYNC_SERIALIZE )
                        _pool.submit(new 
CacheMaintenanceService.DataSerializerTask(bbuff, cb));
-               else {
-                       try {
-                               bbuff.serializeBlock(cb);
-                       }
-                       catch(IOException ex) {
-                               throw new DMLRuntimeException(ex);
-                       }
-               }
+               else
+                       bbuff.serializeBlock(cb);
        }
 
        public void close() {
@@ -94,12 +86,7 @@ public class CacheMaintenanceService
 
                @Override
                public void run() {
-                       try {
-                               _bbuff.serializeBlock(_cb);
-                       }
-                       catch(IOException ex) {
-                               throw new DMLRuntimeException(ex);
-                       }
+                       _bbuff.serializeBlock(_cb);
                }
        }
 }
diff --git 
a/src/main/java/org/apache/sysds/runtime/controlprogram/caching/CacheStatistics.java
 
b/src/main/java/org/apache/sysds/runtime/controlprogram/caching/CacheStatistics.java
index fe525be9cd..2e8f8a9353 100644
--- 
a/src/main/java/org/apache/sysds/runtime/controlprogram/caching/CacheStatistics.java
+++ 
b/src/main/java/org/apache/sysds/runtime/controlprogram/caching/CacheStatistics.java
@@ -34,23 +34,6 @@ import java.util.concurrent.atomic.LongAdder;
  */
 public class CacheStatistics 
 {
-       //enum used for MR counters
-       public enum Stat {
-               CACHE_HITS_MEM,
-               CACHE_HITS_FSBUFF,
-               CACHE_HITS_FS,
-               CACHE_HITS_HDFS,
-               CACHE_HITS_LIN,
-               CACHE_WRITES_FSBUFF,
-               CACHE_WRITES_FS,
-               CACHE_WRITES_HDFS,
-               CACHE_WRITES_LIN,
-               CACHE_TIME_ACQR, //acquire read
-               CACHE_TIME_ACQM, //acquire read
-               CACHE_TIME_RLS, //release
-               CACHE_TIME_EXP, //export 
-       }
-       
        //hit statistics (for acquire read)
        private static final LongAdder _numHitsMem      = new LongAdder();
        private static final LongAdder _numHitsFSBuff   = new LongAdder();
diff --git 
a/src/main/java/org/apache/sysds/runtime/controlprogram/caching/CacheableData.java
 
b/src/main/java/org/apache/sysds/runtime/controlprogram/caching/CacheableData.java
index b70e583765..8e37dc29a2 100644
--- 
a/src/main/java/org/apache/sysds/runtime/controlprogram/caching/CacheableData.java
+++ 
b/src/main/java/org/apache/sysds/runtime/controlprogram/caching/CacheableData.java
@@ -83,11 +83,11 @@ public abstract class CacheableData<T extends 
CacheBlock<?>> extends Data
        // global constant configuration parameters
        public static final long CACHING_THRESHOLD = (long)Math.max(4*1024, 
//obj not s.t. caching
                1e-5 * InfrastructureAnalyzer.getLocalMaxMemory());       //if 
below threshold [in bytes]
-       public static final RPolicy CACHING_BUFFER_POLICY = RPolicy.FIFO;
+       public static RPolicy CACHING_BUFFER_POLICY = RPolicy.FIFO;
        public static final String  CACHING_COUNTER_GROUP_NAME = "SystemDS 
Caching Counters";
        public static final String  CACHING_EVICTION_FILEEXTENSION = ".dat";
        public static final boolean CACHING_ASYNC_FILECLEANUP = true;
-       public static final boolean CACHING_ASYNC_SERIALIZE = false;
+       public static boolean CACHING_ASYNC_SERIALIZE = false;
        
        //NOTE CACHING_ASYNC_SERIALIZE:
        // The serialization of matrices and frames (ultra-sparse matrices or 
diff --git 
a/src/main/java/org/apache/sysds/runtime/controlprogram/caching/PageCache.java 
b/src/main/java/org/apache/sysds/runtime/controlprogram/caching/PageCache.java
index 70878bc6ba..e0d11ed2b8 100644
--- 
a/src/main/java/org/apache/sysds/runtime/controlprogram/caching/PageCache.java
+++ 
b/src/main/java/org/apache/sysds/runtime/controlprogram/caching/PageCache.java
@@ -32,8 +32,7 @@ public class PageCache
                _pool = new HashMap<>();
        }
 
-       public static void clear()
-       {
+       public static void clear() {
                _pool = null;
        }
 
@@ -48,7 +47,7 @@ public class PageCache
                        list = new LinkedList<>();
                        _pool.put(data.length, list);
                }
-               list.addLast(new SoftReference<>(data));        
+               list.addLast(new SoftReference<>(data));
        }
 
        public static byte[] getPage( int size )
diff --git 
a/src/main/java/org/apache/sysds/runtime/controlprogram/parfor/RemoteParForUtils.java
 
b/src/main/java/org/apache/sysds/runtime/controlprogram/parfor/RemoteParForUtils.java
index 4a5a898c5d..b0c1c6eb45 100644
--- 
a/src/main/java/org/apache/sysds/runtime/controlprogram/parfor/RemoteParForUtils.java
+++ 
b/src/main/java/org/apache/sysds/runtime/controlprogram/parfor/RemoteParForUtils.java
@@ -26,21 +26,14 @@ import java.util.List;
 import java.util.Map.Entry;
 
 import org.apache.commons.logging.Log;
-import org.apache.hadoop.mapred.JobConf;
-import org.apache.hadoop.mapred.Reporter;
-import org.apache.sysds.api.DMLScript;
 import org.apache.sysds.conf.ConfigurationManager;
 import org.apache.sysds.hops.OptimizerUtils;
 import org.apache.sysds.common.Types.DataType;
 import org.apache.sysds.parser.ParForStatementBlock.ResultVar;
 import org.apache.sysds.runtime.DMLRuntimeException;
 import org.apache.sysds.runtime.controlprogram.LocalVariableMap;
-import org.apache.sysds.runtime.controlprogram.ParForProgramBlock;
-import org.apache.sysds.runtime.controlprogram.caching.CacheStatistics;
 import org.apache.sysds.runtime.controlprogram.caching.CacheableData;
 import org.apache.sysds.runtime.controlprogram.caching.MatrixObject;
-import 
org.apache.sysds.runtime.controlprogram.parfor.stat.InfrastructureAnalyzer;
-import org.apache.sysds.runtime.controlprogram.parfor.stat.Stat;
 import org.apache.sysds.runtime.controlprogram.parfor.util.IDHandler;
 import org.apache.sysds.runtime.instructions.cp.Data;
 import org.apache.sysds.runtime.instructions.cp.ListObject;
@@ -54,7 +47,6 @@ import static org.apache.sysds.utils.Explain.explain;
 import org.apache.sysds.runtime.util.HDFSTool;
 import org.apache.sysds.runtime.util.LocalFileUtils;
 import org.apache.sysds.runtime.util.ProgramConverter;
-import org.apache.sysds.utils.Statistics;
 
 import scala.Tuple2;
 
@@ -65,38 +57,6 @@ import scala.Tuple2;
  */
 public class RemoteParForUtils 
 {
-       public static void incrementParForMRCounters(Reporter reporter, long 
deltaTasks, long deltaIterations)
-       {
-               //report parfor counters
-               if( deltaTasks>0 )
-                       
reporter.incrCounter(ParForProgramBlock.PARFOR_COUNTER_GROUP_NAME, 
Stat.PARFOR_NUMTASKS.toString(), deltaTasks);
-               if( deltaIterations>0 )
-                       
reporter.incrCounter(ParForProgramBlock.PARFOR_COUNTER_GROUP_NAME, 
Stat.PARFOR_NUMITERS.toString(), deltaIterations);
-               
-               JobConf job = ConfigurationManager.getCachedJobConf();
-               if( DMLScript.STATISTICS  && 
!InfrastructureAnalyzer.isLocalMode(job) ) 
-               {
-                       //report cache statistics
-                       reporter.incrCounter( 
ParForProgramBlock.PARFOR_COUNTER_GROUP_NAME, 
Stat.PARFOR_JITCOMPILE.toString(), Statistics.getJITCompileTime());
-                       reporter.incrCounter( 
ParForProgramBlock.PARFOR_COUNTER_GROUP_NAME, 
Stat.PARFOR_JVMGC_COUNT.toString(), Statistics.getJVMgcCount());
-                       reporter.incrCounter( 
ParForProgramBlock.PARFOR_COUNTER_GROUP_NAME, 
Stat.PARFOR_JVMGC_TIME.toString(), Statistics.getJVMgcTime());
-                       reporter.incrCounter( 
CacheableData.CACHING_COUNTER_GROUP_NAME, 
CacheStatistics.Stat.CACHE_HITS_MEM.toString(), CacheStatistics.getMemHits());
-                       reporter.incrCounter( 
CacheableData.CACHING_COUNTER_GROUP_NAME, 
CacheStatistics.Stat.CACHE_HITS_FSBUFF.toString(), 
CacheStatistics.getFSBuffHits());
-                       reporter.incrCounter( 
CacheableData.CACHING_COUNTER_GROUP_NAME, 
CacheStatistics.Stat.CACHE_HITS_FS.toString(), CacheStatistics.getFSHits());
-                       reporter.incrCounter( 
CacheableData.CACHING_COUNTER_GROUP_NAME, 
CacheStatistics.Stat.CACHE_HITS_HDFS.toString(), CacheStatistics.getHDFSHits());
-                       reporter.incrCounter( 
CacheableData.CACHING_COUNTER_GROUP_NAME, 
CacheStatistics.Stat.CACHE_WRITES_FSBUFF.toString(), 
CacheStatistics.getFSBuffWrites());
-                       reporter.incrCounter( 
CacheableData.CACHING_COUNTER_GROUP_NAME, 
CacheStatistics.Stat.CACHE_WRITES_FS.toString(), CacheStatistics.getFSWrites());
-                       reporter.incrCounter( 
CacheableData.CACHING_COUNTER_GROUP_NAME, 
CacheStatistics.Stat.CACHE_WRITES_HDFS.toString(), 
CacheStatistics.getHDFSWrites());
-                       reporter.incrCounter( 
CacheableData.CACHING_COUNTER_GROUP_NAME, 
CacheStatistics.Stat.CACHE_TIME_ACQR.toString(), 
CacheStatistics.getAcquireRTime());
-                       reporter.incrCounter( 
CacheableData.CACHING_COUNTER_GROUP_NAME, 
CacheStatistics.Stat.CACHE_TIME_ACQM.toString(), 
CacheStatistics.getAcquireMTime());
-                       reporter.incrCounter( 
CacheableData.CACHING_COUNTER_GROUP_NAME, 
CacheStatistics.Stat.CACHE_TIME_RLS.toString(), 
CacheStatistics.getReleaseTime());
-                       reporter.incrCounter( 
CacheableData.CACHING_COUNTER_GROUP_NAME, 
CacheStatistics.Stat.CACHE_TIME_EXP.toString(), 
CacheStatistics.getExportTime());
-               
-                       //reset cache statistics to prevent overlapping 
reporting
-                       CacheStatistics.reset();
-               }
-       }
-
        /**
         * For remote Spark parfor workers. This is a simplified version 
compared to MR.
         * 
diff --git a/src/main/java/org/apache/sysds/runtime/frame/data/FrameBlock.java 
b/src/main/java/org/apache/sysds/runtime/frame/data/FrameBlock.java
index e1f2625cb0..4896d82f28 100644
--- a/src/main/java/org/apache/sysds/runtime/frame/data/FrameBlock.java
+++ b/src/main/java/org/apache/sysds/runtime/frame/data/FrameBlock.java
@@ -846,8 +846,9 @@ public class FrameBlock implements CacheBlock<FrameBlock>, 
Externalizable {
 
                // meta data array (overhead and entries)
                size += MemoryEstimates.objectArrayCost(clen);
-               for(ColumnMetadata mtd : _colmeta)
-                       size += mtd == null ? 8 : mtd.getInMemorySize();
+               if( _colmeta != null )
+                       for(ColumnMetadata mtd : _colmeta)
+                               size += mtd == null ? 8 : mtd.getInMemorySize();
 
                // data array
                size += MemoryEstimates.objectArrayCost(clen);
diff --git 
a/src/main/java/org/apache/sysds/runtime/matrix/data/MatrixBlock.java 
b/src/main/java/org/apache/sysds/runtime/matrix/data/MatrixBlock.java
index cbf9485c34..16a9503699 100644
--- a/src/main/java/org/apache/sysds/runtime/matrix/data/MatrixBlock.java
+++ b/src/main/java/org/apache/sysds/runtime/matrix/data/MatrixBlock.java
@@ -5526,6 +5526,10 @@ public class MatrixBlock extends MatrixValue implements 
CacheBlock<MatrixBlock>,
 
        // (rand, sequence)
        
+       public static MatrixBlock randOperations(int rows, int cols, double 
sparsity) {
+               return randOperations(rows, cols, sparsity, 0, 1, "uniform", 
-1);
+       }
+       
        /**
         * Function to generate the random matrix with specified dimensions 
(block sizes are not specified).
         *  
diff --git 
a/src/main/java/org/apache/sysds/runtime/meta/DataCharacteristics.java 
b/src/main/java/org/apache/sysds/runtime/meta/DataCharacteristics.java
index 17900cbf3c..073434ad81 100644
--- a/src/main/java/org/apache/sysds/runtime/meta/DataCharacteristics.java
+++ b/src/main/java/org/apache/sysds/runtime/meta/DataCharacteristics.java
@@ -19,7 +19,6 @@
 
 package org.apache.sysds.runtime.meta;
 
-import org.apache.sysds.runtime.DMLRuntimeException;
 import org.apache.sysds.runtime.matrix.operators.AggregateBinaryOperator;
 import org.apache.sysds.runtime.matrix.operators.AggregateUnaryOperator;
 import org.apache.sysds.runtime.matrix.operators.ReorgOperator;
@@ -32,45 +31,25 @@ public abstract class DataCharacteristics implements 
Serializable {
        protected int _blocksize;                 // squared block size
        protected boolean _noEmptyBlocks = false; // does not materialize empty 
blocks
        
-       public DataCharacteristics set(long nr, long nc, int blen) {
-               throw new DMLRuntimeException("DataCharacteristics.set(long, 
long, int): should never get called in the base class");
-       }
+       public abstract DataCharacteristics set(long nr, long nc, int blen);
 
-       public DataCharacteristics set(long nr, long nc, int blen, long nnz) {
-               throw new DMLRuntimeException("DataCharacteristics.set(long, 
long, int, long): should never get called in the base class");
-       }
+       public abstract DataCharacteristics set(long nr, long nc, int blen, 
long nnz);
 
-       public DataCharacteristics set(long[] dims, int blocksize) {
-               throw new DMLRuntimeException("DataCharacteristics.set(long[], 
int): should never get called in the base class");
-       }
+       public abstract DataCharacteristics set(long[] dims, int blocksize);
 
-       public DataCharacteristics set(long[] dims, int blocksize, long nnz) {
-               throw new DMLRuntimeException("DataCharacteristics.set(long[], 
int, long): should never get called in the base class");
-       }
+       public abstract DataCharacteristics set(long[] dims, int blocksize, 
long nnz);
 
-       public DataCharacteristics set(DataCharacteristics that) {
-               throw new 
DMLRuntimeException("DataCharacteristics.set(DataCharacteristics): should never 
get called in the base class");
-       }
+       public abstract DataCharacteristics set(DataCharacteristics that);
 
-       public long getRows() {
-               throw new DMLRuntimeException("DataCharacteristics.getRows(): 
should never get called in the base class");
-       }
+       public abstract long getRows();
 
-       public DataCharacteristics setRows(long rlen) {
-               throw new 
DMLRuntimeException("DataCharacteristics.setRows(long): should never get called 
in the base class");
-       }
+       public abstract DataCharacteristics setRows(long rlen);
 
-       public long getCols() {
-               throw new DMLRuntimeException("DataCharacteristics.getCols(): 
should never get called in the base class");
-       }
+       public abstract long getCols();
 
-       public DataCharacteristics setCols(long clen) {
-               throw new 
DMLRuntimeException("DataCharacteristics.setCols(long): should never get called 
in the base class");
-       }
+       public abstract DataCharacteristics setCols(long clen);
 
-       public long getLength() {
-               throw new DMLRuntimeException("DataCharacteristics.getLength(): 
should never get called in the base class");
-       }
+       public abstract long getLength();
 
        public int getBlocksize() {
                return _blocksize;
@@ -92,100 +71,56 @@ public abstract class DataCharacteristics implements 
Serializable {
        }
 
        public long getNumBlocks() {
-               throw new 
DMLRuntimeException("DataCharacteristics.getNumBlocks(int): should never get 
called in the base class");
+               return getNumRowBlocks() * getNumColBlocks();
        }
 
-       public long getNumRowBlocks() {
-               throw new 
DMLRuntimeException("DataCharacteristics.getNumRowBlocks(): should never get 
called in the base class");
-       }
+       public abstract long getNumRowBlocks();
 
-       public long getNumColBlocks() {
-               throw new 
DMLRuntimeException("DataCharacteristics.getNumColBlocks(): should never get 
called in the base class");
-       }
+       public abstract long getNumColBlocks();
 
-       public DataCharacteristics setDimension(long nr, long nc) {
-               throw new 
DMLRuntimeException("DataCharacteristics.setDimension(long, long): should never 
get called in the base class");
-       }
+       public abstract DataCharacteristics setDimension(long nr, long nc);
 
-       public int getNumDims() {
-               throw new 
DMLRuntimeException("DataCharacteristics.getNumDims(): should never get called 
in the base class");
-       }
+       public abstract int getNumDims();
 
-       public long getDim(int i) {
-               throw new DMLRuntimeException("DataCharacteristics.getDim(int): 
should never get called in the base class");
-       }
+       public abstract long getDim(int i);
 
        public long[] getDims() {
                return getLongDims();
        }
 
-       public long[] getLongDims() {
-               throw new 
DMLRuntimeException("DataCharacteristics.getLongDims(): should never get called 
in the base class");
-       }
+       public abstract long[] getLongDims();
 
-       public int[] getIntDims() {
-               throw new 
DMLRuntimeException("DataCharacteristics.getIntDims(): should never get called 
in the base class");
-       }
+       public abstract int[] getIntDims();
 
-       public DataCharacteristics setDim(int i, long dim) {
-               throw new DMLRuntimeException("DataCharacteristics.setDim(int, 
long): should never get called in the base class");
-       }
+       public abstract DataCharacteristics setDim(int i, long dim);
 
-       public DataCharacteristics setDims(long[] dims) {
-               throw new 
DMLRuntimeException("DataCharacteristics.setDims(long[]): should never get 
called in the base class");
-       }
+       public abstract DataCharacteristics setDims(long[] dims);
 
-       public long getNumBlocks(int i) {
-               throw new 
DMLRuntimeException("DataCharacteristics.getNumBlocks(i): should never get 
called in the base class");
-       }
+       public abstract long getNumBlocks(int i);
 
-       public DataCharacteristics setNonZeros(long nnz) {
-               throw new 
DMLRuntimeException("DataCharacteristics.setNonZeros(long): should never get 
called in the base class");
-       }
+       public abstract DataCharacteristics setNonZeros(long nnz);
 
-       public long getNonZeros() {
-               throw new 
DMLRuntimeException("DataCharacteristics.getNonZeros(): should never get called 
in the base class");
-       }
+       public abstract long getNonZeros();
 
-       public DataCharacteristics setNonZerosBound(long nnz) {
-               throw new 
DMLRuntimeException("DataCharacteristics.setNonZerosBound(long): should never 
get called in the base class");
-       }
+       public abstract DataCharacteristics setNonZerosBound(long nnz);
 
-       public long getNonZerosBound() {
-               throw new 
DMLRuntimeException("DataCharacteristics.getNonZerosBound(): should never get 
called in the base class");
-       }
+       public abstract long getNonZerosBound();
 
-       public double getSparsity() {
-               throw new 
DMLRuntimeException("DataCharacteristics.getSparsity(): should never get called 
in the base class");
-       }
+       public abstract double getSparsity();
 
-       public boolean dimsKnown() {
-               throw new DMLRuntimeException("DataCharacteristics.dimsKnown(): 
should never get called in the base class");
-       }
+       public abstract boolean dimsKnown();
 
-       public boolean dimsKnown(boolean includeNnz) {
-               throw new 
DMLRuntimeException("DataCharacteristics.dimsKnown(boolean): should never get 
called in the base class");
-       }
+       public abstract boolean dimsKnown(boolean includeNnz);
 
-       public boolean rowsKnown() {
-               throw new DMLRuntimeException("DataCharacteristics.rowsKnown(): 
should never get called in the base class");
-       }
+       public abstract boolean rowsKnown();
 
-       public boolean colsKnown() {
-               throw new DMLRuntimeException("DataCharacteristics.colsKnown(): 
should never get called in the base class");
-       }
+       public abstract boolean colsKnown();
 
-       public boolean nnzKnown() {
-               throw new DMLRuntimeException("DataCharacteristics.nnzKnown(): 
should never get called in the base class");
-       }
+       public abstract boolean nnzKnown();
 
-       public boolean isUltraSparse() {
-               throw new 
DMLRuntimeException("DataCharacteristics.isUltraSparse(): should never get 
called in the base class");
-       }
+       public abstract boolean isUltraSparse();
 
-       public boolean mightHaveEmptyBlocks() {
-               throw new 
DMLRuntimeException("DataCharacteristics.mightHaveEmptyBlocks(): should never 
get called in the base class");
-       }
+       public abstract boolean mightHaveEmptyBlocks();
 
        public static void reorg(DataCharacteristics dim, ReorgOperator op, 
DataCharacteristics dimOut) {
                op.fn.computeDimension(dim, dimOut);
diff --git 
a/src/main/java/org/apache/sysds/runtime/meta/MatrixCharacteristics.java 
b/src/main/java/org/apache/sysds/runtime/meta/MatrixCharacteristics.java
index 82c3aba08d..ff769df44a 100644
--- a/src/main/java/org/apache/sysds/runtime/meta/MatrixCharacteristics.java
+++ b/src/main/java/org/apache/sysds/runtime/meta/MatrixCharacteristics.java
@@ -112,11 +112,6 @@ public class MatrixCharacteristics extends 
DataCharacteristics
                return numRows * numColumns;
        }
 
-       @Override
-       public long getNumBlocks() {
-               return getNumRowBlocks() * getNumColBlocks();
-       }
-
        @Override
        public long getNumRowBlocks() {
                //number of row blocks w/ awareness of zero rows
@@ -274,4 +269,29 @@ public class MatrixCharacteristics extends 
DataCharacteristics
                sb.append(")]");
                return sb.toString();
        }
+
+       @Override
+       public DataCharacteristics set(long[] dims, int blocksize) {
+               throw new UnsupportedOperationException();
+       }
+
+       @Override
+       public DataCharacteristics set(long[] dims, int blocksize, long nnz) {
+               throw new UnsupportedOperationException();
+       }
+
+       @Override
+       public DataCharacteristics setDim(int i, long dim) {
+               throw new UnsupportedOperationException();
+       }
+
+       @Override
+       public DataCharacteristics setDims(long[] dims) {
+               throw new UnsupportedOperationException();
+       }
+
+       @Override
+       public long getNumBlocks(int i) {
+               throw new UnsupportedOperationException();
+       }
 }
diff --git 
a/src/main/java/org/apache/sysds/runtime/meta/TensorCharacteristics.java 
b/src/main/java/org/apache/sysds/runtime/meta/TensorCharacteristics.java
index 20e11d955f..42b34d8c28 100644
--- a/src/main/java/org/apache/sysds/runtime/meta/TensorCharacteristics.java
+++ b/src/main/java/org/apache/sysds/runtime/meta/TensorCharacteristics.java
@@ -190,4 +190,90 @@ public class TensorCharacteristics extends 
DataCharacteristics
                return UtilFunctions.intHashCode(UtilFunctions.intHashCode(
                        Arrays.hashCode(_dims), _blocksize), 
Long.hashCode(_nnz));
        }
+
+       @Override
+       public DataCharacteristics set(long nr, long nc, int blen) {
+               _dims = new long[] {nr, nc};
+               _blocksize = blen;
+               return this;
+       }
+
+       @Override
+       public DataCharacteristics set(long nr, long nc, int blen, long nnz) {
+               set(nr, nc, blen);
+               _nnz = nnz;
+               return this;
+       }
+
+       @Override
+       public DataCharacteristics setRows(long rlen) {
+               _dims[0] = rlen;
+               return this;
+       }
+
+       @Override
+       public DataCharacteristics setCols(long clen) {
+               _dims[1] = clen;
+               return this;
+       }
+
+       @Override
+       public long getNumRowBlocks() {
+               // TODO Auto-generated method stub
+               return 0;
+       }
+
+       @Override
+       public long getNumColBlocks() {
+               // TODO Auto-generated method stub
+               return 0;
+       }
+
+       @Override
+       public DataCharacteristics setDimension(long nr, long nc) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public DataCharacteristics setNonZerosBound(long nnz) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public long getNonZerosBound() {
+               // TODO Auto-generated method stub
+               return 0;
+       }
+
+       @Override
+       public double getSparsity() {
+               // TODO Auto-generated method stub
+               return 0;
+       }
+
+       @Override
+       public boolean rowsKnown() {
+               // TODO Auto-generated method stub
+               return false;
+       }
+
+       @Override
+       public boolean colsKnown() {
+               // TODO Auto-generated method stub
+               return false;
+       }
+
+       @Override
+       public boolean isUltraSparse() {
+               // TODO Auto-generated method stub
+               return false;
+       }
+
+       @Override
+       public boolean mightHaveEmptyBlocks() {
+               // TODO Auto-generated method stub
+               return false;
+       }
 }
diff --git 
a/src/test/java/org/apache/sysds/test/functions/caching/BufferpoolLeakTest.java 
b/src/test/java/org/apache/sysds/test/functions/caching/BufferpoolLeakTest.java
index e652c5c6f6..0eca06730f 100644
--- 
a/src/test/java/org/apache/sysds/test/functions/caching/BufferpoolLeakTest.java
+++ 
b/src/test/java/org/apache/sysds/test/functions/caching/BufferpoolLeakTest.java
@@ -22,6 +22,9 @@ package org.apache.sysds.test.functions.caching;
 import org.junit.Assert;
 import org.junit.Test;
 import org.apache.sysds.runtime.controlprogram.caching.CacheStatistics;
+import org.apache.sysds.runtime.controlprogram.caching.CacheableData;
+import org.apache.sysds.runtime.controlprogram.caching.LazyWriteBuffer;
+import org.apache.sysds.runtime.controlprogram.caching.LazyWriteBuffer.RPolicy;
 import org.apache.sysds.test.AutomatedTestBase;
 import org.apache.sysds.test.TestConfiguration;
 
@@ -38,15 +41,27 @@ public class BufferpoolLeakTest extends AutomatedTestBase
        }
        
        @Test
-       public void testLeak1() {
-               runTestBufferpoolLeak(10000, 15);
+       public void testLeak1_FIFO() {
+               runTestBufferpoolLeak(10000, 15, RPolicy.FIFO, false);
        }
        
-       private void runTestBufferpoolLeak(int rows, int cols) {
+       @Test
+       public void testLeak1_LRU() {
+               runTestBufferpoolLeak(10000, 15, RPolicy.LRU, false);
+       }
+       
+       @Test
+       public void testLeak1_FIFO_Async() {
+               runTestBufferpoolLeak(10000, 15, RPolicy.FIFO, true);
+       }
+       
+       private void runTestBufferpoolLeak(int rows, int cols, RPolicy policy, 
boolean asyncSerialize) {
                TestConfiguration config = getTestConfiguration(TEST_NAME);
                config.addVariable("rows", rows);
                config.addVariable("cols", cols);
                loadTestConfiguration(config);
+               CacheableData.CACHING_BUFFER_POLICY = policy;
+               CacheableData.CACHING_ASYNC_SERIALIZE = asyncSerialize;
                
                String HOME = SCRIPT_DIR + TEST_DIR;
                fullDMLScriptName = HOME + TEST_NAME + ".dml";
@@ -55,6 +70,7 @@ public class BufferpoolLeakTest extends AutomatedTestBase
                
                //run test and check no evictions
                runTest(true, false, null, -1);
+               LazyWriteBuffer.printStatus("tests");
                Assert.assertEquals(0, CacheStatistics.getFSWrites());
        }
 }
diff --git 
a/src/test/java/org/apache/sysds/test/functions/caching/CachingPWriteExportTest.java
 
b/src/test/java/org/apache/sysds/test/functions/caching/CachingPWriteExportTest.java
index 6ebca6ba3a..3131e5f46d 100644
--- 
a/src/test/java/org/apache/sysds/test/functions/caching/CachingPWriteExportTest.java
+++ 
b/src/test/java/org/apache/sysds/test/functions/caching/CachingPWriteExportTest.java
@@ -19,7 +19,6 @@
 
 package org.apache.sysds.test.functions.caching;
 
-import org.junit.Assert;
 import org.junit.Test;
 import org.apache.sysds.common.Types.FileFormat;
 import org.apache.sysds.hops.Hop;
@@ -28,10 +27,10 @@ import org.apache.sysds.runtime.matrix.data.MatrixBlock;
 import org.apache.sysds.runtime.util.DataConverter;
 import org.apache.sysds.test.AutomatedTestBase;
 import org.apache.sysds.test.TestConfiguration;
+import org.apache.sysds.test.TestUtils;
 
 public class CachingPWriteExportTest extends AutomatedTestBase 
 {
-       
        private final static String TEST_NAME = "export";
        private final static String TEST_DIR = "functions/caching/";
        private final static String TEST_CLASS_DIR = TEST_DIR + 
CachingPWriteExportTest.class.getSimpleName() + "/";
@@ -94,16 +93,12 @@ public class CachingPWriteExportTest extends 
AutomatedTestBase
                                ii, rows, cols, 
OptimizerUtils.DEFAULT_BLOCKSIZE, nnz);
                        Vp = DataConverter.convertToDoubleMatrix(mb);
                }
-               catch(Exception ex)
-               {
+               catch(Exception ex) {
                        ex.printStackTrace();
                        throw new RuntimeException(ex);
                }
                
                //compare
-               for( int i=0; i<rows; i++ )
-                       for( int j=0; j<cols; j++ )
-                               if( V[i][j]!=Vp[i][j] )
-                                       Assert.fail("Wrong value i="+i+", 
j="+j+", value1="+V[i][j]+", value2="+Vp[i][j]);
+               TestUtils.compareMatrices(V, Vp, 1e-14);
        }
 }
\ No newline at end of file
diff --git 
a/src/test/java/org/apache/sysds/test/functions/caching/KeyBufferPoolComponents.java
 
b/src/test/java/org/apache/sysds/test/functions/caching/KeyBufferPoolComponents.java
new file mode 100644
index 0000000000..79b2a6b793
--- /dev/null
+++ 
b/src/test/java/org/apache/sysds/test/functions/caching/KeyBufferPoolComponents.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.sysds.test.functions.caching;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import org.apache.sysds.common.Warnings;
+import org.apache.sysds.runtime.controlprogram.caching.ByteBuffer;
+import org.apache.sysds.runtime.controlprogram.caching.CacheBlockFactory;
+import org.apache.sysds.runtime.controlprogram.caching.CacheDataInput;
+import org.apache.sysds.runtime.controlprogram.caching.CacheDataOutput;
+import org.apache.sysds.runtime.controlprogram.caching.PageCache;
+import org.apache.sysds.runtime.data.TensorBlock;
+import org.apache.sysds.runtime.frame.data.FrameBlock;
+import org.apache.sysds.runtime.matrix.data.MatrixBlock;
+import org.apache.sysds.runtime.util.CommonThreadPool;
+import org.apache.sysds.test.AutomatedTestBase;
+import org.apache.sysds.test.TestUtils;
+
+public class KeyBufferPoolComponents extends AutomatedTestBase 
+{
+       @Override
+       public void setUp() {}
+       
+       @Test
+       public void testDataStreamsDense() {
+               testSerialization(100, 100, 0.7);
+       }
+       
+       @Test
+       public void testDataStreamsSparse() {
+               testSerialization(100, 100, 0.07);
+       }
+       
+       @Test
+       public void testBufferDense() {
+               testBufferSerialization(100, 100, 0.7);
+       }
+       
+       @Test
+       public void testBufferSparse() {
+               testBufferSerialization(100, 100, 0.007);
+       }
+       
+       @Test
+       public void testCacheBlockFactory() {
+               Assert.assertEquals(new MatrixBlock(), 
CacheBlockFactory.newInstance(0));
+               Assert.assertEquals(
+                       new FrameBlock().getInMemorySize(), 
CacheBlockFactory.newInstance(1).getInMemorySize());
+               Assert.assertEquals(
+                       new TensorBlock().getInMemorySize(), 
CacheBlockFactory.newInstance(2).getInMemorySize());
+               Assert.assertThrows(RuntimeException.class, 
()->CacheBlockFactory.newInstance(3));
+               
+               Assert.assertEquals(new MatrixBlock(), 
CacheBlockFactory.newInstance(new MatrixBlock()));
+               Assert.assertEquals(
+                       new FrameBlock().getInMemorySize(), 
CacheBlockFactory.newInstance(new FrameBlock()).getInMemorySize());
+               Assert.assertEquals(
+                       new TensorBlock().getInMemorySize(), 
CacheBlockFactory.newInstance(new TensorBlock()).getInMemorySize());
+               Assert.assertThrows(RuntimeException.class, 
()->CacheBlockFactory.newInstance(null));
+               
+               Assert.assertThrows(RuntimeException.class, 
()->CacheBlockFactory.getCode(null));
+               Assert.assertThrows(RuntimeException.class, 
()->CacheBlockFactory.getPairList(null));
+       }
+       
+       @Test
+       public void testPageCache() {
+               //coverage for classes w/ only static methods
+               new Warnings();
+               new PageCache();
+               
+               PageCache.init();
+               for(int i=7; i<256; i++) {
+                       PageCache.putPage(new byte[i]);
+                       PageCache.putPage(new byte[i]);
+               }
+               int count = 0;
+               for(int i=7; i<256; i++)
+                       count += PageCache.getPage(i)!=null ? 1: 0;
+               System.out.println("Found "+count+" pages for reuse."); //120
+               PageCache.clear();
+       }
+       
+       private void testSerialization(int rows, int cols, double sparsity) {
+               try {
+                       MatrixBlock mb = MatrixBlock.randOperations(rows, cols, 
sparsity);
+                       byte[] barr = new byte[(int)mb.getExactSizeOnDisk()];
+                       CacheDataOutput dos = new CacheDataOutput(barr);
+                       mb.write(dos);
+                       CacheDataInput dis = new CacheDataInput(barr);
+                       MatrixBlock mb2 = new MatrixBlock();
+                       mb2.readFields(dis);
+                       TestUtils.compareMatrices(mb, mb2, 1e-14);
+               } catch (IOException e) {
+                       throw new RuntimeException(e);
+               }
+       }
+       
+       private void testBufferSerialization(int rows, int cols, double 
sparsity) {
+               try {
+                       MatrixBlock mb = MatrixBlock.randOperations(rows, cols, 
sparsity);
+                       ByteBuffer buff = new 
ByteBuffer((int)mb.getExactSizeOnDisk());
+                       Future<?> check = 
CommonThreadPool.get().submit(()->buff.checkSerialized());
+                       buff.serializeBlock(mb);
+                       check.get(); //check non-blocking after serialization
+                       MatrixBlock mb2 = (MatrixBlock) buff.deserializeBlock();
+                       TestUtils.compareMatrices(mb, mb2, 1e-14);
+               } catch (IOException | InterruptedException | 
ExecutionException e) {
+                       throw new RuntimeException(e);
+               }
+       }
+}
diff --git a/src/test/java/org/apache/sysds/test/functions/caching/UMMTest.java 
b/src/test/java/org/apache/sysds/test/functions/caching/UMMTest.java
index 0bb61a83dd..00361f79b1 100644
--- a/src/test/java/org/apache/sysds/test/functions/caching/UMMTest.java
+++ b/src/test/java/org/apache/sysds/test/functions/caching/UMMTest.java
@@ -91,6 +91,8 @@ public class UMMTest extends AutomatedTestBase {
                        // Compare FS write counts (#unified FS writes always 
smaller than #static FS writes)
                        Assert.assertTrue("Violated buffer pool eviction 
counts: "+FSwrites_unified+" <= "+FSwrites_static,
                                FSwrites_unified <= FSwrites_static);
+                       
+                       UnifiedMemoryManager.printStatus("tests");
                }
                finally {
                        Recompiler.reinitRecompiler();


Reply via email to