< prev index next >

src/share/classes/sun/security/util/Cache.java

Print this page
rev 14405 : 8259886: Improve SSL session cache performance and scalability
Reviewed-by: erikj, xuelei
Contributed-by: djelinski <djelinski1@gmail.com>

*** 1,7 **** /* ! * Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 2002, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 250,259 **** --- 250,260 ---- private final static boolean DEBUG = false; private final Map<K, CacheEntry<K,V>> cacheMap; private int maxSize; private long lifetime; + private long nextExpirationTime = Long.MAX_VALUE; // ReferenceQueue is of type V instead of Cache<K,V> // to allow SoftCacheEntry to extend SoftReference<V> private final ReferenceQueue<V> queue;
*** 319,334 **** --- 320,341 ---- if (lifetime == 0) { return; } int cnt = 0; long time = System.currentTimeMillis(); + if (nextExpirationTime > time) { + return; + } + nextExpirationTime = Long.MAX_VALUE; for (Iterator<CacheEntry<K,V>> t = cacheMap.values().iterator(); t.hasNext(); ) { CacheEntry<K,V> entry = t.next(); if (entry.isValid(time) == false) { t.remove(); cnt++; + } else if (nextExpirationTime > entry.getExpirationTime()) { + nextExpirationTime = entry.getExpirationTime(); } } if (DEBUG) { if (cnt != 0) { System.out.println("Removed " + cnt
*** 358,367 **** --- 365,377 ---- public synchronized void put(K key, V value) { emptyQueue(); long expirationTime = (lifetime == 0) ? 0 : System.currentTimeMillis() + lifetime; + if (expirationTime < nextExpirationTime) { + nextExpirationTime = expirationTime; + } CacheEntry<K,V> newEntry = newEntry(key, value, expirationTime, queue); CacheEntry<K,V> oldEntry = cacheMap.put(key, newEntry); if (oldEntry != null) { oldEntry.invalidate(); return;
*** 472,481 **** --- 482,492 ---- K getKey(); V getValue(); + long getExpirationTime(); } private static class HardCacheEntry<K,V> implements CacheEntry<K,V> { private K key;
*** 494,503 **** --- 505,518 ---- public V getValue() { return value; } + public long getExpirationTime() { + return expirationTime; + } + public boolean isValid(long currentTime) { boolean valid = (currentTime <= expirationTime); if (valid == false) { invalidate(); }
*** 531,540 **** --- 546,559 ---- public V getValue() { return get(); } + public long getExpirationTime() { + return expirationTime; + } + public boolean isValid(long currentTime) { boolean valid = (currentTime <= expirationTime) && (get() != null); if (valid == false) { invalidate(); }
< prev index next >