Skip to content

Commit 080433e

Browse files
committed
Added a Service interface to allow the Memory service to provide caching infrastructure for the store without the store binding to the memory service
1 parent 94db546 commit 080433e

18 files changed

+127
-38
lines changed

src/main/java/org/sakaiproject/nakamura/lite/accesscontrol/CacheHolder.java renamed to src/main/java/org/sakaiproject/nakamura/api/lite/CacheHolder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* KIND, either express or implied. See the License for the
1616
* specific language governing permissions and limitations under the License.
1717
*/
18-
package org.sakaiproject.nakamura.lite.accesscontrol;
18+
package org.sakaiproject.nakamura.api.lite;
1919

2020
import java.util.Map;
2121

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.sakaiproject.nakamura.api.lite;
2+
3+
import java.util.Map;
4+
5+
/**
6+
* Provides Cache implementations for all the three areas represented as Maps.
7+
* If an implementation of this interface is present it will be used.
8+
*/
9+
public interface StorageCacheManager {
10+
11+
Map<String, CacheHolder> getAccessControlCache();
12+
13+
Map<String, CacheHolder> getAuthorizableCache();
14+
15+
Map<String, CacheHolder> getContentCache();
16+
17+
}

src/main/java/org/sakaiproject/nakamura/api/lite/StorageClientUtils.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import java.io.IOException;
3636
import java.io.InputStream;
3737
import java.io.UnsupportedEncodingException;
38-
import java.lang.reflect.InvocationTargetException;
3938
import java.lang.reflect.Method;
4039
import java.security.MessageDigest;
4140
import java.security.NoSuchAlgorithmException;

src/main/java/org/sakaiproject/nakamura/lite/CachingManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
*/
1818
package org.sakaiproject.nakamura.lite;
1919

20+
import org.sakaiproject.nakamura.api.lite.CacheHolder;
2021
import org.sakaiproject.nakamura.api.lite.StorageClientException;
21-
import org.sakaiproject.nakamura.lite.accesscontrol.CacheHolder;
2222
import org.sakaiproject.nakamura.lite.storage.StorageClient;
2323
import org.slf4j.Logger;
2424
import org.slf4j.LoggerFactory;

src/main/java/org/sakaiproject/nakamura/lite/RepositoryImpl.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import org.sakaiproject.nakamura.api.lite.accesscontrol.AccessDeniedException;
3232
import org.sakaiproject.nakamura.api.lite.authorizable.User;
3333
import org.sakaiproject.nakamura.lite.accesscontrol.AuthenticatorImpl;
34-
import org.sakaiproject.nakamura.lite.accesscontrol.CacheHolder;
3534
import org.sakaiproject.nakamura.lite.authorizable.AuthorizableActivator;
3635
import org.sakaiproject.nakamura.lite.storage.StorageClient;
3736
import org.sakaiproject.nakamura.lite.storage.StorageClientPool;
@@ -51,7 +50,6 @@ public class RepositoryImpl implements Repository {
5150
@Reference
5251
protected StoreListener storeListener;
5352

54-
private Map<String, CacheHolder> sharedCache;
5553

5654
public RepositoryImpl() {
5755
}
@@ -69,7 +67,6 @@ public void activate(Map<String, Object> properties) throws ClientPoolException,
6967
client.close();
7068
clientPool.getClient();
7169
}
72-
sharedCache = clientPool.getSharedCache();
7370
}
7471

7572
@Deactivate
@@ -106,7 +103,7 @@ private Session openSession(String username, String password) throws StorageClie
106103
if (currentUser == null) {
107104
throw new StorageClientException("User " + username + " cant login with password");
108105
}
109-
return new SessionImpl(this, currentUser, client, configuration, sharedCache, storeListener);
106+
return new SessionImpl(this, currentUser, client, configuration, clientPool.getStorageCacheManager(), storeListener);
110107
} catch (ClientPoolException e) {
111108
clientPool.getClient();
112109
throw e;
@@ -133,7 +130,7 @@ private Session openSession(String username) throws StorageClientException,
133130
throw new StorageClientException("User " + username
134131
+ " does not exist, cant login administratively as this user");
135132
}
136-
return new SessionImpl(this, currentUser, client, configuration, sharedCache, storeListener);
133+
return new SessionImpl(this, currentUser, client, configuration, clientPool.getStorageCacheManager(), storeListener);
137134
} catch (ClientPoolException e) {
138135
clientPool.getClient();
139136
throw e;

src/main/java/org/sakaiproject/nakamura/lite/SessionImpl.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,18 @@
2121
import org.sakaiproject.nakamura.api.lite.Configuration;
2222
import org.sakaiproject.nakamura.api.lite.Repository;
2323
import org.sakaiproject.nakamura.api.lite.Session;
24+
import org.sakaiproject.nakamura.api.lite.StorageCacheManager;
2425
import org.sakaiproject.nakamura.api.lite.StorageClientException;
2526
import org.sakaiproject.nakamura.api.lite.StoreListener;
2627
import org.sakaiproject.nakamura.api.lite.accesscontrol.AccessDeniedException;
2728
import org.sakaiproject.nakamura.api.lite.accesscontrol.Authenticator;
2829
import org.sakaiproject.nakamura.api.lite.authorizable.User;
2930
import org.sakaiproject.nakamura.lite.accesscontrol.AccessControlManagerImpl;
3031
import org.sakaiproject.nakamura.lite.accesscontrol.AuthenticatorImpl;
31-
import org.sakaiproject.nakamura.lite.accesscontrol.CacheHolder;
3232
import org.sakaiproject.nakamura.lite.authorizable.AuthorizableManagerImpl;
3333
import org.sakaiproject.nakamura.lite.content.ContentManagerImpl;
3434
import org.sakaiproject.nakamura.lite.storage.StorageClient;
3535

36-
import java.util.Map;
37-
3836
public class SessionImpl implements Session {
3937

4038
private AccessControlManagerImpl accessControlManager;
@@ -48,17 +46,17 @@ public class SessionImpl implements Session {
4846
private StoreListener storeListener;
4947

5048
public SessionImpl(Repository repository, User currentUser, StorageClient client,
51-
Configuration configuration, Map<String, CacheHolder> sharedCache, StoreListener storeListener)
49+
Configuration configuration, StorageCacheManager storageCacheManager, StoreListener storeListener)
5250
throws ClientPoolException, StorageClientException, AccessDeniedException {
5351
this.currentUser = currentUser;
5452
this.repository = repository;
5553
this.client = client;
5654
accessControlManager = new AccessControlManagerImpl(client, currentUser, configuration,
57-
sharedCache, storeListener);
55+
storageCacheManager.getAccessControlCache(), storeListener);
5856
authorizableManager = new AuthorizableManagerImpl(currentUser, client, configuration,
59-
accessControlManager, sharedCache, storeListener);
57+
accessControlManager, storageCacheManager.getAuthorizableCache(), storeListener);
6058

61-
contentManager = new ContentManagerImpl(client, accessControlManager, configuration, sharedCache, storeListener);
59+
contentManager = new ContentManagerImpl(client, accessControlManager, configuration, storageCacheManager.getContentCache(), storeListener);
6260

6361
authenticator = new AuthenticatorImpl(client, configuration);
6462
this.storeListener = storeListener;

src/main/java/org/sakaiproject/nakamura/lite/accesscontrol/AccessControlManagerImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.google.common.collect.Lists;
2121
import com.google.common.collect.Maps;
2222

23+
import org.sakaiproject.nakamura.api.lite.CacheHolder;
2324
import org.sakaiproject.nakamura.api.lite.Configuration;
2425
import org.sakaiproject.nakamura.api.lite.StorageClientException;
2526
import org.sakaiproject.nakamura.api.lite.StorageClientUtils;

src/main/java/org/sakaiproject/nakamura/lite/authorizable/AuthorizableManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.google.common.collect.ImmutableSet;
2323
import com.google.common.collect.Maps;
2424

25+
import org.sakaiproject.nakamura.api.lite.CacheHolder;
2526
import org.sakaiproject.nakamura.api.lite.Configuration;
2627
import org.sakaiproject.nakamura.api.lite.StorageClientException;
2728
import org.sakaiproject.nakamura.api.lite.StorageClientUtils;
@@ -38,7 +39,6 @@
3839
import org.sakaiproject.nakamura.api.lite.util.PreemptiveIterator;
3940
import org.sakaiproject.nakamura.lite.CachingManager;
4041
import org.sakaiproject.nakamura.lite.accesscontrol.AuthenticatorImpl;
41-
import org.sakaiproject.nakamura.lite.accesscontrol.CacheHolder;
4242
import org.sakaiproject.nakamura.lite.storage.StorageClient;
4343
import org.slf4j.Logger;
4444
import org.slf4j.LoggerFactory;

src/main/java/org/sakaiproject/nakamura/lite/content/ContentManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import com.google.common.collect.Maps;
5050
import com.google.common.collect.Sets;
5151

52+
import org.sakaiproject.nakamura.api.lite.CacheHolder;
5253
import org.sakaiproject.nakamura.api.lite.Configuration;
5354
import org.sakaiproject.nakamura.api.lite.StorageClientException;
5455
import org.sakaiproject.nakamura.api.lite.StorageClientUtils;
@@ -60,7 +61,6 @@
6061
import org.sakaiproject.nakamura.api.lite.content.Content;
6162
import org.sakaiproject.nakamura.api.lite.content.ContentManager;
6263
import org.sakaiproject.nakamura.lite.CachingManager;
63-
import org.sakaiproject.nakamura.lite.accesscontrol.CacheHolder;
6464
import org.sakaiproject.nakamura.lite.storage.RemoveProperty;
6565
import org.sakaiproject.nakamura.lite.storage.StorageClient;
6666
import org.slf4j.Logger;

src/main/java/org/sakaiproject/nakamura/lite/storage/ConcurrentLRUMap.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ public boolean containsValue(Object value) {
106106

107107
public V put(K key, V value) {
108108
if (delegate.size() > maxSize) {
109+
// this is horribly slow for large sets
109110
List<Holder<V>> l = new ArrayList<Holder<V>>(delegate.values());
110111
Collections.sort(l, new Comparator<Holder<V>>() {
111112

@@ -114,7 +115,7 @@ public int compare(Holder<V> o1, Holder<V> o2) {
114115
}
115116
});
116117
int i = 0;
117-
while (delegate.size() > maxSize && i < l.size()) {
118+
while (delegate.size() > ((75*maxSize)/100) && i < l.size()) {
118119
delegate.remove(l.get(i++).key);
119120
}
120121
}

0 commit comments

Comments
 (0)