DatabaseService related fixes.
- Note: This patch does not fix the issue running as single node. Change-Id: Iabfa548ca4e40e4ec5c9e76ae936300437e53d22
Showing
5 changed files
with
36 additions
and
14 deletions
... | @@ -39,6 +39,7 @@ import org.onlab.onos.store.service.BatchWriteRequest; | ... | @@ -39,6 +39,7 @@ import org.onlab.onos.store.service.BatchWriteRequest; |
39 | import org.onlab.onos.store.service.BatchWriteRequest.Builder; | 39 | import org.onlab.onos.store.service.BatchWriteRequest.Builder; |
40 | import org.onlab.onos.store.service.BatchWriteResult; | 40 | import org.onlab.onos.store.service.BatchWriteResult; |
41 | import org.onlab.onos.store.service.DatabaseAdminService; | 41 | import org.onlab.onos.store.service.DatabaseAdminService; |
42 | +import org.onlab.onos.store.service.DatabaseException; | ||
42 | import org.onlab.onos.store.service.DatabaseService; | 43 | import org.onlab.onos.store.service.DatabaseService; |
43 | import org.onlab.onos.store.service.VersionedValue; | 44 | import org.onlab.onos.store.service.VersionedValue; |
44 | import org.onlab.onos.store.service.WriteRequest; | 45 | import org.onlab.onos.store.service.WriteRequest; |
... | @@ -108,7 +109,21 @@ public class DistributedLinkResourceStore implements LinkResourceStore { | ... | @@ -108,7 +109,21 @@ public class DistributedLinkResourceStore implements LinkResourceStore { |
108 | 109 | ||
109 | serializer = new KryoSerializer(); | 110 | serializer = new KryoSerializer(); |
110 | 111 | ||
111 | - Set<String> tables = databaseAdminService.listTables(); | 112 | + Set<String> tables = null; |
113 | + int retries = 0; | ||
114 | + do { | ||
115 | + try { | ||
116 | + tables = databaseAdminService.listTables(); | ||
117 | + } catch (DatabaseException e) { | ||
118 | + log.debug("DatabaseException", e); | ||
119 | + retries++; | ||
120 | + if (retries > 10) { | ||
121 | + log.error("Failed to list tables, moving on", e); | ||
122 | + tables = new HashSet<>(); | ||
123 | + } | ||
124 | + } | ||
125 | + } while (tables == null); | ||
126 | + | ||
112 | if (!tables.contains(LINK_RESOURCE_ALLOCATIONS)) { | 127 | if (!tables.contains(LINK_RESOURCE_ALLOCATIONS)) { |
113 | databaseAdminService.createTable(LINK_RESOURCE_ALLOCATIONS); | 128 | databaseAdminService.createTable(LINK_RESOURCE_ALLOCATIONS); |
114 | } | 129 | } |
... | @@ -116,6 +131,7 @@ public class DistributedLinkResourceStore implements LinkResourceStore { | ... | @@ -116,6 +131,7 @@ public class DistributedLinkResourceStore implements LinkResourceStore { |
116 | databaseAdminService.createTable(INTENT_ALLOCATIONS); | 131 | databaseAdminService.createTable(INTENT_ALLOCATIONS); |
117 | } | 132 | } |
118 | 133 | ||
134 | + | ||
119 | log.info("Started"); | 135 | log.info("Started"); |
120 | } | 136 | } |
121 | 137 | ... | ... |
... | @@ -112,7 +112,7 @@ public class ClusterMessagingProtocolClient implements ProtocolClient { | ... | @@ -112,7 +112,7 @@ public class ClusterMessagingProtocolClient implements ProtocolClient { |
112 | clusterService.addListener(listener); | 112 | clusterService.addListener(listener); |
113 | 113 | ||
114 | // wait for specified controller node to come up | 114 | // wait for specified controller node to come up |
115 | - return null; | 115 | + return appeared; |
116 | } | 116 | } |
117 | 117 | ||
118 | @Override | 118 | @Override | ... | ... |
... | @@ -81,7 +81,7 @@ public class ClusterMessagingProtocolServer implements ProtocolServer { | ... | @@ -81,7 +81,7 @@ public class ClusterMessagingProtocolServer implements ProtocolServer { |
81 | } | 81 | } |
82 | } | 82 | } |
83 | if (handler == null) { | 83 | if (handler == null) { |
84 | - log.error("There was no handler for registered!"); | 84 | + log.error("There was no handler registered!"); |
85 | return; | 85 | return; |
86 | } | 86 | } |
87 | } | 87 | } | ... | ... |
1 | package org.onlab.onos.store.service.impl; | 1 | package org.onlab.onos.store.service.impl; |
2 | 2 | ||
3 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
3 | import static org.slf4j.LoggerFactory.getLogger; | 4 | import static org.slf4j.LoggerFactory.getLogger; |
4 | 5 | ||
5 | import java.util.Arrays; | 6 | import java.util.Arrays; |
... | @@ -12,7 +13,6 @@ import java.util.concurrent.ExecutionException; | ... | @@ -12,7 +13,6 @@ import java.util.concurrent.ExecutionException; |
12 | import java.util.concurrent.TimeUnit; | 13 | import java.util.concurrent.TimeUnit; |
13 | import java.util.concurrent.TimeoutException; | 14 | import java.util.concurrent.TimeoutException; |
14 | 15 | ||
15 | -import net.kuujo.copycat.cluster.Member; | ||
16 | import net.kuujo.copycat.cluster.TcpMember; | 16 | import net.kuujo.copycat.cluster.TcpMember; |
17 | import net.kuujo.copycat.event.EventHandler; | 17 | import net.kuujo.copycat.event.EventHandler; |
18 | import net.kuujo.copycat.event.LeaderElectEvent; | 18 | import net.kuujo.copycat.event.LeaderElectEvent; |
... | @@ -40,23 +40,28 @@ public class DatabaseClient implements EventHandler<LeaderElectEvent> { | ... | @@ -40,23 +40,28 @@ public class DatabaseClient implements EventHandler<LeaderElectEvent> { |
40 | private final Logger log = getLogger(getClass()); | 40 | private final Logger log = getLogger(getClass()); |
41 | 41 | ||
42 | private final DatabaseProtocolService protocol; | 42 | private final DatabaseProtocolService protocol; |
43 | - private volatile ProtocolClient copycat = null; | 43 | + private volatile ProtocolClient client = null; |
44 | - private volatile Member currentLeader = null; | 44 | + private volatile TcpMember currentLeader = null; |
45 | + | ||
45 | 46 | ||
46 | public DatabaseClient(DatabaseProtocolService protocol) { | 47 | public DatabaseClient(DatabaseProtocolService protocol) { |
47 | - this.protocol = protocol; | 48 | + this.protocol = checkNotNull(protocol); |
48 | } | 49 | } |
49 | 50 | ||
51 | + // FIXME This handler relies on a fact that local node is part of Raft cluster | ||
50 | @Override | 52 | @Override |
51 | public void handle(LeaderElectEvent event) { | 53 | public void handle(LeaderElectEvent event) { |
52 | - Member newLeader = event.leader(); | 54 | + final TcpMember newLeader = event.leader(); |
53 | if (newLeader != null && !newLeader.equals(currentLeader)) { | 55 | if (newLeader != null && !newLeader.equals(currentLeader)) { |
56 | + log.info("{} became the new leader", newLeader); | ||
57 | + ProtocolClient prevClient = client; | ||
58 | + ProtocolClient newclient = protocol.createClient(newLeader); | ||
59 | + newclient.connect(); | ||
60 | + client = newclient; | ||
54 | currentLeader = newLeader; | 61 | currentLeader = newLeader; |
55 | - if (copycat != null) { | 62 | + if (prevClient != null) { |
56 | - copycat.close(); | 63 | + prevClient.close(); |
57 | } | 64 | } |
58 | - copycat = protocol.createClient((TcpMember) currentLeader); | ||
59 | - copycat.connect(); | ||
60 | } | 65 | } |
61 | } | 66 | } |
62 | 67 | ||
... | @@ -92,7 +97,7 @@ public class DatabaseClient implements EventHandler<LeaderElectEvent> { | ... | @@ -92,7 +97,7 @@ public class DatabaseClient implements EventHandler<LeaderElectEvent> { |
92 | SubmitRequest request = | 97 | SubmitRequest request = |
93 | new SubmitRequest(nextRequestId(), operationName, Arrays.asList(args)); | 98 | new SubmitRequest(nextRequestId(), operationName, Arrays.asList(args)); |
94 | 99 | ||
95 | - CompletableFuture<SubmitResponse> submitResponse = copycat.submit(request); | 100 | + CompletableFuture<SubmitResponse> submitResponse = client.submit(request); |
96 | 101 | ||
97 | log.debug("Sent {} to {}", request, currentLeader); | 102 | log.debug("Sent {} to {}", request, currentLeader); |
98 | 103 | ... | ... |
... | @@ -173,9 +173,10 @@ public class DatabaseManager implements DatabaseService, DatabaseAdminService { | ... | @@ -173,9 +173,10 @@ public class DatabaseManager implements DatabaseService, DatabaseAdminService { |
173 | Log consensusLog = new MapDBLog(LOG_FILE_PREFIX + localNode.id(), | 173 | Log consensusLog = new MapDBLog(LOG_FILE_PREFIX + localNode.id(), |
174 | ClusterMessagingProtocol.SERIALIZER); | 174 | ClusterMessagingProtocol.SERIALIZER); |
175 | 175 | ||
176 | + copycat = new Copycat(stateMachine, consensusLog, cluster, copycatMessagingProtocol); | ||
177 | + | ||
176 | client = new DatabaseClient(copycatMessagingProtocol); | 178 | client = new DatabaseClient(copycatMessagingProtocol); |
177 | 179 | ||
178 | - copycat = new Copycat(stateMachine, consensusLog, cluster, copycatMessagingProtocol); | ||
179 | 180 | ||
180 | copycat.event(LeaderElectEvent.class).registerHandler(client); | 181 | copycat.event(LeaderElectEvent.class).registerHandler(client); |
181 | copycat.event(LeaderElectEvent.class).registerHandler(expirationTracker); | 182 | copycat.event(LeaderElectEvent.class).registerHandler(expirationTracker); | ... | ... |
-
Please register or login to post a comment