mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-10-24 02:26:39 +08:00
Merge pull request #14854 from wanyaoqi/fix/host-get-free-pots
fix(host): get unused port
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user