link watcher switch to event based instead of polling
All checks were successful
Build and Deploy MITM Webserver / traffic_target (push) Successful in 1s
Build and Deploy MITM Webserver / build (push) Successful in 9s

This commit is contained in:
2026-03-09 15:49:13 +01:00
parent c57d6ecc67
commit 665c0b4475
5 changed files with 118 additions and 54 deletions

View File

@@ -284,11 +284,11 @@ export default function Network() {
function openEnableWatcherModal(bridgeName: string) {
setWatcherBridgeName(bridgeName);
watcherForm.setFieldsValue({ poll_interval_seconds: 0.25 });
watcherForm.setFieldsValue({ recovery_holdoff_seconds: 1.0 });
setWatcherModalVisible(true);
}
function handleEnableWatcher(values: { poll_interval_seconds: number }) {
function handleEnableWatcher(values: { recovery_holdoff_seconds: number }) {
if (!watcherBridgeName) {
return;
}
@@ -434,8 +434,9 @@ export default function Network() {
>
<Descriptions size="small" column={4} style={{ marginBottom: members.length ? 12 : 0 }}>
<Descriptions.Item label="Members">{bridge.members.map((member) => member.ifname).join(', ') || '—'}</Descriptions.Item>
<Descriptions.Item label="Poll interval">
{watcher?.poll_interval_seconds ? `${watcher.poll_interval_seconds}s` : '—'}
<Descriptions.Item label="Mode">{watcher?.event_driven ? 'netlink events' : '—'}</Descriptions.Item>
<Descriptions.Item label="Recovery holdoff">
{watcher?.recovery_holdoff_seconds ? `${watcher.recovery_holdoff_seconds}s` : '—'}
</Descriptions.Item>
<Descriptions.Item label="Suppressed">
{watcher?.suppressed_members.length ? watcher.suppressed_members.join(', ') : 'none'}
@@ -501,16 +502,21 @@ export default function Network() {
}}
onOk={() => watcherForm.submit()}
>
<Form form={watcherForm} layout="vertical" onFinish={handleEnableWatcher} initialValues={{ poll_interval_seconds: 0.25 }}>
<Form
form={watcherForm}
layout="vertical"
onFinish={handleEnableWatcher}
initialValues={{ recovery_holdoff_seconds: 1.0 }}
>
<Form.Item
name="poll_interval_seconds"
label="Poll interval (seconds)"
rules={[{ required: true, message: 'Please provide a poll interval' }]}
name="recovery_holdoff_seconds"
label="Recovery holdoff (seconds)"
rules={[{ required: true, message: 'Please provide a recovery holdoff' }]}
>
<InputNumber min={0.05} max={10} step={0.05} precision={2} style={{ width: '100%' }} />
</Form.Item>
<Paragraph type="secondary" style={{ marginBottom: 0 }}>
When enabled, the backend suppresses sibling bridge ports if one member loses link and restores them after recovery.
The backend reacts to kernel link events and waits for this holdoff before restoring sibling ports after recovery.
</Paragraph>
</Form>
</Modal>

View File

@@ -52,7 +52,7 @@ export interface BridgeRemoveRequest {
}
export interface BridgeLinkStateEnableRequest {
poll_interval_seconds: number;
recovery_holdoff_seconds: number;
}
export interface BridgeMemberLinkStateInfo {
@@ -67,11 +67,12 @@ export interface BridgeMemberLinkStateInfo {
export interface BridgeLinkStateWatcherStatus {
bridge: string;
active: boolean;
poll_interval_seconds?: number | null;
last_poll_ts?: number | null;
event_driven?: boolean | null;
last_event_ts?: number | null;
last_error?: string | null;
last_action?: string | null;
suppressed_members: string[];
recovery_holdoff_seconds?: number | null;
members: Record<string, BridgeMemberLinkStateInfo>;
message?: string | null;
}