3535import oracle .nosql .driver .SecurityInfoNotReadyException ;
3636import oracle .nosql .driver .iam .SecurityTokenSupplier .SecurityTokenBasedProvider ;
3737import oracle .nosql .driver .ops .Request ;
38- import oracle .nosql .driver .util .LruCache ;
3938
4039import io .netty .handler .codec .http .HttpHeaders ;
4140
@@ -121,11 +120,6 @@ public class SignatureProvider
121120 "(request-target) host date opc-obo-token" ;
122121 private static final String OBO_TOKEN_HEADER = "opc-obo-token" ;
123122
124- /* Cache key name */
125- private static final String CACHE_KEY = "signature" ;
126- /* Refresh key name */
127- private static final String REFRESH_CACHE_KEY = "refresh_signature" ;
128-
129123 /* Maximum lifetime of signature 240 seconds */
130124 protected static final int MAX_ENTRY_LIFE_TIME = 240 ;
131125
@@ -139,16 +133,21 @@ public class SignatureProvider
139133 /* Delegation token specified for signing */
140134 private String delegationToken ;
141135
142- private final LruCache <String , SignatureDetails > signatureCache ;
136+ /* the currently cached signature */
137+ private SignatureDetails currentSigDetails ;
138+
139+ /* new signature, in process of warmup */
140+ private SignatureDetails refreshSigDetails ;
143141
144142 /* Refresh timer */
145143 private volatile Timer refresher ;
146144
147- /* Refresh time before signature expired from cache */
145+ /* Refresh time before signature expires */
148146 private long refreshAheadMs = DEFAULT_REFRESH_AHEAD ;
149147
150148 /* Refresh interval, if zero, no refresh will be scheduled */
151149 private long refreshIntervalMs = 0 ;
150+
152151 private String serviceHost ;
153152 private Region region ;
154153 private Logger logger ;
@@ -675,8 +674,6 @@ protected SignatureProvider(AuthenticationProfileProvider profileProvider,
675674 "Signature cannot be cached longer than " +
676675 MAX_ENTRY_LIFE_TIME + " seconds" );
677676 }
678- this .signatureCache =
679- new LruCache <String , SignatureDetails >(2 , durationSeconds * 1000 );
680677
681678 this .refreshAheadMs = refreshAhead ;
682679 long durationMS = durationSeconds * 1000 ;
@@ -739,6 +736,12 @@ public void setRequiredHeaders(String authString,
739736 }
740737 }
741738
739+ @ Override
740+ public synchronized void flushCache () {
741+ currentSigDetails = null ;
742+ refreshSigDetails = null ;
743+ }
744+
742745 /**
743746 * Get tenant OCID if using user principal.
744747 * @return tenant OCID of user
@@ -753,7 +756,6 @@ private String getTenantOCID() {
753756
754757 @ Override
755758 public void close () {
756- signatureCache .stop (false );
757759 if (refresher != null ) {
758760 refresher .cancel ();
759761 refresher = null ;
@@ -858,28 +860,32 @@ private void logMessage(Level level, String msg) {
858860 }
859861
860862 private SignatureDetails getSignatureDetails (Request request ) {
861- String key = request . getIsRefresh () ? REFRESH_CACHE_KEY : CACHE_KEY ;
862- SignatureDetails sigDetails = signatureCache . get ( key );
863+ SignatureDetails sigDetails =
864+ ( request . getIsRefresh () ? refreshSigDetails : currentSigDetails );
863865 if (sigDetails != null ) {
864866 return sigDetails ;
865867 }
866868
867869 if (request .getIsRefresh ()) {
868- /* try normal key before failing */
869- sigDetails = signatureCache . get ( CACHE_KEY ) ;
870+ /* try current details before failing */
871+ sigDetails = currentSigDetails ;
870872 if (sigDetails != null ) {
871873 return sigDetails ;
872874 }
873875 }
874876
875- logMessage (Level .WARNING , "No signature in cache" );
876877 return getSignatureDetailsInternal (false );
877878 }
878879
879880 /* visible for testing */
880881 synchronized SignatureDetails getSignatureDetailsInternal (boolean isRefresh )
881882 {
882- String date = createFormatter ().format (new Date ());
883+ /*
884+ * add one minute to the current time, so that any caching is
885+ * effective over a more valid time period.
886+ */
887+ long nowPlus = System .currentTimeMillis () + 60_000L ;
888+ String date = createFormatter ().format (new Date (nowPlus ));
883889 String keyId = provider .getKeyId ();
884890 if (provider instanceof InstancePrincipalsProvider ) {
885891 privateKeyProvider .reload (provider .getPrivateKey (),
@@ -907,7 +913,7 @@ synchronized SignatureDetails getSignatureDetailsInternal(boolean isRefresh)
907913 * if this is not a refresh, use the normal key and schedule a
908914 * refresh
909915 */
910- signatureCache . put ( CACHE_KEY , sigDetails ) ;
916+ currentSigDetails = sigDetails ;
911917 scheduleRefresh ();
912918 } else {
913919 /*
@@ -916,16 +922,15 @@ synchronized SignatureDetails getSignatureDetailsInternal(boolean isRefresh)
916922 * 1. perform callbacks if needed and when done,
917923 * 2. move the object to the normal key and schedule a refresh
918924 */
919- signatureCache . put ( REFRESH_CACHE_KEY , sigDetails ) ;
925+ refreshSigDetails = sigDetails ;
920926 }
921927 return sigDetails ;
922928 }
923929
924930 private synchronized void setRefreshKey () {
925- SignatureDetails sigDetails =
926- signatureCache .remove (REFRESH_CACHE_KEY );
927- if (sigDetails != null ) {
928- signatureCache .put (CACHE_KEY , sigDetails );
931+ if (refreshSigDetails != null ) {
932+ currentSigDetails = refreshSigDetails ;
933+ refreshSigDetails = null ;
929934 }
930935 }
931936
@@ -978,10 +983,9 @@ private class RefreshTask extends TimerTask {
978983 private static final int DELAY_MS = 500 ;
979984
980985 private void handleRefreshCallback (long refreshMs ) {
981- SignatureDetails sigDetails = signatureCache .get (REFRESH_CACHE_KEY );
982- if (sigDetails == null ) {
986+ if (refreshSigDetails == null ) {
983987 logMessage (Level .FINE ,
984- "Refresh didn't find refresh cache key" );
988+ "Refresh didn't find cached refresh key" );
985989 return ;
986990 }
987991
0 commit comments