Skip to content

Commit

Permalink
MONDRIAN: Fix for #1932920, use the same lock in both the RolapCubeHi…
Browse files Browse the repository at this point in the history
…erarchy and in the SqlTupleReader. This fix still needs to be verified.

[git-p4: depot-paths = "//open/mondrian/": change = 10922]
  • Loading branch information
Will Gorman committed Apr 19, 2008
1 parent 0d7fc9f commit 539cb54
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 6 deletions.
19 changes: 16 additions & 3 deletions src/main/mondrian/rolap/RolapCubeHierarchy.java
Expand Up @@ -397,7 +397,9 @@ public RolapCubeHierarchyMemberReader() {
new RolapCubeSqlMemberSource(
this,
RolapCubeHierarchy.this,
rolapCubeCacheHelper);
rolapCubeCacheHelper,
cacheHelper
);

cubeSource.setCache(getMemberCache());
}
Expand Down Expand Up @@ -731,15 +733,18 @@ public static class RolapCubeSqlMemberSource extends SqlMemberSource {

private final RolapCubeHierarchyMemberReader memberReader;
private final MemberCacheHelper memberSourceCacheHelper;

private final Object memberCacheLock;

public RolapCubeSqlMemberSource(
RolapCubeHierarchyMemberReader memberReader,
RolapCubeHierarchy hierarchy,
MemberCacheHelper memberSourceCacheHelper)
MemberCacheHelper memberSourceCacheHelper,
Object memberCacheLock)
{
super(hierarchy);
this.memberReader = memberReader;
this.memberSourceCacheHelper = memberSourceCacheHelper;
this.memberCacheLock = memberCacheLock;
}

public RolapMember makeMember(
Expand Down Expand Up @@ -770,6 +775,14 @@ public MemberCache getMemberCache() {
// this is a special cache used solely for rolapcubemembers
return memberSourceCacheHelper;
}

/**
* use the same lock in the RolapCubeMemberSource as the
* RolapCubeHiearchyMemberReader to avoid deadlocks
*/
public Object getMemberCacheLock() {
return memberCacheLock;
}
}
}

Expand Down
4 changes: 4 additions & 0 deletions src/main/mondrian/rolap/SqlMemberSource.java
Expand Up @@ -456,6 +456,10 @@ private List<RolapMember> getMembersInLevel(
public MemberCache getMemberCache() {
return cache;
}

public Object getMemberCacheLock() {
return cache;
}

// implement MemberSource
public List<RolapMember> getRootMembers() {
Expand Down
8 changes: 5 additions & 3 deletions src/main/mondrian/rolap/SqlTupleReader.java
Expand Up @@ -71,7 +71,8 @@ public class SqlTupleReader implements TupleReader {
private class Target {
final RolapLevel level;
final MemberCache cache;

final Object cacheLock;

RolapLevel[] levels;
List<RolapMember> list;
int levelDepth;
Expand All @@ -91,6 +92,7 @@ public Target(
RolapMember[] srcMembers) {
this.level = level;
this.cache = memberBuilder.getMemberCache();
this.cacheLock = memberBuilder.getMemberCacheLock();
this.memberBuilder = memberBuilder;
this.srcMembers = srcMembers;
}
Expand All @@ -117,7 +119,7 @@ public void open() {
* @throws SQLException
*/
public int addRow(ResultSet resultSet, int column) throws SQLException {
synchronized (cache) {
synchronized (cacheLock) {
return internalAddRow(resultSet, column);
}
}
Expand Down Expand Up @@ -208,7 +210,7 @@ private int internalAddRow(ResultSet resultSet, int column) throws SQLException
}

public List<RolapMember> close() {
synchronized (cache) {
synchronized (cacheLock) {
return internalClose();
}
}
Expand Down
7 changes: 7 additions & 0 deletions src/main/mondrian/rolap/TupleReader.java
Expand Up @@ -38,6 +38,13 @@ public interface MemberBuilder {
*/
MemberCache getMemberCache();

/**
* Returns the object which acts as the member cache
* synchronization lock.
*/
Object getMemberCacheLock();


/**
* Creates a new member (together with its properties).
* @see SqlMemberSource#makeMember(RolapMember, RolapLevel, Object, Object, boolean, ResultSet, Object, int)
Expand Down

0 comments on commit 539cb54

Please sign in to comment.