I have 5-7 stack dumps from 2 different runs that I captured using jstack.
Here is an interesting (in that there are 2 blocked threads) example - I have many more, and can create many more as needed - I was running a 4 thread test corresponding to the # of cores on my system. I ran another test with 25 threads, pretty much all of the blocked threads were happening as below in org.apache.lucene.index.TermInfosReader.ensureIndexIsRead(). -Dave --- Thread 7001: (state = IN_JAVA) - java.lang.String.<init>(char[], int, int) @bci=60, line=209 (Compiled frame; information may be imprecise) - org.apache.lucene.index.SegmentTermDocs.seek(org.apache.lucene.index.Term) @bci=8, line=50 (Compiled frame) - org.apache.lucene.index.MultiTermDocs.next() @bci=59, line=348 (Compiled frame) - org.apache.lucene.index.MultiTermDocs.next() @bci=66, line=349 (Compiled frame) - org.apache.lucene.index.MultiTermDocs.next() @bci=66, line=349 (Compiled frame) - org.apache.lucene.index.MultiTermDocs.next() @bci=66, line=349 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.RangeQuery$RangeQueryScorer.calculateHits() @bci=510, line=452 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.RangeQuery$RangeQueryScorer.next() @bci=1, line=330 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.init(boolean) @bci=82, line=97 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.next() @bci=9, line=47 (Compiled frame) - org.apache.lucene.search.BooleanScorer2.next() @bci=15, line=322 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.init(boolean) @bci=82, line=97 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.next() @bci=9, line=47 (Compiled frame) - org.apache.lucene.search.BooleanScorer2.next() @bci=15, line=322 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.init(boolean) @bci=82, line=97 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.next() @bci=9, line=47 (Compiled frame) - org.apache.lucene.search.BooleanScorer2.score( org.apache.lucene.search.HitCollector) @bci=15, line=290 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.DescendantSelfAxisQuery$DescendantSelfAxisScorer.calculateSubHits() @bci=53, line=324 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.DescendantSelfAxisQuery$DescendantSelfAxisScorer.next() @bci=1, line=254 (Compiled frame) - org.apache.lucene.search.Scorer.score( org.apache.lucene.search.HitCollector) @bci=1, line=47 (Compiled frame) - org.apache.lucene.search.IndexSearcher.search( org.apache.lucene.search.Weight, org.apache.lucene.search.Filter, org.apache.lucene.search.HitCollector) @bci=52, line=132 (Compiled frame) - org.apache.lucene.search.IndexSearcher.search( org.apache.lucene.search.Weight, org.apache.lucene.search.Filter, int, org.apache.lucene.search.Sort) @bci=21, line=110 (Interpreted frame) - org.apache.lucene.search.Hits.getMoreDocs(int) @bci=66, line=65 (Compiled frame) - org.apache.lucene.search.Hits.<init>(org.apache.lucene.search.Searcher, org.apache.lucene.search.Query, org.apache.lucene.search.Filter, org.apache.lucene.search.Sort) @bci=65, line=52 (Interpreted frame) - org.apache.lucene.search.Searcher.search(org.apache.lucene.search.Query, org.apache.lucene.search.Sort) @bci=8, line=53 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.SearchIndex.executeQuery( org.apache.jackrabbit.core.query.lucene.QueryImpl, org.apache.lucene.search.Query, org.apache.jackrabbit.name.QName[], boolean[]) @bci=122, line=401 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.LazyQueryResultImpl.executeQuery() @bci=20, line=204 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.LazyQueryResultImpl.getResults(int) @bci=60, line=244 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.LazyQueryResultImpl.<init>( org.apache.jackrabbit.core.query.lucene.SearchIndex, org.apache.jackrabbit.core.ItemManager, org.apache.jackrabbit.name.NamespaceResolver, org.apache.jackrabbit.core.security.AccessManager, org.apache.jackrabbit.core.query.lucene.QueryImpl, org.apache.lucene.search.Query, org.apache.jackrabbit.name.QName[], org.apache.jackrabbit.name.QName[], boolean[], boolean) @bci=113, line=161 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.QueryImpl.execute() @bci=256, line=164 (Interpreted frame) - org.apache.jackrabbit.core.query.QueryImpl.execute() @bci=12, line=142 (Interpreted frame) - org.apache.jackrabbit.rmi.server.ServerQuery.execute() @bci=8, line=59 (Interpreted frame) - sun.reflect.GeneratedMethodAccessor114.invoke(java.lang.Object, java.lang.Object[]) @bci=36 (Interpreted frame) - sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6, line=25 (Compiled frame) - sun.rmi.server.UnicastServerRef.dispatch(java.rmi.Remote, java.rmi.server.RemoteCall) @bci=246, line=294 (Compiled frame) - sun.rmi.transport.Transport$1.run() @bci=23, line=153 (Interpreted frame) - java.security.AccessController.doPrivileged( java.security.PrivilegedExceptionAction, java.security.AccessControlContext) @bci=0 (Interpreted frame) - sun.rmi.transport.Transport.serviceCall(java.rmi.server.RemoteCall) @bci=163, line=149 (Compiled frame) - sun.rmi.transport.tcp.TCPTransport.handleMessages( sun.rmi.transport.Connection, boolean) @bci=185, line=466 (Compiled frame) - sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run() @bci=685, line=707 (Interpreted frame) - java.lang.Thread.run() @bci=11, line=595 (Interpreted frame) Thread 7000: (state = BLOCKED) - org.apache.lucene.index.TermInfosReader.ensureIndexIsRead() @bci=0, line=88 (Compiled frame) - org.apache.lucene.index.TermInfosReader.get(org.apache.lucene.index.Term) @bci=12, line=136 (Compiled frame) - org.apache.lucene.index.SegmentTermDocs.seek(org.apache.lucene.index.Term) @bci=8, line=50 (Compiled frame) - org.apache.lucene.index.MultiTermDocs.next() @bci=66, line=349 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.RangeQuery$RangeQueryScorer.calculateHits() @bci=510, line=452 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.RangeQuery$RangeQueryScorer.next() @bci=1, line=330 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.init(boolean) @bci=82, line=97 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.next() @bci=9, line=47 (Compiled frame) - org.apache.lucene.search.BooleanScorer2.next() @bci=15, line=322 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.init(boolean) @bci=82, line=97 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.next() @bci=9, line=47 (Compiled frame) - org.apache.lucene.search.BooleanScorer2.next() @bci=15, line=322 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.init(boolean) @bci=82, line=97 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.next() @bci=9, line=47 (Compiled frame) - org.apache.lucene.search.BooleanScorer2.score( org.apache.lucene.search.HitCollector) @bci=15, line=290 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.DescendantSelfAxisQuery$DescendantSelfAxisScorer.calculateSubHits() @bci=53, line=324 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.DescendantSelfAxisQuery$DescendantSelfAxisScorer.next() @bci=1, line=254 (Compiled frame) - org.apache.lucene.search.Scorer.score( org.apache.lucene.search.HitCollector) @bci=1, line=47 (Compiled frame) - org.apache.lucene.search.IndexSearcher.search( org.apache.lucene.search.Weight, org.apache.lucene.search.Filter, org.apache.lucene.search.HitCollector) @bci=52, line=132 (Compiled frame) - org.apache.lucene.search.IndexSearcher.search( org.apache.lucene.search.Weight, org.apache.lucene.search.Filter, int, org.apache.lucene.search.Sort) @bci=21, line=110 (Interpreted frame) - org.apache.lucene.search.Hits.getMoreDocs(int) @bci=66, line=65 (Compiled frame) - org.apache.lucene.search.Hits.<init>(org.apache.lucene.search.Searcher, org.apache.lucene.search.Query, org.apache.lucene.search.Filter, org.apache.lucene.search.Sort) @bci=65, line=52 (Interpreted frame) - org.apache.lucene.search.Searcher.search(org.apache.lucene.search.Query, org.apache.lucene.search.Sort) @bci=8, line=53 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.SearchIndex.executeQuery( org.apache.jackrabbit.core.query.lucene.QueryImpl, org.apache.lucene.search.Query, org.apache.jackrabbit.name.QName[], boolean[]) @bci=122, line=401 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.LazyQueryResultImpl.executeQuery() @bci=20, line=204 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.LazyQueryResultImpl.getResults(int) @bci=60, line=244 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.LazyQueryResultImpl.<init>( org.apache.jackrabbit.core.query.lucene.SearchIndex, org.apache.jackrabbit.core.ItemManager, org.apache.jackrabbit.name.NamespaceResolver, org.apache.jackrabbit.core.security.AccessManager, org.apache.jackrabbit.core.query.lucene.QueryImpl, org.apache.lucene.search.Query, org.apache.jackrabbit.name.QName[], org.apache.jackrabbit.name.QName[], boolean[], boolean) @bci=113, line=161 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.QueryImpl.execute() @bci=256, line=164 (Interpreted frame) - org.apache.jackrabbit.core.query.QueryImpl.execute() @bci=12, line=142 (Interpreted frame) - org.apache.jackrabbit.rmi.server.ServerQuery.execute() @bci=8, line=59 (Interpreted frame) - sun.reflect.GeneratedMethodAccessor114.invoke(java.lang.Object, java.lang.Object[]) @bci=36 (Interpreted frame) - sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6, line=25 (Compiled frame) - sun.rmi.server.UnicastServerRef.dispatch(java.rmi.Remote, java.rmi.server.RemoteCall) @bci=246, line=294 (Compiled frame) - sun.rmi.transport.Transport$1.run() @bci=23, line=153 (Interpreted frame) - java.security.AccessController.doPrivileged( java.security.PrivilegedExceptionAction, java.security.AccessControlContext) @bci=0 (Interpreted frame) - sun.rmi.transport.Transport.serviceCall(java.rmi.server.RemoteCall) @bci=163, line=149 (Compiled frame) - sun.rmi.transport.tcp.TCPTransport.handleMessages( sun.rmi.transport.Connection, boolean) @bci=185, line=466 (Compiled frame) - sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run() @bci=685, line=707 (Interpreted frame) - java.lang.Thread.run() @bci=11, line=595 (Interpreted frame) Thread 6999: (state = BLOCKED) - org.apache.lucene.index.TermInfosReader.ensureIndexIsRead() @bci=0, line=88 (Compiled frame) - org.apache.lucene.index.TermInfosReader.get(org.apache.lucene.index.Term) @bci=12, line=136 (Compiled frame) - org.apache.lucene.index.SegmentTermDocs.seek(org.apache.lucene.index.Term) @bci=8, line=50 (Compiled frame) - org.apache.lucene.index.MultiTermDocs.next() @bci=66, line=349 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.RangeQuery$RangeQueryScorer.calculateHits() @bci=510, line=452 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.RangeQuery$RangeQueryScorer.next() @bci=1, line=330 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.init(boolean) @bci=82, line=97 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.next() @bci=9, line=47 (Compiled frame) - org.apache.lucene.search.BooleanScorer2.next() @bci=15, line=322 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.init(boolean) @bci=82, line=97 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.next() @bci=9, line=47 (Compiled frame) - org.apache.lucene.search.BooleanScorer2.next() @bci=15, line=322 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.init(boolean) @bci=82, line=97 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.next() @bci=9, line=47 (Compiled frame) - org.apache.lucene.search.BooleanScorer2.score( org.apache.lucene.search.HitCollector) @bci=15, line=290 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.DescendantSelfAxisQuery$DescendantSelfAxisScorer.calculateSubHits() @bci=53, line=324 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.DescendantSelfAxisQuery$DescendantSelfAxisScorer.next() @bci=1, line=254 (Compiled frame) - org.apache.lucene.search.Scorer.score( org.apache.lucene.search.HitCollector) @bci=1, line=47 (Compiled frame) - org.apache.lucene.search.IndexSearcher.search( org.apache.lucene.search.Weight, org.apache.lucene.search.Filter, org.apache.lucene.search.HitCollector) @bci=52, line=132 (Compiled frame) - org.apache.lucene.search.IndexSearcher.search( org.apache.lucene.search.Weight, org.apache.lucene.search.Filter, int, org.apache.lucene.search.Sort) @bci=21, line=110 (Interpreted frame) - org.apache.lucene.search.Hits.getMoreDocs(int) @bci=66, line=65 (Compiled frame) - org.apache.lucene.search.Hits.<init>(org.apache.lucene.search.Searcher, org.apache.lucene.search.Query, org.apache.lucene.search.Filter, org.apache.lucene.search.Sort) @bci=65, line=52 (Interpreted frame) - org.apache.lucene.search.Searcher.search(org.apache.lucene.search.Query, org.apache.lucene.search.Sort) @bci=8, line=53 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.SearchIndex.executeQuery( org.apache.jackrabbit.core.query.lucene.QueryImpl, org.apache.lucene.search.Query, org.apache.jackrabbit.name.QName[], boolean[]) @bci=122, line=401 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.LazyQueryResultImpl.executeQuery() @bci=20, line=204 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.LazyQueryResultImpl.getResults(int) @bci=60, line=244 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.LazyQueryResultImpl.<init>( org.apache.jackrabbit.core.query.lucene.SearchIndex, org.apache.jackrabbit.core.ItemManager, org.apache.jackrabbit.name.NamespaceResolver, org.apache.jackrabbit.core.security.AccessManager, org.apache.jackrabbit.core.query.lucene.QueryImpl, org.apache.lucene.search.Query, org.apache.jackrabbit.name.QName[], org.apache.jackrabbit.name.QName[], boolean[], boolean) @bci=113, line=161 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.QueryImpl.execute() @bci=256, line=164 (Interpreted frame) - org.apache.jackrabbit.core.query.QueryImpl.execute() @bci=12, line=142 (Interpreted frame) - org.apache.jackrabbit.rmi.server.ServerQuery.execute() @bci=8, line=59 (Interpreted frame) - sun.reflect.GeneratedMethodAccessor114.invoke(java.lang.Object, java.lang.Object[]) @bci=36 (Interpreted frame) - sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6, line=25 (Compiled frame) - sun.rmi.server.UnicastServerRef.dispatch(java.rmi.Remote, java.rmi.server.RemoteCall) @bci=246, line=294 (Compiled frame) - sun.rmi.transport.Transport$1.run() @bci=23, line=153 (Interpreted frame) - java.security.AccessController.doPrivileged( java.security.PrivilegedExceptionAction, java.security.AccessControlContext) @bci=0 (Interpreted frame) - sun.rmi.transport.Transport.serviceCall(java.rmi.server.RemoteCall) @bci=163, line=149 (Compiled frame) - sun.rmi.transport.tcp.TCPTransport.handleMessages( sun.rmi.transport.Connection, boolean) @bci=185, line=466 (Compiled frame) - sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run() @bci=685, line=707 (Interpreted frame) - java.lang.Thread.run() @bci=11, line=595 (Interpreted frame) Thread 6997: (state = IN_VM) - org.apache.lucene.index.TermInfosReader.ensureIndexIsRead() @bci=0, line=88 (Compiled frame) - org.apache.lucene.index.TermInfosReader.get(org.apache.lucene.index.Term) @bci=12, line=136 (Compiled frame) - org.apache.lucene.index.SegmentTermDocs.seek(org.apache.lucene.index.Term) @bci=8, line=50 (Compiled frame) - org.apache.lucene.index.MultiTermDocs.next() @bci=59, line=348 (Compiled frame) - org.apache.lucene.index.MultiTermDocs.next() @bci=66, line=349 (Compiled frame) - org.apache.lucene.index.MultiTermDocs.next() @bci=66, line=349 (Compiled frame) - org.apache.lucene.index.MultiTermDocs.next() @bci=66, line=349 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.RangeQuery$RangeQueryScorer.calculateHits() @bci=510, line=452 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.RangeQuery$RangeQueryScorer.next() @bci=1, line=330 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.init(boolean) @bci=82, line=97 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.next() @bci=9, line=47 (Compiled frame) - org.apache.lucene.search.BooleanScorer2.next() @bci=15, line=322 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.init(boolean) @bci=82, line=97 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.next() @bci=9, line=47 (Compiled frame) - org.apache.lucene.search.BooleanScorer2.next() @bci=15, line=322 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.init(boolean) @bci=82, line=97 (Compiled frame) - org.apache.lucene.search.ConjunctionScorer.next() @bci=9, line=47 (Compiled frame) - org.apache.lucene.search.BooleanScorer2.score( org.apache.lucene.search.HitCollector) @bci=15, line=290 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.DescendantSelfAxisQuery$DescendantSelfAxisScorer.calculateSubHits() @bci=53, line=324 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.DescendantSelfAxisQuery$DescendantSelfAxisScorer.next() @bci=1, line=254 (Compiled frame) - org.apache.lucene.search.Scorer.score( org.apache.lucene.search.HitCollector) @bci=1, line=47 (Compiled frame) - org.apache.lucene.search.IndexSearcher.search( org.apache.lucene.search.Weight, org.apache.lucene.search.Filter, org.apache.lucene.search.HitCollector) @bci=52, line=132 (Compiled frame) - org.apache.lucene.search.IndexSearcher.search( org.apache.lucene.search.Weight, org.apache.lucene.search.Filter, int, org.apache.lucene.search.Sort) @bci=21, line=110 (Interpreted frame) - org.apache.lucene.search.Hits.getMoreDocs(int) @bci=66, line=65 (Compiled frame) - org.apache.lucene.search.Hits.<init>(org.apache.lucene.search.Searcher, org.apache.lucene.search.Query, org.apache.lucene.search.Filter, org.apache.lucene.search.Sort) @bci=65, line=52 (Interpreted frame) - org.apache.lucene.search.Searcher.search(org.apache.lucene.search.Query, org.apache.lucene.search.Sort) @bci=8, line=53 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.SearchIndex.executeQuery( org.apache.jackrabbit.core.query.lucene.QueryImpl, org.apache.lucene.search.Query, org.apache.jackrabbit.name.QName[], boolean[]) @bci=122, line=401 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.LazyQueryResultImpl.executeQuery() @bci=20, line=204 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.LazyQueryResultImpl.getResults(int) @bci=60, line=244 (Compiled frame) - org.apache.jackrabbit.core.query.lucene.LazyQueryResultImpl.<init>( org.apache.jackrabbit.core.query.lucene.SearchIndex, org.apache.jackrabbit.core.ItemManager, org.apache.jackrabbit.name.NamespaceResolver, org.apache.jackrabbit.core.security.AccessManager, org.apache.jackrabbit.core.query.lucene.QueryImpl, org.apache.lucene.search.Query, org.apache.jackrabbit.name.QName[], org.apache.jackrabbit.name.QName[], boolean[], boolean) @bci=113, line=161 (Interpreted frame) - org.apache.jackrabbit.core.query.lucene.QueryImpl.execute() @bci=256, line=164 (Interpreted frame) - org.apache.jackrabbit.core.query.QueryImpl.execute() @bci=12, line=142 (Interpreted frame) - org.apache.jackrabbit.rmi.server.ServerQuery.execute() @bci=8, line=59 (Interpreted frame) - sun.reflect.GeneratedMethodAccessor114.invoke(java.lang.Object, java.lang.Object[]) @bci=36 (Interpreted frame) - sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6, line=25 (Compiled frame) - sun.rmi.server.UnicastServerRef.dispatch(java.rmi.Remote, java.rmi.server.RemoteCall) @bci=246, line=294 (Compiled frame) - sun.rmi.transport.Transport$1.run() @bci=23, line=153 (Interpreted frame) - java.security.AccessController.doPrivileged( java.security.PrivilegedExceptionAction, java.security.AccessControlContext) @bci=0 (Interpreted frame) - sun.rmi.transport.Transport.serviceCall(java.rmi.server.RemoteCall) @bci=163, line=149 (Compiled frame) - sun.rmi.transport.tcp.TCPTransport.handleMessages( sun.rmi.transport.Connection, boolean) @bci=185, line=466 (Compiled frame) - sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run() @bci=685, line=707 (Interpreted frame) - java.lang.Thread.run() @bci=11, line=595 (Interpreted frame) On 3/14/07, Jukka Zitting <[EMAIL PROTECTED]> wrote:
Hi, On 3/14/07, Marcel Reutegger <[EMAIL PROTECTED]> wrote: > it's not fully synchronized, queries do run in parallel, which can be seen in > Davids results. but at a lower level, probably in lucene, some part of the query > execution is synchronized. Other potential issues are, as already suggested, the PreparedStatement synchronization blocks in DatabasePersistenceManager. Having some thread dumps would definitely help. BR, Jukka Zitting
