From 38ab26bcb006965c82ebe7031624f3e8bf522ca9 Mon Sep 17 00:00:00 2001 From: Frank Date: Mon, 24 Jan 2011 13:47:03 -0800 Subject: [PATCH] ovs tunnel network -- add lock entry in ovs_tunnel_account --- .../network/ovs/OvsCreateTunnelAnswer.java | 32 +++++++++++++++++-- .../network/ovs/OvsCreateTunnelCommand.java | 10 +++++- core/.classpath | 2 +- .../xen/resource/CitrixResourceBase.java | 11 ++++--- .../network/ovs/OvsTunnelManagerImpl.java | 31 +++++++++++------- setup/db/create-schema.sql | 2 ++ 6 files changed, 67 insertions(+), 21 deletions(-) diff --git a/api/src/com/cloud/network/ovs/OvsCreateTunnelAnswer.java b/api/src/com/cloud/network/ovs/OvsCreateTunnelAnswer.java index 999228b262e..3c4cc45aef4 100644 --- a/api/src/com/cloud/network/ovs/OvsCreateTunnelAnswer.java +++ b/api/src/com/cloud/network/ovs/OvsCreateTunnelAnswer.java @@ -9,17 +9,27 @@ public class OvsCreateTunnelAnswer extends Answer { long account; String inPortName; - public OvsCreateTunnelAnswer(Command cmd, boolean success, String details) { + //for debug info + String fromIp; + String toIp; + String key; + String bridge; + + public OvsCreateTunnelAnswer(Command cmd, boolean success, String details, String bridge) { super(cmd, success, details); OvsCreateTunnelCommand c = (OvsCreateTunnelCommand)cmd; from = c.getFrom(); to = c.getTo(); account = c.getAccount(); inPortName = "[]"; + fromIp = c.getFromIp(); + toIp = c.getRemoteIp(); + key = c.getKey(); + this.bridge = bridge; } - public OvsCreateTunnelAnswer(Command cmd, boolean success, String details, String inPortName) { - this(cmd, success, details); + public OvsCreateTunnelAnswer(Command cmd, boolean success, String details, String inPortName, String bridge) { + this(cmd, success, details, bridge); this.inPortName = inPortName; } @@ -39,4 +49,20 @@ public class OvsCreateTunnelAnswer extends Answer { public String getInPortName() { return inPortName; } + + public String getFromIp() { + return fromIp; + } + + public String getToIp() { + return toIp; + } + + public String getKey() { + return key; + } + + public String getBridge() { + return bridge; + } } diff --git a/api/src/com/cloud/network/ovs/OvsCreateTunnelCommand.java b/api/src/com/cloud/network/ovs/OvsCreateTunnelCommand.java index b31a27ce324..8ac772d07e2 100644 --- a/api/src/com/cloud/network/ovs/OvsCreateTunnelCommand.java +++ b/api/src/com/cloud/network/ovs/OvsCreateTunnelCommand.java @@ -9,17 +9,21 @@ public class OvsCreateTunnelCommand extends Command { Long to; long account; + //for debug info + String fromIp; + @Override public boolean executeInSequence() { return true; } - public OvsCreateTunnelCommand(String remoteIp, String key, Long from, Long to, long account) { + public OvsCreateTunnelCommand(String remoteIp, String key, Long from, Long to, long account, String fromIp) { this.remoteIp = remoteIp; this.key = key; this.from = from; this.to = to; this.account = account; + this.fromIp = fromIp; } public String getKey() { @@ -41,5 +45,9 @@ public class OvsCreateTunnelCommand extends Command { public long getAccount() { return account; } + + public String getFromIp() { + return fromIp; + } } diff --git a/core/.classpath b/core/.classpath index 27c5aa6a984..477d9aa9447 100644 --- a/core/.classpath +++ b/core/.classpath @@ -38,7 +38,7 @@ - + diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index afc588ba41c..a940bb44c1d 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -4020,25 +4020,26 @@ public abstract class CitrixResourceBase implements ServerResource { private OvsCreateTunnelAnswer execute(OvsCreateTunnelCommand cmd) { Connection conn = getConnection(); + String bridge = "unknown"; try { Network nw = createTunnelNetwork(conn, cmd.getAccount()); if (nw == null) { - return new OvsCreateTunnelAnswer(cmd, false, "Cannot create network"); + return new OvsCreateTunnelAnswer(cmd, false, "Cannot create network", bridge); } - String bridge = nw.getBridge(conn); + bridge = nw.getBridge(conn); String result = callHostPlugin(conn, "ovstunnel", "create_tunnel", "bridge", bridge, "remote_ip", cmd.getRemoteIp(), "key", cmd.getKey(), "from", cmd.getFrom().toString(), "to", cmd .getTo().toString()); String[] res = result.split(":"); if (res.length == 2 && res[0].equalsIgnoreCase("SUCCESS")) { - return new OvsCreateTunnelAnswer(cmd, true, result, res[1]); + return new OvsCreateTunnelAnswer(cmd, true, result, res[1], bridge); } else { - return new OvsCreateTunnelAnswer(cmd, false, result); + return new OvsCreateTunnelAnswer(cmd, false, result, bridge); } } catch (Exception e) { s_logger.warn("caught execption when creating ovs tunnel", e); - return new OvsCreateTunnelAnswer(cmd, false, e.getMessage()); + return new OvsCreateTunnelAnswer(cmd, false, e.getMessage(), bridge); } } diff --git a/server/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java b/server/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java index 5c909876d49..62fe0fac035 100644 --- a/server/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java +++ b/server/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java @@ -78,7 +78,13 @@ public class OvsTunnelManagerImpl implements OvsTunnelManager { try { key = _tunnelDao.askKey(from, to); ta = new OvsTunnelAccountVO(from, to, key, account); + OvsTunnelAccountVO lock = _tunnelAccountDao.acquireInLockTable(Long.valueOf(1)); + if (lock == null) { + s_logger.warn("Cannot lock table ovs_tunnel_account"); + return -1; + } _tunnelAccountDao.persist(ta); + _tunnelAccountDao.releaseFromLockTable(lock.getId()); } catch (EntityExistsException e) { ta = _tunnelAccountDao.getByFromToAccount(from, to, account); if (ta == null) { @@ -93,12 +99,9 @@ public class OvsTunnelManagerImpl implements OvsTunnelManager { private void handleCreateTunnelAnswer(Answer[] answers){ OvsCreateTunnelAnswer r = (OvsCreateTunnelAnswer) answers[0]; - /* String s = String.format( - "(hostIP:%1$s, remoteIP:%2$s, bridge:%3$s, greKey:%4$s)", - r.getHostIp(), r.getRemoteIp(), r.getBridge(), r.getKey()); - */ - String s = "hi"; + "(hostIP:%1$s, remoteIP:%2$s, bridge:%3$s, greKey:%4$s, portName:%5$s)", + r.getFromIp(), r.getToIp(), r.getBridge(), r.getKey(), r.getInPortName()); Long from = r.getFrom(); Long to = r.getTo(); long account = r.getAccount(); @@ -109,13 +112,11 @@ public class OvsTunnelManagerImpl implements OvsTunnelManager { if (!r.getResult()) { ta.setState("FAILED"); - s_logger.warn("Create GRE tunnel failed due to " + r.getDetails() - + s); + s_logger.warn("Create GRE tunnel failed due to " + r.getDetails() + s); } else { ta.setState("SUCCESS"); ta.setPortName(r.getInPortName()); - s_logger.warn("Create GRE tunnel Success " + r.getDetails() - + s); + s_logger.warn("Create GRE tunnel " + r.getDetails() + s); } _tunnelAccountDao.update(ta.getId(), ta); } @@ -182,15 +183,16 @@ public class OvsTunnelManagerImpl implements OvsTunnelManager { for (Pair i : toHosts) { HostVO rHost = _hostDao.findById(i.first()); Commands cmds = new Commands( - new OvsCreateTunnelCommand(rHost.getPrivateIpAddress(), i.second().toString(), Long.valueOf(hostId), i.first(), accountId)); + new OvsCreateTunnelCommand(rHost.getPrivateIpAddress(), i.second().toString(), Long.valueOf(hostId), i.first(), accountId, myIp)); s_logger.debug("Ask host " + hostId + " to create gre tunnel to " + i.first()); Answer[] answers = _agentMgr.send(hostId, cmds); handleCreateTunnelAnswer(answers); } for (Pair i : fromHosts) { + HostVO rHost = _hostDao.findById(i.first()); Commands cmd2s = new Commands( - new OvsCreateTunnelCommand(myIp, i.second().toString(), i.first(), Long.valueOf(hostId), accountId)); + new OvsCreateTunnelCommand(myIp, i.second().toString(), i.first(), Long.valueOf(hostId), accountId, rHost.getPrivateIpAddress())); s_logger.debug("Ask host " + i.first() + " to create gre tunnel to " + hostId); Answer[] answers = _agentMgr.send(i.first(), cmd2s); handleCreateTunnelAnswer(answers); @@ -234,11 +236,18 @@ public class OvsTunnelManagerImpl implements OvsTunnelManager { String toStr = (to == 0 ? "all peers" : Long.toString(to)); if (ans.getResult()) { + OvsTunnelAccountVO lock = _tunnelAccountDao.acquireInLockTable(Long.valueOf(1)); + if (lock == null) { + s_logger.warn(String.format("failed to lock ovs_tunnel_account, remove record of tunnel(from=%1$s, to=%2$s account=%3$s) failed", from, to, account)); + return; + } + if (to == 0) { _tunnelAccountDao.removeByFromAccount(from, account); } else { _tunnelAccountDao.removeByFromToAccount(from, to, account); } + _tunnelAccountDao.releaseFromLockTable(lock.getId()); s_logger.debug(String.format("Destroy tunnel(account:%1$s, from:%2$s, to:%3$s) successful", account, from, toStr)); } else { diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index b22475d1636..dfc6181278f 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -1395,6 +1395,8 @@ CREATE TABLE `cloud`.`ovs_tunnel_account`( PRIMARY KEY(`from`, `to`, `account`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +INSERT INTO `cloud`.`ovs_tunnel_account` (`from`, `to`, `account`, `key`, `port_name`, `state`) VALUES (0, 0, 0, 0, 'lock', 'SUCCESS'); + CREATE TABLE `cloud`.`ovs_vlan_mapping_dirty`( `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, `account_id` bigint unsigned COMMENT 'account id',