Merge pull request #14854 from wanyaoqi/fix/host-get-free-pots

fix(host): get unused port
This commit is contained in:
Zexi Li
2022-08-30 11:37:14 +08:00
committed by GitHub
4 changed files with 66 additions and 26 deletions
+2 -6
View File
@@ -20,7 +20,7 @@ import (
api "yunion.io/x/onecloud/pkg/apis/compute"
)
type SGuestPorjectDesc struct {
type SGuestProjectDesc struct {
Tenant string
TenantId string
DomainId string
@@ -279,10 +279,6 @@ type UsbRedir struct {
}
type SGuestVdi struct {
// Protocol string
// Port int
// Password string
Spice *SSpiceDesc
}
@@ -299,7 +295,7 @@ type SGuestPvScsi struct {
}
type SGuestDesc struct {
SGuestPorjectDesc
SGuestProjectDesc
SGuestRegionDesc
SGuestControlDesc
SGuestHardwareDesc
+46 -8
View File
@@ -56,8 +56,10 @@ import (
)
var (
LAST_USED_PORT = 0
NbdWorker = appsrv.NewWorkerManager("nbd_worker", 1, appsrv.DEFAULT_BACKLOG, false)
LAST_USED_PORT = 0
LAST_USED_NBD_SERVER_PORT = 0
LAST_USED_MIGRATE_PORT = 0
NbdWorker = appsrv.NewWorkerManager("nbd_worker", 1, appsrv.DEFAULT_BACKLOG, false)
)
const (
@@ -77,6 +79,7 @@ type SGuestManager struct {
CandidateServers map[string]*SKVMGuestInstance
UnknownServers *sync.Map
ServersLock *sync.Mutex
portsInUse *sync.Map
GuestStartWorker *appsrv.SWorkerManager
@@ -92,6 +95,7 @@ func NewGuestManager(host hostutils.IHost, serversPath string) *SGuestManager {
manager.host = host
manager.ServersPath = serversPath
manager.Servers = new(sync.Map)
manager.portsInUse = new(sync.Map)
manager.CandidateServers = make(map[string]*SKVMGuestInstance, 0)
manager.UnknownServers = new(sync.Map)
manager.ServersLock = &sync.Mutex{}
@@ -963,15 +967,46 @@ func (m *SGuestManager) CanMigrate(sid string) bool {
return true
}
func (m *SGuestManager) checkAndSetPort(port int) bool {
_, loaded := m.portsInUse.LoadOrStore(port, struct{}{})
return !loaded
}
func (m *SGuestManager) unsetPort(port int) {
m.portsInUse.Delete(port)
}
func (m *SGuestManager) GetFreePortByBase(basePort int) int {
var port = 1
for {
if netutils2.IsTcpPortUsed("0.0.0.0", basePort+port) {
port += 1
} else {
return basePort + port
if !m.checkAndSetPort(basePort + port) {
continue
}
break
}
}
return port + basePort
}
func (m *SGuestManager) GetLiveMigrateFreePort() int {
port := m.GetFreePortByBase(LIVE_MIGRATE_PORT_BASE + LAST_USED_MIGRATE_PORT)
LAST_USED_MIGRATE_PORT = port - LIVE_MIGRATE_PORT_BASE
if LAST_USED_MIGRATE_PORT > 5000 {
LAST_USED_MIGRATE_PORT = 0
}
return port
}
func (m *SGuestManager) GetNBDServerFreePort() int {
port := m.GetFreePortByBase(BUILT_IN_NBD_SERVER_PORT_BASE + LAST_USED_NBD_SERVER_PORT)
LAST_USED_NBD_SERVER_PORT = port - BUILT_IN_NBD_SERVER_PORT_BASE
if LAST_USED_NBD_SERVER_PORT > 5000 {
LAST_USED_NBD_SERVER_PORT = 0
}
return port
}
func (m *SGuestManager) GetFreeVncPort() int {
@@ -986,12 +1021,15 @@ func (m *SGuestManager) GetFreeVncPort() int {
})
var port = LAST_USED_PORT + 1
for {
if _, ok := vncPorts[port]; !ok &&
!netutils2.IsTcpPortUsed("0.0.0.0", VNC_PORT_BASE+port) &&
!netutils2.IsTcpPortUsed("127.0.0.1", MONITOR_PORT_BASE+port) {
break
} else {
if _, ok := vncPorts[port]; ok ||
netutils2.IsTcpPortUsed("0.0.0.0", VNC_PORT_BASE+port) ||
netutils2.IsTcpPortUsed("127.0.0.1", MONITOR_PORT_BASE+port) {
port += 1
} else {
if !m.checkAndSetPort(port) {
continue
}
break
}
}
LAST_USED_PORT = port
+15 -5
View File
@@ -463,6 +463,7 @@ func (s *SKVMGuestInstance) asyncScriptStart(ctx context.Context, params interfa
tried += 1
vncPort := s.manager.GetFreeVncPort()
defer s.manager.unsetPort(vncPort)
log.Infof("Use vnc port %d", vncPort)
if err = s.saveVncPort(vncPort); err != nil {
goto finally
@@ -470,7 +471,15 @@ func (s *SKVMGuestInstance) asyncScriptStart(ctx context.Context, params interfa
data.Set("vnc_port", jsonutils.NewInt(int64(vncPort)))
}
if err = s.saveScripts(data); err != nil {
// get live migrate listen port
if jsonutils.QueryBoolean(data, "need_migrate", false) || s.Desc.IsSlave {
migratePort := s.manager.GetLiveMigrateFreePort()
defer s.manager.unsetPort(migratePort)
data.Set("live_migrate_port", jsonutils.NewInt(int64(migratePort)))
}
err = s.saveScripts(data)
if err != nil {
goto finally
} else {
err = s.scriptStart()
@@ -987,7 +996,8 @@ func (s *SKVMGuestInstance) startDiskBackupMirror(ctx context.Context) {
func (s *SKVMGuestInstance) startQemuBuiltInNbdServer(ctx context.Context) {
if ctx != nil && len(appctx.AppContextTaskId(ctx)) > 0 {
nbdServerPort := s.manager.GetFreePortByBase(BUILT_IN_NBD_SERVER_PORT_BASE)
nbdServerPort := s.manager.GetNBDServerFreePort()
defer s.manager.unsetPort(nbdServerPort)
var onNbdServerStarted = func(res string) {
if len(res) > 0 {
log.Errorf("Start Qemu Builtin nbd server error %s", res)
@@ -1730,9 +1740,9 @@ func (s *SKVMGuestInstance) SyncConfig(
return nil, nil
}
vncPort := s.GetVncPort()
data := jsonutils.NewDict()
data.Set("vnc_port", jsonutils.NewInt(int64(vncPort)))
// vncPort := s.GetVncPort()
// data := jsonutils.NewDict()
// data.Set("vnc_port", jsonutils.NewInt(int64(vncPort)))
//s.saveScripts(data)
if fwOnly {
+3 -7
View File
@@ -422,20 +422,16 @@ function nic_mtu() {
input.IsKVMSupport = s.IsKvmSupport()
input.ExtraOptions = append(input.ExtraOptions, s.extraOptions())
liveMigratePort, _ := data.Int("live_migrate_port")
if jsonutils.QueryBoolean(data, "need_migrate", false) {
input.NeedMigrate = true
migratePort := s.manager.GetFreePortByBase(LIVE_MIGRATE_PORT_BASE)
s.LiveMigrateDestPort = &migratePort
input.LiveMigratePort = uint(migratePort)
input.LiveMigratePort = uint(liveMigratePort)
if jsonutils.QueryBoolean(data, "live_migrate_use_tls", false) {
s.LiveMigrateUseTls = true
input.LiveMigrateUseTLS = true
}
} else if s.Desc.IsSlave {
//input.IsSlave = true
input.LiveMigratePort = uint(s.manager.GetFreePortByBase(LIVE_MIGRATE_PORT_BASE))
} else if s.Desc.IsMaster {
//input.IsMaster = true
input.LiveMigratePort = uint(liveMigratePort)
}
qemuOpts, err := qemu.GenerateStartOptions(input)