Changeset 580 for Tests


Ignore:
Timestamp:
08/11/13 20:21:27 (9 years ago)
Author:
BegemoT
Message:

chronos

Location:
Tests/JAVA/test/src/main/java/com/db
Files:
14 added
7 copied

Legend:

Unmodified
Added
Removed
  • Tests/JAVA/test/src/main/java/com/db/chronos/api/Profiler.java

    r572 r580  
    1 package test.threads.metrics.profiler; 
     1package com.db.chronos.api; 
    22 
    33/** 
     
    5151 * </pre> 
    5252 * <p/> 
    53  * You must <b>always</b> finish profiling record with {@link Profiler.Record#now()}, 
    54  * {@link Profiler.Record#atMillis(long)} or {@link Profiler.Record#atNanos(long)} 
     53 * You must <b>always</b> finish profiling record with {@link com.db.chronos.api.Profiler.Record#now()}, 
     54 * {@link com.db.chronos.api.Profiler.Record#atMillis(long)} or {@link com.db.chronos.api.Profiler.Record#atNanos(long)} 
    5555 * -- it is the point there record is actually made visible to reporter. This also means 
    56  * you should call {@link Profiler.Record#now()}/... as soon as possible, as it can 
     56 * you should call {@link com.db.chronos.api.Profiler.Record#now()}/... as soon as possible, as it can 
    5757 * stop pipeline 
    5858 * <p/> 
    59  * You should <b>not</b> store {@link Record} instances for later use. After calling 
    60  * {@link Profiler.Record#now()}/... record should <b>not</b> be read nor modified in 
    61  * any way. 
     59 * You should <b>not</b> store {@linkplain Record} instances for later use. After 
     60 * calling {@linkplain com.db.chronos.api.Profiler.Record#now()}/... record should 
     61 * <b>not</b> be read nor modified in any way. 
    6262 * <p/> 
    6363 * 
     
    6565 *         created 7/3/12 at 6:05 PM 
    6666 */ 
    67 public interface Profiler<ControlPointEnum extends Enum<ControlPointEnum>> { 
     67public interface Profiler { 
    6868 
    69         public Record<ControlPointEnum> event(); 
     69        public Record event(); 
    7070 
    71         public Record<ControlPointEnum> event( final long id ); 
     71        public Record event( final long id ); 
    7272 
    73         public interface Record<ControlPointEnum extends Enum<ControlPointEnum>> { 
     73        public interface Record { 
    7474                public static final int INVALID_EVENT_ID = -1; 
    7575 
    76                 public long id(); 
    7776 
    78                 public Record<ControlPointEnum> tag( final Object tag ); 
     77                public Record derivedFrom( final long parentId ); 
    7978 
    80                 public Record<ControlPointEnum> tags( final Object tag1, 
    81                                                       final Object tag2 ); 
     79                public Record passedBy( final long whereId ); 
    8280 
    83                 public Record<ControlPointEnum> tags( final Object tag1, 
    84                                                       final Object tag2, 
    85                                                       final Object tag3 ); 
     81                public Record withLong( final int index, 
     82                                        final long data ); 
    8683 
    87                 public Record<ControlPointEnum> passedBy( final ControlPointEnum controlPoint ); 
    88  
    89                 /** @return packetId of current record */ 
     84                /** @return eventId of current record */ 
    9085                public long atNanos( final long timeNanos ); 
    9186 
    92                 /** @return packetId of current record */ 
     87                /** @return eventId of current record */ 
    9388                public long atMillis( final long timeMillis ); 
    9489 
    95                 /** @return packetId of current record */ 
     90                /** @return eventId of current record */ 
    9691                public long now(); 
    9792 
  • Tests/JAVA/test/src/main/java/com/db/chronos/api/impl/DemultiplexingBuffer.java

    r572 r580  
    1 package test.threads.demultiplexor; 
     1package com.db.chronos.api.impl; 
    22 
    33import java.util.concurrent.atomic.AtomicLongFieldUpdater; 
  • Tests/JAVA/test/src/main/java/com/db/chronos/api/impl/ProfilerImpl.java

    r572 r580  
    1 package test.threads.metrics.profiler; 
     1package com.db.chronos.api.impl; 
    22 
    33import java.util.concurrent.ScheduledExecutorService; 
     
    66import java.util.concurrent.atomic.AtomicLong; 
    77 
     8import com.db.chronos.api.Profiler; 
    89import gnu.trove.TObjectProcedure; 
    910import org.apache.commons.logging.Log; 
     
    1718 *         created 7/3/12 at 6:12 PM 
    1819 */ 
    19 public class ProfilerImpl<ControlPointEnum extends Enum<ControlPointEnum>> 
    20                 implements Profiler<ControlPointEnum>, RecordImpl.RecordHandler { 
     20public class ProfilerImpl 
     21                implements Profiler, RecordImpl.RecordHandler { 
    2122        private static final Log log = LogFactory.getLog( ProfilerImpl.class ); 
    2223 
    2324        private final AtomicLong idGenerator = new AtomicLong( 0 ); 
    2425 
    25         private final TimingRecordsBuffer<ControlPointEnum> buffer; 
     26        private final TimingRecordsBuffer buffer; 
    2627 
    27         private final Reporter<ControlPointEnum> reporter; 
     28        private final Reporter reporter; 
    2829        private final ScheduledExecutorService scheduler; 
    2930 
     
    3738                             final int maxTagsCount, 
    3839                             final ITimestampSource timestampSource, 
    39                              final Reporter<ControlPointEnum> reporter, 
     40                             final Reporter reporter, 
    4041                             final ScheduledExecutorService scheduler, 
    4142                             final long reportingPeriodInSeconds ) { 
     
    4748                checkArgument( reporter != null, "reporter can't be null" ); 
    4849 
    49                 buffer = new TimingRecordsBuffer<ControlPointEnum>( 
     50                buffer = new TimingRecordsBuffer( 
    5051                                bufferSize, 
    51                                 new RecordImpl.RecordImplFactory<ControlPointEnum>( this, maxTagsCount ) 
     52                                new RecordImpl.RecordImplFactory( this, maxTagsCount ) 
    5253                ); 
    5354                this.maxTagsCount = maxTagsCount; 
     55                //TODO use dedicated thread instead of scheduler, for precise threading model 
     56                //and detailed control over timings 
    5457                this.scheduler = scheduler; 
    5558                this.reporter = reporter; 
     
    6669                                                @Override 
    6770                                                public void run() { 
    68                                                         final Reporter<ControlPointEnum> reporter = ProfilerImpl.this.reporter; 
     71                                                        final Reporter reporter = ProfilerImpl.this.reporter; 
    6972                                                        try { 
    7073                                                                reporter.reportStarting(); 
    71                                                                 buffer.drainTo( new TObjectProcedure<RecordImpl<ControlPointEnum>>() { 
     74                                                                buffer.drainTo( new TObjectProcedure<RecordImpl>() { 
    7275                                                                        @Override 
    73                                                                         public boolean execute( final RecordImpl<ControlPointEnum> record ) { 
     76                                                                        public boolean execute( final RecordImpl record ) { 
    7477                                                                                reporter.append( 
    7578                                                                                                record.id(), 
    76                                                                                                 record.controlPoint, 
    77                                                                                                 record.tags, 
    78                                                                                                 record.tagsCount, 
    79                                                                                                 record.timestampNanos 
     79                                                                                                record.parentId, 
     80                                                                                                record.whereId, 
     81                                                                                                record.timestampNanos, 
     82                                                                                                record.tags 
    8083                                                                                ); 
    8184                                                                                return true; 
     
    105108 
    106109        @Override 
    107         public Record<ControlPointEnum> event() { 
     110        public Record event() { 
    108111                return event( Record.INVALID_EVENT_ID ); 
    109112        } 
    110113 
    111114        @Override 
    112         public Record<ControlPointEnum> event( final long id ) { 
     115        public Record event( final long id ) { 
    113116                return buffer.eventWithID( id ); 
    114117        } 
     
    124127        } 
    125128 
    126         public interface Reporter<ControlPointEnum extends Enum<ControlPointEnum>> { 
     129        public interface Reporter { 
    127130                public void reportStarting(); 
    128131 
    129132                public void append( final long eventId, 
    130                                     final ControlPointEnum passedBy, 
    131                                     final Object[] tags, 
    132                                     final int tagsCount, 
    133                                     final long timestampNanos ); 
     133                                    final long parentId, 
     134                                    final long whereId, 
     135                                    final long timestampNanos, 
     136                                    final long[] tags ); 
    134137 
    135138                public void reportFinished(); 
  • Tests/JAVA/test/src/main/java/com/db/chronos/api/impl/ProfilerMock.java

    r572 r580  
    1 package test.threads.metrics.profiler; 
     1package com.db.chronos.api.impl; 
     2 
     3import com.db.chronos.api.Profiler; 
    24 
    35/** 
    4  * Mock implementation of LatencyProfiler. Do no record any data. 
     6 * Mock implementation of {@linkplain com.db.chronos.api.Profiler}. Do no record any data. 
    57 * 
    68 * @author cherrus 
    79 *         created 7/3/12 at 6:12 PM 
    810 */ 
    9 public class ProfilerMock<ControlPointEnum extends Enum<ControlPointEnum>> implements Profiler<ControlPointEnum> { 
     11public class ProfilerMock implements Profiler { 
    1012 
    1113        public static final ProfilerMock INSTANCE = new ProfilerMock(); 
    1214 
    13         public ProfilerMock() { 
     15        private ProfilerMock() { 
    1416        } 
    1517 
    1618        @Override 
    17         public Record<ControlPointEnum> event() { 
     19        public Record event() { 
    1820                return event( -1 ); 
    1921        } 
    2022 
    2123        @Override 
    22         public Record<ControlPointEnum> event( final long id ) { 
     24        public Record event( final long id ) { 
    2325                return FAKE_RECORD; 
    2426        } 
    2527 
    2628        /** 
    27          * We do not use {@link TimingRecordsBuffer#FAKE_RECORD} 'cos we try to have 
    28          * only one implementation of {@link Record} interface for each {@link Profiler} 
     29         * We do not use {@link test.threads.metrics.profiler.TimingRecordsBuffer#FAKE_RECORD} 'cos we try to have 
     30         * only one implementation of {@link com.db.chronos.api.Profiler.Record} interface for each {@link com.db.chronos.api.Profiler} 
    2931         * implementation. It will be more optimal then only one implementation is 
    3032         * actually in use in one JVM instance, since virtual calls will be monomorphic 
     
    3234         */ 
    3335        private static final Record FAKE_RECORD = new Record() { 
    34                 @Override 
    35                 public long id() { 
    36                         return INVALID_EVENT_ID; 
    37                 } 
    3836 
    3937                @Override 
    40                 public Record tag( final Object tag ) { 
     38                public Record derivedFrom( final long parentId ) { 
    4139                        return this; 
    4240                } 
    4341 
    4442                @Override 
    45                 public Record tags( final Object tag1, 
    46                                     final Object tag2 ) { 
     43                public Record passedBy( final long whereId ) { 
    4744                        return this; 
    4845                } 
    4946 
    5047                @Override 
    51                 public Record tags( final Object tag1, 
    52                                     final Object tag2, 
    53                                     final Object tag3 ) { 
    54                         return this; 
    55                 } 
    56  
    57                 @Override 
    58                 public Record passedBy( final Enum controlPoint ) { 
     48                public Record withLong( final int index, 
     49                                        final long data ) { 
    5950                        return this; 
    6051                } 
     
    6253                @Override 
    6354                public long atNanos( final long timeNanos ) { 
    64                         return id(); 
     55                        return INVALID_EVENT_ID; 
    6556                } 
    6657 
    6758                @Override 
    6859                public long atMillis( final long timeMillis ) { 
    69                         return id(); 
     60                        return INVALID_EVENT_ID; 
    7061                } 
    7162 
    7263                @Override 
    7364                public long now() { 
    74                         return id(); 
     65                        return INVALID_EVENT_ID; 
    7566                } 
    7667 
  • Tests/JAVA/test/src/main/java/com/db/chronos/api/impl/ProfilerSpringBean.java

    r572 r580  
    1 package test.threads.metrics.profiler; 
     1package com.db.chronos.api.impl; 
    22 
    33import java.util.concurrent.ScheduledExecutorService; 
    44 
     5import com.db.chronos.api.Profiler; 
    56import org.springframework.beans.factory.config.AbstractFactoryBean; 
    67import test.threads.metrics.timesource.ITimestampSource; 
     
    1112 
    1213/** 
    13  * Spring factory bean for simplifying spring-based configuration of {@link Profiler} 
     14 * Spring factory bean for simplifying spring-based configuration of {@link com.db.chronos.api.Profiler} 
    1415 * instances 
    1516 * 
     
    3233        ); 
    3334 
    34         private volatile ProfilerImpl.Reporter reporter = new SimpleLatencyReporter( 
    35                         LatencyControlPoints.class 
    36         ); 
    37  
     35        private volatile ProfilerImpl.Reporter reporter = null; 
    3836 
    3937        @Override 
     
    5351 
    5452        @Override 
    55         protected Object createInstance() throws Exception { 
     53        protected Profiler createInstance() throws Exception { 
    5654                if( enable ) { 
    5755                        checkState( bufferSize > 0, "bufferSize(%s) must be > 0", bufferSize ); 
  • Tests/JAVA/test/src/main/java/com/db/chronos/api/impl/RecordImpl.java

    r572 r580  
    1 package test.threads.metrics.profiler; 
     1package com.db.chronos.api.impl; 
    22 
    33import java.util.*; 
     
    55import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; 
    66 
     7import com.db.chronos.api.Profiler; 
    78import com.google.common.base.Supplier; 
    89import test.threads.metrics.timesource.ITimestampSource; 
     
    1415 *         created 7/4/12 at 5:44 PM 
    1516 */ 
    16 class RecordImpl<ControlPointEnum extends Enum<ControlPointEnum>> implements Profiler.Record<ControlPointEnum> { 
     17class RecordImpl implements Profiler.Record { 
    1718        private static final AtomicIntegerFieldUpdater<RecordImpl> doneUpdater = AtomicIntegerFieldUpdater.newUpdater( 
    1819                        RecordImpl.class, 
     
    2021        ); 
    2122 
    22         private static final Object[] EMPTY_ARRAY = new Object[0]; 
     23        private static final long[] EMPTY_ARRAY = new long[0]; 
    2324 
    2425        private static final int DONE = 1; 
     
    2829 
    2930        protected long eventId = -1; 
    30  
     31        protected long parentId = -1; 
     32        protected long whereId = -1; 
    3133        protected long timestampNanos = -1; 
    3234 
    33         protected final Object[] tags; 
    34         protected int tagsCount = 0; 
    35  
    36         protected ControlPointEnum controlPoint; 
     35        protected final long[] tags; 
    3736 
    3837        private volatile int done = 0; 
     
    4342                this.handler = handler; 
    4443                if( tagsCount > 0 ) { 
    45                         tags = new Object[tagsCount]; 
     44                        tags = new long[tagsCount]; 
    4645                } else { 
    4746                        tags = EMPTY_ARRAY; 
     
    5756        } 
    5857 
    59         @Override 
    6058        public long id() { 
    6159                if( isValid() ) { 
     
    6765 
    6866        @Override 
    69         public RecordImpl<ControlPointEnum> tag( final Object tag ) { 
     67        public Profiler.Record derivedFrom( final long parentId ) { 
    7068                if( isValid() ) { 
    71                         if( tagsCount < tags.length ) { 
    72                                 tags[tagsCount] = tag; 
    73                                 tagsCount++; 
    74                         } else { 
    75                                 //TODO RC minor: log.debug("...") 
    76                         } 
     69                        this.parentId = parentId; 
    7770                } 
    7871                return this; 
     
    8073 
    8174        @Override 
    82         public RecordImpl<ControlPointEnum> tags( final Object tag1, 
    83                                                   final Object tag2 ) { 
    84                 return tag( tag1 ) 
    85                                 .tag( tag2 ); 
     75        public Profiler.Record passedBy( final long whereId ) { 
     76                if( isValid() ) { 
     77                        this.whereId = whereId; 
     78                } 
     79                return this; 
    8680        } 
    8781 
    8882        @Override 
    89         public RecordImpl<ControlPointEnum> tags( final Object tag1, 
    90                                                   final Object tag2, 
    91                                                   final Object tag3 ) { 
    92                 return tag( tag1 ) 
    93                                 .tag( tag2 ) 
    94                                 .tag( tag3 ); 
    95         } 
    96  
    97         @Override 
    98         public RecordImpl<ControlPointEnum> passedBy( final ControlPointEnum controlPoint ) { 
     83        public Profiler.Record withLong( final int index, 
     84                                         final long data ) { 
    9985                if( isValid() ) { 
    100                         this.controlPoint = controlPoint; 
     86                        this.tags[index] = data; 
    10187                } 
    10288                return this; 
    10389        } 
     90 
    10491 
    10592        @Override 
     
    124111 
    125112        protected void reset() { 
    126                 tagsCount = 0; 
    127                 Arrays.fill( tags, null );//for GC? 
     113                eventId = INVALID_EVENT_ID; 
     114                Arrays.fill( tags, 0 ); 
    128115 
    129116                doneUpdater.lazySet( this, NOT_DONE ); 
     
    143130        @Override 
    144131        public boolean isValid() { 
    145                 //TODO RC: use handler==null instead of eventId == -1, 
    146                 //TODO RC: and use eventId==-1 as flag "ID needs to be generated on .end()" 
    147 //              return eventId != INVALID_EVENT_ID; 
    148132                return handler != null; 
    149133        } 
     
    156140        public String toString() { 
    157141                return String.format( 
    158                                 "%s[#%d @ %d ns; %s : %s, done:%b ]", 
     142                                "%s[#%d @%d (%d) at %d ns; {%s}, done:%b]", 
    159143                                getClass().getSimpleName(), 
    160144                                id(), 
     145                                whereId, 
     146                                parentId, 
    161147                                timestampNanos, 
    162148                                Arrays.toString( tags ), 
    163                                 controlPoint, 
    164149                                isDone() 
    165150                ); 
    166151        } 
    167152 
    168         public static class RecordImplFactory<CPE extends Enum<CPE>> implements Supplier<RecordImpl<CPE>> { 
     153        public static class RecordImplFactory implements Supplier<RecordImpl> { 
    169154 
    170155                private final int maxTagsCount; 
     
    180165 
    181166                @Override 
    182                 public RecordImpl<CPE> get() { 
    183                         return new RecordImpl<CPE>( handler, maxTagsCount ); 
     167                public RecordImpl get() { 
     168                        return new RecordImpl( handler, maxTagsCount ); 
    184169                } 
    185170        } 
  • Tests/JAVA/test/src/main/java/com/db/chronos/api/impl/TimingRecordsBuffer.java

    r572 r580  
    1 package test.threads.metrics.profiler; 
     1package com.db.chronos.api.impl; 
    22 
    33import com.google.common.base.Supplier; 
     
    88 
    99/** 
    10  * Wrap {@link DemultiplexingBuffer}, and adds: 
     10 * Wrap {@link test.threads.demultiplexor.DemultiplexingBuffer}, and adds: 
    1111 * <ol> 
    12  * <li>"done" flag management: {@link RecordImpl} does have volatile .done field, 
    13  * which is set to true on {@link Profiler.Record#now()} 
     12 * <li>"done" flag management: {@link test.threads.metrics.profiler.RecordImpl} does have volatile .done field, 
     13 * which is set to true on {@link com.db.chronos.api.Profiler.Record#now()} 
    1414 * and resetted in {@link #drainTo(gnu.trove.TObjectProcedure)} 
    1515 * </li> 
     
    2222 *         created 7/3/12 at 6:12 PM 
    2323 */ 
    24 class TimingRecordsBuffer<ControlPointEnum extends Enum<ControlPointEnum>> { 
     24class TimingRecordsBuffer { 
    2525 
    2626        protected static final RecordImpl FAKE_RECORD = RecordImpl.createInvalid(); 
    2727 
    28         private final DemultiplexingBuffer<RecordImpl<ControlPointEnum>> buffer; 
     28        private final DemultiplexingBuffer<RecordImpl> buffer; 
    2929 
    3030        public TimingRecordsBuffer( final int bufferSize, 
    31                                     final Supplier<RecordImpl<ControlPointEnum>> recordFactory ) { 
     31                                    final Supplier<RecordImpl> recordFactory ) { 
    3232                checkArgument( bufferSize > 0, "bufferSize(%s) must be >0", bufferSize ); 
    33                 buffer = new DemultiplexingBuffer<RecordImpl<ControlPointEnum>>( 
     33                buffer = new DemultiplexingBuffer<RecordImpl>( 
    3434                                bufferSize, 
    3535                                recordFactory 
     
    3737        } 
    3838 
    39         public void drainTo( final TObjectProcedure<RecordImpl<ControlPointEnum>> processor ) { 
     39        public void drainTo( final TObjectProcedure<RecordImpl> processor ) { 
    4040                checkArgument( processor != null, "processor can't be null" ); 
    4141                buffer.drainTo( 
    42                                 new TObjectProcedure<RecordImpl<ControlPointEnum>>() { 
     42                                new TObjectProcedure<RecordImpl>() { 
    4343                                        @Override 
    44                                         public boolean execute( final RecordImpl<ControlPointEnum> record ) { 
     44                                        public boolean execute( final RecordImpl record ) { 
    4545                                                if( !record.isDone() ) { 
    4646                                                        return false; 
     
    5757 
    5858 
    59         public RecordImpl<ControlPointEnum> eventWithID( final long id ) { 
    60                 final RecordImpl<ControlPointEnum> record = buffer.nextAvailable(); 
     59        public RecordImpl eventWithID( final long id ) { 
     60                final RecordImpl record = buffer.nextAvailable(); 
    6161                if( record == null ) { 
    6262                        return FAKE_RECORD; 
Note: See TracChangeset for help on using the changeset viewer.