Fixed error due to storage exception timeout. Added a delay between retries.
Change-Id: I99bdfbe980eac7069f34203ee69fe0c5c480db45
Showing
2 changed files
with
31 additions
and
32 deletions
| ... | @@ -17,7 +17,6 @@ package org.onosproject.store.app; | ... | @@ -17,7 +17,6 @@ package org.onosproject.store.app; |
| 17 | 17 | ||
| 18 | import com.google.common.base.Charsets; | 18 | import com.google.common.base.Charsets; |
| 19 | import com.google.common.collect.ImmutableSet; | 19 | import com.google.common.collect.ImmutableSet; |
| 20 | - | ||
| 21 | import org.apache.felix.scr.annotations.Activate; | 20 | import org.apache.felix.scr.annotations.Activate; |
| 22 | import org.apache.felix.scr.annotations.Component; | 21 | import org.apache.felix.scr.annotations.Component; |
| 23 | import org.apache.felix.scr.annotations.Deactivate; | 22 | import org.apache.felix.scr.annotations.Deactivate; |
| ... | @@ -43,12 +42,12 @@ import org.onosproject.store.cluster.messaging.ClusterCommunicationService; | ... | @@ -43,12 +42,12 @@ import org.onosproject.store.cluster.messaging.ClusterCommunicationService; |
| 43 | import org.onosproject.store.cluster.messaging.ClusterMessage; | 42 | import org.onosproject.store.cluster.messaging.ClusterMessage; |
| 44 | import org.onosproject.store.cluster.messaging.ClusterMessageHandler; | 43 | import org.onosproject.store.cluster.messaging.ClusterMessageHandler; |
| 45 | import org.onosproject.store.cluster.messaging.MessageSubject; | 44 | import org.onosproject.store.cluster.messaging.MessageSubject; |
| 46 | -import org.onosproject.store.service.MultiValuedTimestamp; | ||
| 47 | import org.onosproject.store.serializers.KryoNamespaces; | 45 | import org.onosproject.store.serializers.KryoNamespaces; |
| 48 | import org.onosproject.store.service.EventuallyConsistentMap; | 46 | import org.onosproject.store.service.EventuallyConsistentMap; |
| 49 | import org.onosproject.store.service.EventuallyConsistentMapEvent; | 47 | import org.onosproject.store.service.EventuallyConsistentMapEvent; |
| 50 | import org.onosproject.store.service.EventuallyConsistentMapListener; | 48 | import org.onosproject.store.service.EventuallyConsistentMapListener; |
| 51 | import org.onosproject.store.service.LogicalClockService; | 49 | import org.onosproject.store.service.LogicalClockService; |
| 50 | +import org.onosproject.store.service.MultiValuedTimestamp; | ||
| 52 | import org.onosproject.store.service.StorageService; | 51 | import org.onosproject.store.service.StorageService; |
| 53 | import org.slf4j.Logger; | 52 | import org.slf4j.Logger; |
| 54 | 53 | ||
| ... | @@ -63,15 +62,10 @@ import java.util.function.Function; | ... | @@ -63,15 +62,10 @@ import java.util.function.Function; |
| 63 | 62 | ||
| 64 | import static com.google.common.io.ByteStreams.toByteArray; | 63 | import static com.google.common.io.ByteStreams.toByteArray; |
| 65 | import static java.util.concurrent.TimeUnit.MILLISECONDS; | 64 | import static java.util.concurrent.TimeUnit.MILLISECONDS; |
| 65 | +import static org.onlab.util.Tools.delay; | ||
| 66 | import static org.onlab.util.Tools.groupedThreads; | 66 | import static org.onlab.util.Tools.groupedThreads; |
| 67 | -import static org.onosproject.app.ApplicationEvent.Type.APP_ACTIVATED; | 67 | +import static org.onosproject.app.ApplicationEvent.Type.*; |
| 68 | -import static org.onosproject.app.ApplicationEvent.Type.APP_DEACTIVATED; | 68 | +import static org.onosproject.store.app.GossipApplicationStore.InternalState.*; |
| 69 | -import static org.onosproject.app.ApplicationEvent.Type.APP_INSTALLED; | ||
| 70 | -import static org.onosproject.app.ApplicationEvent.Type.APP_PERMISSIONS_CHANGED; | ||
| 71 | -import static org.onosproject.app.ApplicationEvent.Type.APP_UNINSTALLED; | ||
| 72 | -import static org.onosproject.store.app.GossipApplicationStore.InternalState.ACTIVATED; | ||
| 73 | -import static org.onosproject.store.app.GossipApplicationStore.InternalState.DEACTIVATED; | ||
| 74 | -import static org.onosproject.store.app.GossipApplicationStore.InternalState.INSTALLED; | ||
| 75 | import static org.onosproject.store.service.EventuallyConsistentMapEvent.Type.PUT; | 69 | import static org.onosproject.store.service.EventuallyConsistentMapEvent.Type.PUT; |
| 76 | import static org.onosproject.store.service.EventuallyConsistentMapEvent.Type.REMOVE; | 70 | import static org.onosproject.store.service.EventuallyConsistentMapEvent.Type.REMOVE; |
| 77 | import static org.slf4j.LoggerFactory.getLogger; | 71 | import static org.slf4j.LoggerFactory.getLogger; |
| ... | @@ -85,12 +79,13 @@ import static org.slf4j.LoggerFactory.getLogger; | ... | @@ -85,12 +79,13 @@ import static org.slf4j.LoggerFactory.getLogger; |
| 85 | public class GossipApplicationStore extends ApplicationArchive | 79 | public class GossipApplicationStore extends ApplicationArchive |
| 86 | implements ApplicationStore { | 80 | implements ApplicationStore { |
| 87 | 81 | ||
| 88 | - private static final int MAX_LOAD_RETRIES = 3; | ||
| 89 | - | ||
| 90 | private final Logger log = getLogger(getClass()); | 82 | private final Logger log = getLogger(getClass()); |
| 91 | 83 | ||
| 92 | private static final MessageSubject APP_BITS_REQUEST = new MessageSubject("app-bits-request"); | 84 | private static final MessageSubject APP_BITS_REQUEST = new MessageSubject("app-bits-request"); |
| 93 | 85 | ||
| 86 | + private static final int MAX_LOAD_RETRIES = 3; | ||
| 87 | + private static final int RETRY_DELAY_MS = 2_000; | ||
| 88 | + | ||
| 94 | private static final int FETCH_TIMEOUT_MS = 10_000; | 89 | private static final int FETCH_TIMEOUT_MS = 10_000; |
| 95 | private static final int LOAD_TIMEOUT_MS = 5_000; | 90 | private static final int LOAD_TIMEOUT_MS = 5_000; |
| 96 | 91 | ||
| ... | @@ -174,6 +169,7 @@ public class GossipApplicationStore extends ApplicationArchive | ... | @@ -174,6 +169,7 @@ public class GossipApplicationStore extends ApplicationArchive |
| 174 | } | 169 | } |
| 175 | } catch (Exception e) { | 170 | } catch (Exception e) { |
| 176 | log.warn("Unable to load application {} from disk; retrying", name); | 171 | log.warn("Unable to load application {} from disk; retrying", name); |
| 172 | + delay(RETRY_DELAY_MS); // FIXME: This is a deliberate hack; fix in Drake | ||
| 177 | } | 173 | } |
| 178 | } | 174 | } |
| 179 | } | 175 | } |
| ... | @@ -372,21 +368,21 @@ public class GossipApplicationStore extends ApplicationArchive | ... | @@ -372,21 +368,21 @@ public class GossipApplicationStore extends ApplicationArchive |
| 372 | continue; | 368 | continue; |
| 373 | } | 369 | } |
| 374 | clusterCommunicator.sendAndReceive(app.id().name(), | 370 | clusterCommunicator.sendAndReceive(app.id().name(), |
| 375 | - APP_BITS_REQUEST, | 371 | + APP_BITS_REQUEST, |
| 376 | - s -> s.getBytes(Charsets.UTF_8), | 372 | + s -> s.getBytes(Charsets.UTF_8), |
| 377 | - Function.identity(), | 373 | + Function.identity(), |
| 378 | - node.id()) | 374 | + node.id()) |
| 379 | - .whenCompleteAsync((bits, error) -> { | 375 | + .whenCompleteAsync((bits, error) -> { |
| 380 | - if (error == null && latch.getCount() > 0) { | 376 | + if (error == null && latch.getCount() > 0) { |
| 381 | - saveApplication(new ByteArrayInputStream(bits)); | 377 | + saveApplication(new ByteArrayInputStream(bits)); |
| 382 | - log.info("Downloaded bits for application {} from node {}", | 378 | + log.info("Downloaded bits for application {} from node {}", |
| 383 | - app.id().name(), node.id()); | 379 | + app.id().name(), node.id()); |
| 384 | - latch.countDown(); | 380 | + latch.countDown(); |
| 385 | - } else if (error != null) { | 381 | + } else if (error != null) { |
| 386 | - log.warn("Unable to fetch bits for application {} from node {}", | 382 | + log.warn("Unable to fetch bits for application {} from node {}", |
| 387 | - app.id().name(), node.id()); | 383 | + app.id().name(), node.id()); |
| 388 | - } | 384 | + } |
| 389 | - }, executor); | 385 | + }, executor); |
| 390 | } | 386 | } |
| 391 | 387 | ||
| 392 | try { | 388 | try { |
| ... | @@ -412,6 +408,7 @@ public class GossipApplicationStore extends ApplicationArchive | ... | @@ -412,6 +408,7 @@ public class GossipApplicationStore extends ApplicationArchive |
| 412 | } | 408 | } |
| 413 | } | 409 | } |
| 414 | } | 410 | } |
| 411 | + | ||
| 415 | /** | 412 | /** |
| 416 | * Prunes applications which are not in the map, but are on disk. | 413 | * Prunes applications which are not in the map, but are on disk. |
| 417 | */ | 414 | */ | ... | ... |
| 1 | package org.onosproject.store.core.impl; | 1 | package org.onosproject.store.core.impl; |
| 2 | 2 | ||
| 3 | -import static org.slf4j.LoggerFactory.getLogger; | 3 | +import com.google.common.collect.Maps; |
| 4 | - | ||
| 5 | -import java.util.Map; | ||
| 6 | - | ||
| 7 | import org.apache.felix.scr.annotations.Activate; | 4 | import org.apache.felix.scr.annotations.Activate; |
| 8 | import org.apache.felix.scr.annotations.Component; | 5 | import org.apache.felix.scr.annotations.Component; |
| 9 | import org.apache.felix.scr.annotations.Deactivate; | 6 | import org.apache.felix.scr.annotations.Deactivate; |
| ... | @@ -17,7 +14,10 @@ import org.onosproject.store.service.StorageException; | ... | @@ -17,7 +14,10 @@ import org.onosproject.store.service.StorageException; |
| 17 | import org.onosproject.store.service.StorageService; | 14 | import org.onosproject.store.service.StorageService; |
| 18 | import org.slf4j.Logger; | 15 | import org.slf4j.Logger; |
| 19 | 16 | ||
| 20 | -import com.google.common.collect.Maps; | 17 | +import java.util.Map; |
| 18 | + | ||
| 19 | +import static org.onlab.util.Tools.delay; | ||
| 20 | +import static org.slf4j.LoggerFactory.getLogger; | ||
| 21 | 21 | ||
| 22 | /** | 22 | /** |
| 23 | * Implementation of {@code IdBlockStore} using {@code AtomicCounter}. | 23 | * Implementation of {@code IdBlockStore} using {@code AtomicCounter}. |
| ... | @@ -27,6 +27,7 @@ import com.google.common.collect.Maps; | ... | @@ -27,6 +27,7 @@ import com.google.common.collect.Maps; |
| 27 | public class ConsistentIdBlockStore implements IdBlockStore { | 27 | public class ConsistentIdBlockStore implements IdBlockStore { |
| 28 | 28 | ||
| 29 | private static final int MAX_TRIES = 3; | 29 | private static final int MAX_TRIES = 3; |
| 30 | + private static final int RETRY_DELAY_MS = 2_000; | ||
| 30 | 31 | ||
| 31 | private final Logger log = getLogger(getClass()); | 32 | private final Logger log = getLogger(getClass()); |
| 32 | private final Map<String, AtomicCounter> topicCounters = Maps.newConcurrentMap(); | 33 | private final Map<String, AtomicCounter> topicCounters = Maps.newConcurrentMap(); |
| ... | @@ -62,6 +63,7 @@ public class ConsistentIdBlockStore implements IdBlockStore { | ... | @@ -62,6 +63,7 @@ public class ConsistentIdBlockStore implements IdBlockStore { |
| 62 | log.warn("Unable to allocate ID block due to {}; retrying...", | 63 | log.warn("Unable to allocate ID block due to {}; retrying...", |
| 63 | e.getMessage()); | 64 | e.getMessage()); |
| 64 | exc = e; | 65 | exc = e; |
| 66 | + delay(RETRY_DELAY_MS); // FIXME: This is a deliberate hack; fix in Drake | ||
| 65 | } | 67 | } |
| 66 | } | 68 | } |
| 67 | throw new IllegalStateException("Unable to allocate ID block", exc); | 69 | throw new IllegalStateException("Unable to allocate ID block", exc); | ... | ... |
-
Please register or login to post a comment