Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
R
railgun-routing-server
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Railgun
railgun-routing-server
Commits
48e2efa5
You need to sign in or sign up before continuing.
Commit
48e2efa5
authored
Aug 31, 2022
by
神楽坂玲奈
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
plan
parent
8ec21ed7
Pipeline
#16305
passed with stages
in 3 minutes and 9 seconds
Changes
2
Pipelines
1
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
49 additions
and
31 deletions
+49
-31
server/protocol.ts
server/protocol.ts
+1
-1
server/src/Router.ts
server/src/Router.ts
+48
-30
No files found.
server/protocol.ts
View file @
48e2efa5
...
@@ -17,7 +17,7 @@ export interface Report {
...
@@ -17,7 +17,7 @@ export interface Report {
export
interface
Change
{
export
interface
Change
{
seq
:
number
,
seq
:
number
,
via
:
Record
<
number
,
number
>
,
via
:
Record
<
number
,
number
>
,
//
plan: Record<number, number>
plan
:
Record
<
number
,
number
>
}
}
// 路由器向路由器发送的消息
// 路由器向路由器发送的消息
...
...
server/src/Router.ts
View file @
48e2efa5
...
@@ -6,28 +6,30 @@ import assert from 'assert';
...
@@ -6,28 +6,30 @@ import assert from 'assert';
import
{
Quality
}
from
'
./Quality
'
;
import
{
Quality
}
from
'
./Quality
'
;
import
_
from
'
lodash
'
;
import
_
from
'
lodash
'
;
import
config
from
'
../config/config.json
'
;
import
config
from
'
../config/config.json
'
;
import
gatewayGroups
from
'
../import/data/GatewayGroup.json
'
;
import
_connections
from
'
../import/connections.json
'
;
import
_connections
from
'
../import/connections.json
'
;
import
{
GatewayGroup
}
from
'
../import/scripts/GatewayGroup
'
;
const
connections
:
Record
<
number
,
Record
<
number
,
{
metric
:
number
,
protocol
:
string
}
>>
=
_connections
;
const
connections
:
Record
<
number
,
Record
<
number
,
{
metric
:
number
;
protocol
:
string
}
>>
=
_connections
;
export
class
Router
{
export
class
Router
{
static
all
:
Router
[]
=
routers
.
map
(
s
=>
new
Router
(
s
.
id
));
static
all
:
Router
[]
=
routers
.
map
(
(
s
)
=>
new
Router
(
s
.
id
));
static
updating
?:
{
static
updating
?:
{
router
:
Router
,
router
:
Router
;
message
:
Change
message
:
Change
;
};
};
static
groups
:
Record
<
number
,
Router
[]
>
;
seq
=
0
;
seq
=
0
;
peers
:
Record
<
number
,
PeerQuality
>
=
{};
peers
:
Record
<
number
,
PeerQuality
>
=
{};
via
:
Map
<
Router
,
Router
>
=
new
Map
();
via
:
Map
<
Router
,
Router
>
=
new
Map
();
//
plan: Record<number, number> = {};
plan
:
Record
<
number
,
number
>
=
{};
time
:
number
=
0
;
time
:
number
=
0
;
rinfo
?:
RemoteInfo
;
rinfo
?:
RemoteInfo
;
constructor
(
public
id
:
number
)
{
constructor
(
public
id
:
number
)
{}
}
static
update
(
socket
:
Socket
)
{
static
update
(
socket
:
Socket
)
{
for
(
const
from
of
Router
.
all
)
from
.
update
(
socket
);
for
(
const
from
of
Router
.
all
)
from
.
update
(
socket
);
...
@@ -36,7 +38,7 @@ export class Router {
...
@@ -36,7 +38,7 @@ export class Router {
reset
()
{
reset
()
{
this
.
seq
=
0
;
this
.
seq
=
0
;
this
.
peers
=
{};
this
.
peers
=
{};
for
(
const
router
of
Router
.
all
.
filter
(
r
=>
r
.
id
!==
this
.
id
))
{
for
(
const
router
of
Router
.
all
.
filter
(
(
r
)
=>
r
.
id
!==
this
.
id
))
{
this
.
via
.
set
(
router
,
router
);
this
.
via
.
set
(
router
,
router
);
}
}
if
(
Router
.
updating
?.
router
==
this
)
Router
.
updating
=
undefined
;
if
(
Router
.
updating
?.
router
==
this
)
Router
.
updating
=
undefined
;
...
@@ -54,13 +56,15 @@ export class Router {
...
@@ -54,13 +56,15 @@ export class Router {
Router
.
updating
=
undefined
;
Router
.
updating
=
undefined
;
Router
.
update
(
socket
);
Router
.
update
(
socket
);
}
}
}
else
if
(
data
.
ack
===
0
)
{
// 客户端重启
}
else
if
(
data
.
ack
===
0
)
{
// 客户端重启
this
.
reset
();
this
.
reset
();
this
.
time
=
Date
.
now
();
this
.
time
=
Date
.
now
();
this
.
send
(
socket
,
{
seq
:
this
.
seq
,
via
:
{}
});
this
.
send
(
socket
,
{
seq
:
this
.
seq
,
via
:
{},
plan
:
{}
});
}
else
if
(
this
.
seq
==
0
)
{
// 服务器重启或客户端下线
}
else
if
(
this
.
seq
==
0
)
{
// 服务器重启或客户端下线
this
.
time
=
Date
.
now
();
this
.
time
=
Date
.
now
();
this
.
send
(
socket
,
{
seq
:
this
.
seq
,
via
:
{}
});
this
.
send
(
socket
,
{
seq
:
this
.
seq
,
via
:
{}
,
plan
:
{}
});
}
else
{
}
else
{
console
.
log
(
`ignoring packet from
${
data
.
id
}
, packet ack=
${
data
.
ack
}
, server seq=
${
this
.
seq
}
`
);
console
.
log
(
`ignoring packet from
${
data
.
id
}
, packet ack=
${
data
.
ack
}
, server seq=
${
this
.
seq
}
`
);
}
}
...
@@ -82,12 +86,12 @@ export class Router {
...
@@ -82,12 +86,12 @@ export class Router {
const
changedVia
:
Record
<
number
,
number
>
=
{};
const
changedVia
:
Record
<
number
,
number
>
=
{};
const
metric
:
Record
<
number
,
number
>
=
{};
const
metric
:
Record
<
number
,
number
>
=
{};
for
(
const
to
of
Router
.
all
.
filter
(
r
=>
r
.
id
!==
this
.
id
))
{
for
(
const
to
of
Router
.
all
.
filter
(
(
r
)
=>
r
.
id
!==
this
.
id
))
{
// 计算最优下一跳
// 计算最优下一跳
const
items
:
[
Router
,
number
][]
=
Router
.
all
.
filter
(
r
=>
r
.
id
!==
this
.
id
).
map
(
r
=>
[
r
,
this
.
route_quality
(
to
,
r
).
metric
()]);
const
items
:
[
Router
,
number
][]
=
Router
.
all
.
filter
(
(
r
)
=>
r
.
id
!==
this
.
id
).
map
((
r
)
=>
[
r
,
this
.
route_quality
(
to
,
r
).
metric
()]);
const
[
currentRoute
,
currentMetric
]
=
items
.
find
(([
v
,
m
])
=>
v
===
this
.
via
.
get
(
to
))
!
;
const
[
currentRoute
,
currentMetric
]
=
items
.
find
(([
v
,
m
])
=>
v
===
this
.
via
.
get
(
to
))
!
;
const
[
bestRoute
,
bestMetric
]
=
_
.
minBy
(
items
,
(
([
v
,
m
])
=>
m
)
)
!
;
const
[
bestRoute
,
bestMetric
]
=
_
.
minBy
(
items
,
(
[
v
,
m
])
=>
m
)
!
;
// 变更
// 变更
if
(
currentRoute
!==
bestRoute
&&
bestMetric
+
config
.
throttle
<
currentMetric
)
{
if
(
currentRoute
!==
bestRoute
&&
bestMetric
+
config
.
throttle
<
currentMetric
)
{
...
@@ -100,27 +104,27 @@ export class Router {
...
@@ -100,27 +104,27 @@ export class Router {
}
}
}
}
// 计算 route plan
// 计算 route plan
// 凡是自己可以作为那个 plan 出口的,是不会计算直接跳过的,所以这里有 plan 到自己的意思是,没有找到任何一个通的可以出的地方,所以只好从自己出了
// 凡是自己可以作为那个 plan 出口的,是不会计算直接跳过的,所以这里有 plan 到自己的意思是,没有找到任何一个通的可以出的地方,所以只好从自己出了
const
changedPlan
:
Record
<
number
,
number
>
=
{};
const
changedPlan
:
Record
<
number
,
number
>
=
{};
// for (const plan of plans.filter(plan => !plan.routers.includes(this.id))) {
for
(
const
[
_groupId
,
groupRouters
]
of
Object
.
entries
(
Router
.
groups
).
filter
(([
_
,
g
])
=>
!
g
.
includes
(
this
)))
{
// const currentPlan = this.plan[plan.id];
const
groupId
=
parseInt
(
_groupId
);
// const currentMetric = currentPlan === this.id ? Infinity : metric[currentPlan];
const
currentPlan
=
this
.
plan
[
groupId
];
// const items = plan.routers.map(to => [to, metric[to]]);
const
currentMetric
=
currentPlan
===
this
.
id
?
Infinity
:
metric
[
currentPlan
];
// const [bestPlan, bestMetric] = _.minBy(items, ([t, m]) => m)!;
const
items
=
groupRouters
.
map
((
to
)
=>
[
to
.
id
,
metric
[
to
.
id
]]);
//
const
[
bestPlan
,
bestMetric
]
=
_
.
minBy
(
items
,
([
_
,
m
])
=>
m
)
!
;
// if (currentPlan !== this.id && bestMetric === Infinity) {
// // 原来通的,现在不通了
if
(
currentPlan
!==
this
.
id
&&
bestMetric
===
Infinity
)
{
// this.plan[plan.id] = changedPlan[plan.id] = this.id;
// 原来通的,现在不通了
// } else if (currentPlan !== bestPlan && bestMetric + config.throttle < currentMetric) {
this
.
plan
[
groupId
]
=
changedPlan
[
groupId
]
=
this
.
id
;
// this.plan[plan.id] = changedPlan[plan.id] = bestPlan;
}
else
if
(
currentPlan
!==
bestPlan
&&
bestMetric
+
config
.
throttle
<
currentMetric
)
{
// }
this
.
plan
[
groupId
]
=
changedPlan
[
groupId
]
=
bestPlan
;
// }
}
}
if
(
!
_
.
isEmpty
(
changedVia
)
||
!
_
.
isEmpty
(
changedPlan
))
{
if
(
!
_
.
isEmpty
(
changedVia
)
||
!
_
.
isEmpty
(
changedPlan
))
{
this
.
seq
++
;
this
.
seq
++
;
const
message
:
Change
=
{
seq
:
this
.
seq
,
via
:
changedVia
};
const
message
:
Change
=
{
seq
:
this
.
seq
,
via
:
changedVia
,
plan
:
changedPlan
};
Router
.
updating
=
{
router
:
this
,
message
};
Router
.
updating
=
{
router
:
this
,
message
};
this
.
send
(
socket
,
message
);
this
.
send
(
socket
,
message
);
}
}
...
@@ -163,3 +167,17 @@ export class Router {
...
@@ -163,3 +167,17 @@ export class Router {
}
}
for
(
const
router
of
Router
.
all
)
router
.
reset
();
for
(
const
router
of
Router
.
all
)
router
.
reset
();
function
groupRouters
(
g
:
GatewayGroup
):
Router
[]
{
return
_
.
uniq
(
g
.
locationPrefix
.
flatMap
((
p
)
=>
routers
.
filter
((
r
)
=>
r
.
location
.
startsWith
(
p
)))
.
concat
(
routers
.
filter
((
r
)
=>
g
.
includeRouters
.
includes
(
r
.
name
)))
.
filter
((
r
)
=>
!
g
.
excludeRouters
.
includes
(
r
.
name
))
.
map
((
r
)
=>
Router
.
all
.
find
((
r1
)
=>
r1
.
id
===
r
.
id
)
!
)
.
concat
(
gatewayGroups
.
filter
((
g1
)
=>
g
.
children
.
includes
(
g1
.
name
)).
flatMap
((
c
)
=>
groupRouters
(
c
)))
);
}
Router
.
groups
=
Object
.
fromEntries
(
gatewayGroups
.
map
((
g
)
=>
[
g
.
id
,
groupRouters
(
g
)]));
console
.
log
(
Router
.
groups
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment