Added support for firing up multiple raft partitions + Workaround for an issue w…
…here db calls timeout when a raft cluster node is down. Change-Id: I67406da34c8a96b8ab9371d4d9b14653edfd2e2d
Showing
8 changed files
with
244 additions
and
167 deletions
| 1 | +/* | ||
| 2 | + * Copyright 2015 Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 1 | package org.onosproject.store.cluster.impl; | 16 | package org.onosproject.store.cluster.impl; |
| 2 | 17 | ||
| 3 | import java.util.Set; | 18 | import java.util.Set; |
| 4 | 19 | ||
| 5 | -import org.onosproject.cluster.DefaultControllerNode; | ||
| 6 | - | ||
| 7 | import com.google.common.collect.ImmutableSet; | 20 | import com.google.common.collect.ImmutableSet; |
| 8 | 21 | ||
| 9 | /** | 22 | /** |
| ... | @@ -11,16 +24,16 @@ import com.google.common.collect.ImmutableSet; | ... | @@ -11,16 +24,16 @@ import com.google.common.collect.ImmutableSet; |
| 11 | */ | 24 | */ |
| 12 | public class ClusterDefinition { | 25 | public class ClusterDefinition { |
| 13 | 26 | ||
| 14 | - private Set<DefaultControllerNode> nodes; | 27 | + private Set<NodeInfo> nodes; |
| 15 | private String ipPrefix; | 28 | private String ipPrefix; |
| 16 | 29 | ||
| 17 | /** | 30 | /** |
| 18 | * Creates a new cluster definition. | 31 | * Creates a new cluster definition. |
| 19 | - * @param nodes cluster nodes. | 32 | + * @param nodes cluster nodes information |
| 20 | - * @param ipPrefix ip prefix common to all cluster nodes. | 33 | + * @param ipPrefix ip prefix common to all cluster nodes |
| 21 | * @return cluster definition | 34 | * @return cluster definition |
| 22 | */ | 35 | */ |
| 23 | - public static ClusterDefinition from(Set<DefaultControllerNode> nodes, String ipPrefix) { | 36 | + public static ClusterDefinition from(Set<NodeInfo> nodes, String ipPrefix) { |
| 24 | ClusterDefinition definition = new ClusterDefinition(); | 37 | ClusterDefinition definition = new ClusterDefinition(); |
| 25 | definition.ipPrefix = ipPrefix; | 38 | definition.ipPrefix = ipPrefix; |
| 26 | definition.nodes = ImmutableSet.copyOf(nodes); | 39 | definition.nodes = ImmutableSet.copyOf(nodes); |
| ... | @@ -28,18 +41,18 @@ public class ClusterDefinition { | ... | @@ -28,18 +41,18 @@ public class ClusterDefinition { |
| 28 | } | 41 | } |
| 29 | 42 | ||
| 30 | /** | 43 | /** |
| 31 | - * Returns set of cluster nodes. | 44 | + * Returns set of cluster nodes info. |
| 32 | - * @return cluster nodes. | 45 | + * @return cluster nodes info |
| 33 | */ | 46 | */ |
| 34 | - public Set<DefaultControllerNode> nodes() { | 47 | + public Set<NodeInfo> getNodes() { |
| 35 | return ImmutableSet.copyOf(nodes); | 48 | return ImmutableSet.copyOf(nodes); |
| 36 | } | 49 | } |
| 37 | 50 | ||
| 38 | /** | 51 | /** |
| 39 | * Returns ipPrefix in dotted decimal notion. | 52 | * Returns ipPrefix in dotted decimal notion. |
| 40 | - * @return ip prefix. | 53 | + * @return ip prefix |
| 41 | */ | 54 | */ |
| 42 | - public String ipPrefix() { | 55 | + public String getIpPrefix() { |
| 43 | return ipPrefix; | 56 | return ipPrefix; |
| 44 | } | 57 | } |
| 45 | } | 58 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -15,25 +15,12 @@ | ... | @@ -15,25 +15,12 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.store.cluster.impl; | 16 | package org.onosproject.store.cluster.impl; |
| 17 | 17 | ||
| 18 | -import com.fasterxml.jackson.core.JsonEncoding; | 18 | +import static com.google.common.base.Preconditions.checkNotNull; |
| 19 | -import com.fasterxml.jackson.core.JsonFactory; | ||
| 20 | -import com.fasterxml.jackson.databind.JsonNode; | ||
| 21 | -import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 22 | -import com.fasterxml.jackson.databind.node.ArrayNode; | ||
| 23 | -import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 24 | -import com.fasterxml.jackson.databind.node.TextNode; | ||
| 25 | - | ||
| 26 | -import org.onosproject.cluster.DefaultControllerNode; | ||
| 27 | -import org.onosproject.cluster.NodeId; | ||
| 28 | -import org.onlab.packet.IpAddress; | ||
| 29 | 19 | ||
| 20 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 30 | import java.io.File; | 21 | import java.io.File; |
| 31 | import java.io.IOException; | 22 | import java.io.IOException; |
| 32 | -import java.util.HashSet; | ||
| 33 | -import java.util.Iterator; | ||
| 34 | -import java.util.Set; | ||
| 35 | 23 | ||
| 36 | -//Not used right now | ||
| 37 | /** | 24 | /** |
| 38 | * Allows for reading and writing cluster definition as a JSON file. | 25 | * Allows for reading and writing cluster definition as a JSON file. |
| 39 | */ | 26 | */ |
| ... | @@ -43,54 +30,32 @@ public class ClusterDefinitionStore { | ... | @@ -43,54 +30,32 @@ public class ClusterDefinitionStore { |
| 43 | 30 | ||
| 44 | /** | 31 | /** |
| 45 | * Creates a reader/writer of the cluster definition file. | 32 | * Creates a reader/writer of the cluster definition file. |
| 46 | - * | ||
| 47 | * @param filePath location of the definition file | 33 | * @param filePath location of the definition file |
| 48 | */ | 34 | */ |
| 49 | public ClusterDefinitionStore(String filePath) { | 35 | public ClusterDefinitionStore(String filePath) { |
| 50 | file = new File(filePath); | 36 | file = new File(filePath); |
| 51 | } | 37 | } |
| 52 | 38 | ||
| 53 | - /* | 39 | + /** |
| 54 | - * Returns set of the controller nodes, including self. | 40 | + * Returns the cluster definition. |
| 55 | - * | 41 | + * @return cluster definition |
| 56 | - * @return set of controller nodes | 42 | + * @throws IOException when I/O exception of some sort has occurred |
| 57 | */ | 43 | */ |
| 58 | public ClusterDefinition read() throws IOException { | 44 | public ClusterDefinition read() throws IOException { |
| 59 | - Set<DefaultControllerNode> nodes = new HashSet<>(); | ||
| 60 | ObjectMapper mapper = new ObjectMapper(); | 45 | ObjectMapper mapper = new ObjectMapper(); |
| 61 | - ObjectNode clusterNodeDef = (ObjectNode) mapper.readTree(file); | 46 | + ClusterDefinition definition = mapper.readValue(file, ClusterDefinition.class); |
| 62 | - Iterator<JsonNode> it = ((ArrayNode) clusterNodeDef.get("nodes")).elements(); | 47 | + return definition; |
| 63 | - while (it.hasNext()) { | ||
| 64 | - ObjectNode nodeDef = (ObjectNode) it.next(); | ||
| 65 | - nodes.add(new DefaultControllerNode(new NodeId(nodeDef.get("id").asText()), | ||
| 66 | - IpAddress.valueOf(nodeDef.get("ip").asText()), | ||
| 67 | - nodeDef.get("tcpPort").asInt(9876))); | ||
| 68 | - } | ||
| 69 | - String ipPrefix = clusterNodeDef.get("ipPrefix").asText(); | ||
| 70 | - | ||
| 71 | - return ClusterDefinition.from(nodes, ipPrefix); | ||
| 72 | } | 48 | } |
| 73 | 49 | ||
| 74 | - /* | 50 | + /** |
| 75 | - * Writes the given cluster definition. | 51 | + * Writes the specified cluster definition to file. |
| 76 | - * | 52 | + * @param definition cluster definition |
| 77 | - * @param cluster definition | 53 | + * @throws IOException when I/O exception of some sort has occurred |
| 78 | */ | 54 | */ |
| 79 | public void write(ClusterDefinition definition) throws IOException { | 55 | public void write(ClusterDefinition definition) throws IOException { |
| 80 | - ObjectMapper mapper = new ObjectMapper(); | 56 | + checkNotNull(definition); |
| 81 | - ObjectNode clusterNodeDef = mapper.createObjectNode(); | 57 | + // write back to file |
| 82 | - clusterNodeDef.set("ipPrefix", new TextNode(definition.ipPrefix())); | 58 | + final ObjectMapper mapper = new ObjectMapper(); |
| 83 | - ArrayNode nodeDefs = mapper.createArrayNode(); | 59 | + mapper.writeValue(file, definition); |
| 84 | - clusterNodeDef.set("nodes", nodeDefs); | ||
| 85 | - for (DefaultControllerNode node : definition.nodes()) { | ||
| 86 | - ObjectNode nodeDef = mapper.createObjectNode(); | ||
| 87 | - nodeDef.put("id", node.id().toString()) | ||
| 88 | - .put("ip", node.ip().toString()) | ||
| 89 | - .put("tcpPort", node.tcpPort()); | ||
| 90 | - nodeDefs.add(nodeDef); | ||
| 91 | - } | ||
| 92 | - mapper.writeTree(new JsonFactory().createGenerator(file, JsonEncoding.UTF8), | ||
| 93 | - clusterNodeDef); | ||
| 94 | } | 60 | } |
| 95 | - | 61 | +} |
| 96 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -127,7 +127,13 @@ public class ClusterManager implements ClusterService, ClusterAdminService { | ... | @@ -127,7 +127,13 @@ public class ClusterManager implements ClusterService, ClusterAdminService { |
| 127 | 127 | ||
| 128 | try { | 128 | try { |
| 129 | clusterDefinition = new ClusterDefinitionStore(clusterDefinitionFile.getPath()).read(); | 129 | clusterDefinition = new ClusterDefinitionStore(clusterDefinitionFile.getPath()).read(); |
| 130 | - seedNodes = ImmutableSet.copyOf(clusterDefinition.nodes()); | 130 | + seedNodes = ImmutableSet.copyOf(clusterDefinition.getNodes()) |
| 131 | + .stream() | ||
| 132 | + .map(nodeInfo -> new DefaultControllerNode( | ||
| 133 | + new NodeId(nodeInfo.getId()), | ||
| 134 | + IpAddress.valueOf(nodeInfo.getIp()), | ||
| 135 | + nodeInfo.getTcpPort())) | ||
| 136 | + .collect(Collectors.toSet()); | ||
| 131 | } catch (IOException e) { | 137 | } catch (IOException e) { |
| 132 | log.warn("Failed to read cluster definition.", e); | 138 | log.warn("Failed to read cluster definition.", e); |
| 133 | } | 139 | } |
| ... | @@ -330,11 +336,11 @@ public class ClusterManager implements ClusterService, ClusterAdminService { | ... | @@ -330,11 +336,11 @@ public class ClusterManager implements ClusterService, ClusterAdminService { |
| 330 | Enumeration<InetAddress> inetAddresses = iface.getInetAddresses(); | 336 | Enumeration<InetAddress> inetAddresses = iface.getInetAddresses(); |
| 331 | while (inetAddresses.hasMoreElements()) { | 337 | while (inetAddresses.hasMoreElements()) { |
| 332 | IpAddress ip = IpAddress.valueOf(inetAddresses.nextElement()); | 338 | IpAddress ip = IpAddress.valueOf(inetAddresses.nextElement()); |
| 333 | - if (AddressUtil.matchInterface(ip.toString(), clusterDefinition.ipPrefix())) { | 339 | + if (AddressUtil.matchInterface(ip.toString(), clusterDefinition.getIpPrefix())) { |
| 334 | return ip; | 340 | return ip; |
| 335 | } | 341 | } |
| 336 | } | 342 | } |
| 337 | } | 343 | } |
| 338 | throw new IllegalStateException("Unable to determine local ip"); | 344 | throw new IllegalStateException("Unable to determine local ip"); |
| 339 | } | 345 | } |
| 340 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 346 | +} | ... | ... |
| 1 | +/* | ||
| 2 | + * Copyright 2015 Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | +package org.onosproject.store.cluster.impl; | ||
| 17 | + | ||
| 18 | +import static com.google.common.base.MoreObjects.toStringHelper; | ||
| 19 | + | ||
| 20 | +import java.util.Objects; | ||
| 21 | + | ||
| 22 | +import org.onosproject.cluster.ControllerNode; | ||
| 23 | + | ||
| 24 | +/** | ||
| 25 | + * Node info read from configuration files during bootstrap. | ||
| 26 | + */ | ||
| 27 | +public final class NodeInfo { | ||
| 28 | + private final String id; | ||
| 29 | + private final String ip; | ||
| 30 | + private final int tcpPort; | ||
| 31 | + | ||
| 32 | + private NodeInfo(String id, String ip, int port) { | ||
| 33 | + this.id = id; | ||
| 34 | + this.ip = ip; | ||
| 35 | + this.tcpPort = port; | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + /** | ||
| 39 | + * Creates a new instance. | ||
| 40 | + * @param id node id | ||
| 41 | + * @param ip node ip address | ||
| 42 | + * @param port tcp port | ||
| 43 | + * @return NodeInfo | ||
| 44 | + */ | ||
| 45 | + public static NodeInfo from(String id, String ip, int port) { | ||
| 46 | + NodeInfo node = new NodeInfo(id, ip, port); | ||
| 47 | + return node; | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + /** | ||
| 51 | + * Returns the NodeInfo for a controller node. | ||
| 52 | + * @param node controller node | ||
| 53 | + * @return NodeInfo | ||
| 54 | + */ | ||
| 55 | + public static NodeInfo of(ControllerNode node) { | ||
| 56 | + return NodeInfo.from(node.id().toString(), node.ip().toString(), node.tcpPort()); | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + /** | ||
| 60 | + * Returns node id. | ||
| 61 | + * @return node id | ||
| 62 | + */ | ||
| 63 | + public String getId() { | ||
| 64 | + return id; | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + /** | ||
| 68 | + * Returns node ip. | ||
| 69 | + * @return node ip | ||
| 70 | + */ | ||
| 71 | + public String getIp() { | ||
| 72 | + return ip; | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + /** | ||
| 76 | + * Returns node port. | ||
| 77 | + * @return port | ||
| 78 | + */ | ||
| 79 | + public int getTcpPort() { | ||
| 80 | + return tcpPort; | ||
| 81 | + } | ||
| 82 | + | ||
| 83 | + @Override | ||
| 84 | + public int hashCode() { | ||
| 85 | + return Objects.hash(id, ip, tcpPort); | ||
| 86 | + } | ||
| 87 | + | ||
| 88 | + @Override | ||
| 89 | + public boolean equals(Object o) { | ||
| 90 | + if (this == o) { | ||
| 91 | + return true; | ||
| 92 | + } | ||
| 93 | + if (o instanceof NodeInfo) { | ||
| 94 | + NodeInfo that = (NodeInfo) o; | ||
| 95 | + return Objects.equals(this.id, that.id) && | ||
| 96 | + Objects.equals(this.ip, that.ip) && | ||
| 97 | + Objects.equals(this.tcpPort, that.tcpPort); | ||
| 98 | + } | ||
| 99 | + return false; | ||
| 100 | + } | ||
| 101 | + | ||
| 102 | + @Override | ||
| 103 | + public String toString() { | ||
| 104 | + return toStringHelper(this) | ||
| 105 | + .add("id", id) | ||
| 106 | + .add("ip", ip) | ||
| 107 | + .add("tcpPort", tcpPort).toString(); | ||
| 108 | + } | ||
| 109 | +} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseDefinition.java
0 → 100644
| 1 | +/* | ||
| 2 | + * Copyright 2015 Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | +package org.onosproject.store.consistent.impl; | ||
| 17 | + | ||
| 18 | +import java.util.Map; | ||
| 19 | +import java.util.Set; | ||
| 20 | + | ||
| 21 | +import org.onosproject.store.cluster.impl.NodeInfo; | ||
| 22 | + | ||
| 23 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
| 24 | + | ||
| 25 | +import com.google.common.collect.ImmutableMap; | ||
| 26 | +import com.google.common.collect.ImmutableSet; | ||
| 27 | + | ||
| 28 | +/** | ||
| 29 | + * Partitioned database configuration. | ||
| 30 | + */ | ||
| 31 | +public class DatabaseDefinition { | ||
| 32 | + private Map<String, Set<NodeInfo>> partitions; | ||
| 33 | + private Set<NodeInfo> nodes; | ||
| 34 | + | ||
| 35 | + /** | ||
| 36 | + * Creates a new DatabaseDefinition. | ||
| 37 | + * @param partitions partition map | ||
| 38 | + * @param nodes set of nodes | ||
| 39 | + * @return database definition | ||
| 40 | + */ | ||
| 41 | + public static DatabaseDefinition from(Map<String, Set<NodeInfo>> partitions, Set<NodeInfo> nodes) { | ||
| 42 | + checkNotNull(partitions); | ||
| 43 | + checkNotNull(nodes); | ||
| 44 | + DatabaseDefinition definition = new DatabaseDefinition(); | ||
| 45 | + definition.partitions = ImmutableMap.copyOf(partitions); | ||
| 46 | + definition.nodes = ImmutableSet.copyOf(nodes); | ||
| 47 | + return definition; | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + /** | ||
| 51 | + * Returns the map of database partitions. | ||
| 52 | + * @return db partition map | ||
| 53 | + */ | ||
| 54 | + public Map<String, Set<NodeInfo>> getPartitions() { | ||
| 55 | + return partitions; | ||
| 56 | + } | ||
| 57 | + | ||
| 58 | + /** | ||
| 59 | + * Returns the set of nodes. | ||
| 60 | + * @return nodes | ||
| 61 | + */ | ||
| 62 | + public Set<NodeInfo> getNodes() { | ||
| 63 | + return nodes; | ||
| 64 | + } | ||
| 65 | +} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -16,39 +16,16 @@ | ... | @@ -16,39 +16,16 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.store.consistent.impl; | 17 | package org.onosproject.store.consistent.impl; |
| 18 | 18 | ||
| 19 | -import static com.google.common.base.Preconditions.checkArgument; | ||
| 20 | import static com.google.common.base.Preconditions.checkNotNull; | 19 | import static com.google.common.base.Preconditions.checkNotNull; |
| 21 | -import static org.slf4j.LoggerFactory.getLogger; | ||
| 22 | - | ||
| 23 | import java.io.File; | 20 | import java.io.File; |
| 24 | import java.io.IOException; | 21 | import java.io.IOException; |
| 25 | -import java.util.HashMap; | ||
| 26 | -import java.util.HashSet; | ||
| 27 | -import java.util.Iterator; | ||
| 28 | -import java.util.Map; | ||
| 29 | -import java.util.Map.Entry; | ||
| 30 | -import java.util.Set; | ||
| 31 | - | ||
| 32 | -import org.onosproject.cluster.DefaultControllerNode; | ||
| 33 | -import org.onosproject.cluster.NodeId; | ||
| 34 | -import org.onlab.packet.IpAddress; | ||
| 35 | -import org.slf4j.Logger; | ||
| 36 | - | ||
| 37 | -import com.fasterxml.jackson.core.JsonEncoding; | ||
| 38 | -import com.fasterxml.jackson.core.JsonFactory; | ||
| 39 | -import com.fasterxml.jackson.databind.JsonNode; | ||
| 40 | import com.fasterxml.jackson.databind.ObjectMapper; | 22 | import com.fasterxml.jackson.databind.ObjectMapper; |
| 41 | -import com.fasterxml.jackson.databind.node.ArrayNode; | ||
| 42 | -import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 43 | -import com.google.common.collect.Maps; | ||
| 44 | 23 | ||
| 45 | /** | 24 | /** |
| 46 | * Allows for reading and writing partitioned database definition as a JSON file. | 25 | * Allows for reading and writing partitioned database definition as a JSON file. |
| 47 | */ | 26 | */ |
| 48 | public class DatabaseDefinitionStore { | 27 | public class DatabaseDefinitionStore { |
| 49 | 28 | ||
| 50 | - private final Logger log = getLogger(getClass()); | ||
| 51 | - | ||
| 52 | private final File definitionfile; | 29 | private final File definitionfile; |
| 53 | 30 | ||
| 54 | /** | 31 | /** |
| ... | @@ -57,7 +34,7 @@ public class DatabaseDefinitionStore { | ... | @@ -57,7 +34,7 @@ public class DatabaseDefinitionStore { |
| 57 | * @param filePath location of the definition file | 34 | * @param filePath location of the definition file |
| 58 | */ | 35 | */ |
| 59 | public DatabaseDefinitionStore(String filePath) { | 36 | public DatabaseDefinitionStore(String filePath) { |
| 60 | - definitionfile = new File(filePath); | 37 | + definitionfile = new File(checkNotNull(filePath)); |
| 61 | } | 38 | } |
| 62 | 39 | ||
| 63 | /** | 40 | /** |
| ... | @@ -70,72 +47,27 @@ public class DatabaseDefinitionStore { | ... | @@ -70,72 +47,27 @@ public class DatabaseDefinitionStore { |
| 70 | } | 47 | } |
| 71 | 48 | ||
| 72 | /** | 49 | /** |
| 73 | - * Returns the Map from database partition name to set of initial active member nodes. | 50 | + * Returns the database definition. |
| 74 | * | 51 | * |
| 75 | - * @return Map from partition name to set of active member nodes | 52 | + * @return database definition |
| 76 | * @throws IOException when I/O exception of some sort has occurred. | 53 | * @throws IOException when I/O exception of some sort has occurred. |
| 77 | */ | 54 | */ |
| 78 | - public Map<String, Set<DefaultControllerNode>> read() throws IOException { | 55 | + public DatabaseDefinition read() throws IOException { |
| 79 | - | 56 | + ObjectMapper mapper = new ObjectMapper(); |
| 80 | - final Map<String, Set<DefaultControllerNode>> partitions = Maps.newHashMap(); | 57 | + DatabaseDefinition definition = mapper.readValue(definitionfile, DatabaseDefinition.class); |
| 81 | - | 58 | + return definition; |
| 82 | - final ObjectMapper mapper = new ObjectMapper(); | ||
| 83 | - final ObjectNode tabletNodes = (ObjectNode) mapper.readTree(definitionfile); | ||
| 84 | - final Iterator<Entry<String, JsonNode>> fields = tabletNodes.fields(); | ||
| 85 | - while (fields.hasNext()) { | ||
| 86 | - final Entry<String, JsonNode> next = fields.next(); | ||
| 87 | - final Set<DefaultControllerNode> nodes = new HashSet<>(); | ||
| 88 | - final Iterator<JsonNode> elements = next.getValue().elements(); | ||
| 89 | - while (elements.hasNext()) { | ||
| 90 | - ObjectNode nodeDef = (ObjectNode) elements.next(); | ||
| 91 | - nodes.add(new DefaultControllerNode(new NodeId(nodeDef.get("id").asText()), | ||
| 92 | - IpAddress.valueOf(nodeDef.get("ip").asText()), | ||
| 93 | - nodeDef.get("tcpPort").asInt(DatabaseManager.COPYCAT_TCP_PORT))); | ||
| 94 | - } | ||
| 95 | - | ||
| 96 | - partitions.put(next.getKey(), nodes); | ||
| 97 | - } | ||
| 98 | - return partitions; | ||
| 99 | } | 59 | } |
| 100 | 60 | ||
| 101 | /** | 61 | /** |
| 102 | - * Updates the Map from database partition name to set of member nodes. | 62 | + * Writes the specified database definition to file. |
| 103 | * | 63 | * |
| 104 | - * @param partitionName name of the database partition to update | 64 | + * @param definition database definition |
| 105 | - * @param nodes set of initial member nodes | ||
| 106 | * @throws IOException when I/O exception of some sort has occurred. | 65 | * @throws IOException when I/O exception of some sort has occurred. |
| 107 | */ | 66 | */ |
| 108 | - public void write(String partitionName, Set<DefaultControllerNode> nodes) throws IOException { | 67 | + public void write(DatabaseDefinition definition) throws IOException { |
| 109 | - checkNotNull(partitionName); | 68 | + checkNotNull(definition); |
| 110 | - checkArgument(partitionName.isEmpty(), "Partition name cannot be empty"); | ||
| 111 | - | ||
| 112 | - // load current | ||
| 113 | - Map<String, Set<DefaultControllerNode>> config; | ||
| 114 | - try { | ||
| 115 | - config = read(); | ||
| 116 | - } catch (IOException e) { | ||
| 117 | - log.info("Reading partition config failed, assuming empty definition."); | ||
| 118 | - config = new HashMap<>(); | ||
| 119 | - } | ||
| 120 | - // update with specified | ||
| 121 | - config.put(partitionName, nodes); | ||
| 122 | - | ||
| 123 | // write back to file | 69 | // write back to file |
| 124 | final ObjectMapper mapper = new ObjectMapper(); | 70 | final ObjectMapper mapper = new ObjectMapper(); |
| 125 | - final ObjectNode partitionNodes = mapper.createObjectNode(); | 71 | + mapper.writeValue(definitionfile, definition); |
| 126 | - for (Entry<String, Set<DefaultControllerNode>> tablet : config.entrySet()) { | ||
| 127 | - ArrayNode nodeDefs = mapper.createArrayNode(); | ||
| 128 | - partitionNodes.set(tablet.getKey(), nodeDefs); | ||
| 129 | - | ||
| 130 | - for (DefaultControllerNode node : tablet.getValue()) { | ||
| 131 | - ObjectNode nodeDef = mapper.createObjectNode(); | ||
| 132 | - nodeDef.put("id", node.id().toString()) | ||
| 133 | - .put("ip", node.ip().toString()) | ||
| 134 | - .put("tcpPort", node.tcpPort()); | ||
| 135 | - nodeDefs.add(nodeDef); | ||
| 136 | - } | ||
| 137 | - } | ||
| 138 | - mapper.writeTree(new JsonFactory().createGenerator(definitionfile, JsonEncoding.UTF8), | ||
| 139 | - partitionNodes); | ||
| 140 | } | 72 | } |
| 141 | } | 73 | } | ... | ... |
| ... | @@ -31,8 +31,7 @@ import org.apache.felix.scr.annotations.Reference; | ... | @@ -31,8 +31,7 @@ import org.apache.felix.scr.annotations.Reference; |
| 31 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 31 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
| 32 | import org.apache.felix.scr.annotations.Service; | 32 | import org.apache.felix.scr.annotations.Service; |
| 33 | import org.onosproject.cluster.ClusterService; | 33 | import org.onosproject.cluster.ClusterService; |
| 34 | -import org.onosproject.cluster.ControllerNode; | 34 | +import org.onosproject.store.cluster.impl.NodeInfo; |
| 35 | -import org.onosproject.cluster.DefaultControllerNode; | ||
| 36 | import org.onosproject.store.service.ConsistentMap; | 35 | import org.onosproject.store.service.ConsistentMap; |
| 37 | import org.onosproject.store.service.PartitionInfo; | 36 | import org.onosproject.store.service.PartitionInfo; |
| 38 | import org.onosproject.store.service.Serializer; | 37 | import org.onosproject.store.service.Serializer; |
| ... | @@ -69,8 +68,8 @@ public class DatabaseManager implements StorageService, StorageAdminService { | ... | @@ -69,8 +68,8 @@ public class DatabaseManager implements StorageService, StorageAdminService { |
| 69 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 68 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 70 | protected ClusterService clusterService; | 69 | protected ClusterService clusterService; |
| 71 | 70 | ||
| 72 | - protected String nodeToUri(ControllerNode node) { | 71 | + protected String nodeToUri(NodeInfo node) { |
| 73 | - return String.format("tcp://%s:%d", node.ip(), COPYCAT_TCP_PORT); | 72 | + return String.format("tcp://%s:%d", node.getIp(), COPYCAT_TCP_PORT); |
| 74 | } | 73 | } |
| 75 | 74 | ||
| 76 | @Activate | 75 | @Activate |
| ... | @@ -82,12 +81,11 @@ public class DatabaseManager implements StorageService, StorageAdminService { | ... | @@ -82,12 +81,11 @@ public class DatabaseManager implements StorageService, StorageAdminService { |
| 82 | File file = new File(CONFIG_DIR, PARTITION_DEFINITION_FILE); | 81 | File file = new File(CONFIG_DIR, PARTITION_DEFINITION_FILE); |
| 83 | log.info("Loading database definition: {}", file.getAbsolutePath()); | 82 | log.info("Loading database definition: {}", file.getAbsolutePath()); |
| 84 | 83 | ||
| 85 | - DatabaseDefinitionStore databaseDef = new DatabaseDefinitionStore(file); | 84 | + Map<String, Set<NodeInfo>> partitionMap; |
| 86 | - Map<String, Set<DefaultControllerNode>> partitionMap; | ||
| 87 | try { | 85 | try { |
| 88 | - partitionMap = databaseDef.read(); | 86 | + DatabaseDefinitionStore databaseDef = new DatabaseDefinitionStore(file); |
| 87 | + partitionMap = databaseDef.read().getPartitions(); | ||
| 89 | } catch (IOException e) { | 88 | } catch (IOException e) { |
| 90 | - log.error("Failed to load database config {}", file); | ||
| 91 | throw new IllegalStateException("Failed to load database config", e); | 89 | throw new IllegalStateException("Failed to load database config", e); |
| 92 | } | 90 | } |
| 93 | 91 | ||
| ... | @@ -99,7 +97,7 @@ public class DatabaseManager implements StorageService, StorageAdminService { | ... | @@ -99,7 +97,7 @@ public class DatabaseManager implements StorageService, StorageAdminService { |
| 99 | .map(this::nodeToUri) | 97 | .map(this::nodeToUri) |
| 100 | .toArray(String[]::new); | 98 | .toArray(String[]::new); |
| 101 | 99 | ||
| 102 | - String localNodeUri = nodeToUri(clusterService.getLocalNode()); | 100 | + String localNodeUri = nodeToUri(NodeInfo.of(clusterService.getLocalNode())); |
| 103 | 101 | ||
| 104 | ClusterConfig clusterConfig = new ClusterConfig() | 102 | ClusterConfig clusterConfig = new ClusterConfig() |
| 105 | .withProtocol(new NettyTcpProtocol() | 103 | .withProtocol(new NettyTcpProtocol() | ... | ... |
| ... | @@ -39,18 +39,7 @@ ssh $remote " | ... | @@ -39,18 +39,7 @@ ssh $remote " |
| 39 | 39 | ||
| 40 | # Generate a default tablets.json from the ON* environment variables | 40 | # Generate a default tablets.json from the ON* environment variables |
| 41 | TDEF_FILE=/tmp/${remote}.tablets.json | 41 | TDEF_FILE=/tmp/${remote}.tablets.json |
| 42 | -nodes=( $(env | sort | egrep "OC[0-9]+" | cut -d= -f2) ) | 42 | +onos-gen-partitions $TDEF_FILE |
| 43 | -echo "{ \"default\":[" > $TDEF_FILE | ||
| 44 | -while [ ${#nodes[@]} -gt 0 ]; do | ||
| 45 | - node=${nodes[0]} | ||
| 46 | - nodes=( ${nodes[@]:1} ) | ||
| 47 | - if [ "${#nodes[@]}" -ne "0" ]; then | ||
| 48 | - echo " { \"id\": \"$node\", \"ip\": \"$node\", \"tcpPort\": 9876 }," >> $TDEF_FILE | ||
| 49 | - else | ||
| 50 | - echo " { \"id\": \"$node\", \"ip\": \"$node\", \"tcpPort\": 9876 }" >> $TDEF_FILE | ||
| 51 | - fi | ||
| 52 | -done | ||
| 53 | -echo "]}" >> $TDEF_FILE | ||
| 54 | scp -q $TDEF_FILE $remote:$ONOS_INSTALL_DIR/config/tablets.json | 43 | scp -q $TDEF_FILE $remote:$ONOS_INSTALL_DIR/config/tablets.json |
| 55 | 44 | ||
| 56 | 45 | ... | ... |
-
Please register or login to post a comment