From a8395dd619c5cb365c3a24d4b9d2dde535c7efae Mon Sep 17 00:00:00 2001 From: vidinalex Date: Tue, 25 Jul 2017 17:36:28 +0300 Subject: [PATCH 1/2] temp --- .../part2/cache/CachingDataStorageImpl.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/part2/cache/CachingDataStorageImpl.java b/src/main/java/part2/cache/CachingDataStorageImpl.java index a2ae460..1ca647d 100755 --- a/src/main/java/part2/cache/CachingDataStorageImpl.java +++ b/src/main/java/part2/cache/CachingDataStorageImpl.java @@ -1,5 +1,6 @@ package part2.cache; +import com.sun.javafx.geom.AreaOp; import db.DataStorage; import db.SlowCompletableFutureDb; @@ -38,6 +39,29 @@ public OutdatableResult getOutdatable(String key) { // TODO don't use obtrudeException on result - just don't // TODO use remove(Object key, Object value) to remove target value // TODO Start timeout after receiving result in CompletableFuture, not after receiving CompletableFuture itself - throw new UnsupportedOperationException(); + + OutdatableResult res = new OutdatableResult<>(new CompletableFuture<>(), new CompletableFuture<>()); + OutdatableResult tOutdatableResult = cache.putIfAbsent(key, res); + + if (tOutdatableResult == null) { + + db.get(key).whenComplete( + (t,e) -> { + if (e == null) { + res.getResult().complete(t); + } else { + res.getResult().completeExceptionally(e); + } + res.getOutdated().thenRunAsync(() -> scheduledExecutorService.schedule( + () -> cache.remove(key, cache.get(key)), + timeout, + timeoutUnits + )); + } + ); + return res; + } else { + return tOutdatableResult; + } } } From a528ab597ede47a5a26f18d0a77e55302bdb2565 Mon Sep 17 00:00:00 2001 From: Igor Drozdov Date: Wed, 26 Jul 2017 14:07:08 +0300 Subject: [PATCH 2/2] part 2 completed --- .../part2/cache/CachingDataStorageImpl.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/part2/cache/CachingDataStorageImpl.java b/src/main/java/part2/cache/CachingDataStorageImpl.java index 1ca647d..f8af9d5 100755 --- a/src/main/java/part2/cache/CachingDataStorageImpl.java +++ b/src/main/java/part2/cache/CachingDataStorageImpl.java @@ -44,19 +44,20 @@ public OutdatableResult getOutdatable(String key) { OutdatableResult tOutdatableResult = cache.putIfAbsent(key, res); if (tOutdatableResult == null) { - db.get(key).whenComplete( - (t,e) -> { - if (e == null) { - res.getResult().complete(t); - } else { + (t, e) -> { + if (e != null) { res.getResult().completeExceptionally(e); + } else { + res.getResult().complete(t); } - res.getOutdated().thenRunAsync(() -> scheduledExecutorService.schedule( - () -> cache.remove(key, cache.get(key)), + scheduledExecutorService.schedule(() -> { + cache.remove(key, cache.get(key)); + res.getOutdated().complete(null); + }, timeout, timeoutUnits - )); + ); } ); return res;