From 74a5a32d7acd3ee7dd241cd22e5e896760c77823 Mon Sep 17 00:00:00 2001 From: Vasilii Bobkov Date: Wed, 26 Jul 2017 17:24:59 +0300 Subject: [PATCH 1/2] part2 implemented CashingDataStorageImpl --- .../part2/cache/CachingDataStorageImpl.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/java/part2/cache/CachingDataStorageImpl.java b/src/main/java/part2/cache/CachingDataStorageImpl.java index a2ae460..3dde9bf 100755 --- a/src/main/java/part2/cache/CachingDataStorageImpl.java +++ b/src/main/java/part2/cache/CachingDataStorageImpl.java @@ -32,12 +32,22 @@ public CachingDataStorageImpl(DataStorage db, int timeout, TimeUnit t @Override public OutdatableResult getOutdatable(String key) { - // TODO implement - // TODO use ScheduledExecutorService to remove outdated result from cache - see SlowCompletableFutureDb implementation - // TODO complete OutdatableResult::outdated after removing outdated result from cache - // 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(); + + CompletableFuture sched = new CompletableFuture<>(); + CompletableFuture resultFuture = new CompletableFuture<>(); + OutdatableResult outdatableResult = new OutdatableResult<>(resultFuture, sched); + OutdatableResult cashedResult = cache.putIfAbsent(key, outdatableResult); + if (cashedResult == null) { + db.get(key).whenComplete((result, throwable) -> { + if (throwable == null) resultFuture.complete(result); + else resultFuture.completeExceptionally(throwable); + scheduledExecutorService.schedule(() -> { + cache.remove(key, result); + sched.complete(null); + }, timeout, timeoutUnits); + }); + return outdatableResult; + } else return cashedResult; + // FIXME: 7/26/2017 тесты валятся } } From e47153c2c133fa20a277bff3d47862cf4a9caee6 Mon Sep 17 00:00:00 2001 From: Vasilii Bobkov Date: Thu, 27 Jul 2017 11:41:14 +0300 Subject: [PATCH 2/2] part2 completed --- src/main/java/part2/cache/CachingDataStorageImpl.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/part2/cache/CachingDataStorageImpl.java b/src/main/java/part2/cache/CachingDataStorageImpl.java index 3dde9bf..135ec23 100755 --- a/src/main/java/part2/cache/CachingDataStorageImpl.java +++ b/src/main/java/part2/cache/CachingDataStorageImpl.java @@ -39,15 +39,18 @@ public OutdatableResult getOutdatable(String key) { OutdatableResult cashedResult = cache.putIfAbsent(key, outdatableResult); if (cashedResult == null) { db.get(key).whenComplete((result, throwable) -> { - if (throwable == null) resultFuture.complete(result); - else resultFuture.completeExceptionally(throwable); + if (throwable == null){ + resultFuture.complete(result); + } + else { + resultFuture.completeExceptionally(throwable); + } scheduledExecutorService.schedule(() -> { - cache.remove(key, result); + cache.remove(key, outdatableResult); sched.complete(null); }, timeout, timeoutUnits); }); return outdatableResult; } else return cashedResult; - // FIXME: 7/26/2017 тесты валятся } }