Add a new tab to rooms with forward extremities (#107)

Add a new tab to rooms with forward extremities.
This commit is contained in:
Dirk Klimpel 2021-05-08 19:10:51 +02:00 committed by GitHub
parent 229518e456
commit 3ea1f51eb5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 89 additions and 0 deletions

View file

@ -73,6 +73,7 @@ const App = () => (
<Resource name="joined_rooms" /> <Resource name="joined_rooms" />
<Resource name="pushers" /> <Resource name="pushers" />
<Resource name="servernotices" /> <Resource name="servernotices" />
<Resource name="forward_extremities" />
<Resource name="room_state" /> <Resource name="room_state" />
</Admin> </Admin>
); );

View file

@ -8,6 +8,7 @@ import {
DeleteButton, DeleteButton,
Filter, Filter,
List, List,
NumberField,
Pagination, Pagination,
ReferenceField, ReferenceField,
ReferenceManyField, ReferenceManyField,
@ -23,7 +24,9 @@ import {
} from "react-admin"; } from "react-admin";
import get from "lodash/get"; import get from "lodash/get";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { makeStyles } from "@material-ui/core/styles";
import { Tooltip, Typography, Chip } from "@material-ui/core"; import { Tooltip, Typography, Chip } from "@material-ui/core";
import FastForwardIcon from "@material-ui/icons/FastForward";
import HttpsIcon from "@material-ui/icons/Https"; import HttpsIcon from "@material-ui/icons/Https";
import NoEncryptionIcon from "@material-ui/icons/NoEncryption"; import NoEncryptionIcon from "@material-ui/icons/NoEncryption";
import PageviewIcon from "@material-ui/icons/Pageview"; import PageviewIcon from "@material-ui/icons/Pageview";
@ -38,6 +41,13 @@ import {
RoomDirectorySaveButton, RoomDirectorySaveButton,
} from "./RoomDirectory"; } from "./RoomDirectory";
const useStyles = makeStyles(theme => ({
helper_forward_extremities: {
fontFamily: "Roboto, Helvetica, Arial, sans-serif",
margin: "0.5em",
},
}));
const RoomPagination = props => ( const RoomPagination = props => (
<Pagination {...props} rowsPerPageOptions={[10, 25, 50, 100, 500, 1000]} /> <Pagination {...props} rowsPerPageOptions={[10, 25, 50, 100, 500, 1000]} />
); );
@ -109,6 +119,7 @@ const RoomShowActions = ({ basePath, data, resource }) => {
}; };
export const RoomShow = props => { export const RoomShow = props => {
const classes = useStyles({ props });
const translate = useTranslate(); const translate = useTranslate();
return ( return (
<Show {...props} actions={<RoomShowActions />} title={<RoomTitle />}> <Show {...props} actions={<RoomShowActions />} title={<RoomTitle />}>
@ -220,6 +231,7 @@ export const RoomShow = props => {
]} ]}
/> />
</Tab> </Tab>
<Tab <Tab
label={translate("resources.room_state.name", { smart_count: 2 })} label={translate("resources.room_state.name", { smart_count: 2 })}
icon={<EventIcon />} icon={<EventIcon />}
@ -256,6 +268,40 @@ export const RoomShow = props => {
</Datagrid> </Datagrid>
</ReferenceManyField> </ReferenceManyField>
</Tab> </Tab>
<Tab
label="resources.forward_extremities.name"
icon={<FastForwardIcon />}
path="forward_extremities"
>
<div className={classes.helper_forward_extremities}>
{translate("resources.rooms.helper.forward_extremities")}
</div>
<ReferenceManyField
reference="forward_extremities"
target="room_id"
addLabel={false}
>
<Datagrid style={{ width: "100%" }}>
<TextField source="id" sortable={false} />
<DateField
source="received_ts"
showTime
options={{
year: "numeric",
month: "2-digit",
day: "2-digit",
hour: "2-digit",
minute: "2-digit",
second: "2-digit",
}}
sortable={false}
/>
<NumberField source="depth" sortable={false} />
<TextField source="state_group" sortable={false} />
</Datagrid>
</ReferenceManyField>
</Tab>
</TabbedShowLayout> </TabbedShowLayout>
</Show> </Show>
); );

View file

@ -152,6 +152,10 @@ const de = {
topic: "Thema", topic: "Thema",
avatar: "Avatar", avatar: "Avatar",
}, },
helper: {
forward_extremities:
"Forward extremities are the leaf events at the end of a Directed acyclic graph (DAG) in a room, aka events that have no children. The more exist in a room, the more state resolution that Synapse needs to perform (hint: it's an expensive operation). While Synapse has code to prevent too many of these existing at one time in a room, bugs can sometimes make them crop up again. If a room has >10 forward extremities, it's worth checking which room is the culprit and potentially removing them using the SQL queries mentioned in #1760.",
},
enums: { enums: {
join_rules: { join_rules: {
public: "Öffentlich", public: "Öffentlich",
@ -295,6 +299,15 @@ const de = {
media_length: "Größe der Dateien", media_length: "Größe der Dateien",
}, },
}, },
forward_extremities: {
name: "Vorderextremitäten",
fields: {
id: "Event-ID",
received_ts: "Zeitstempel",
depth: "Tiefe",
state_group: "Zustandsgruppe",
},
},
room_state: { room_state: {
name: "Zustandsereignisse", name: "Zustandsereignisse",
fields: { fields: {

View file

@ -150,6 +150,10 @@ const en = {
topic: "Topic", topic: "Topic",
avatar: "Avatar", avatar: "Avatar",
}, },
helper: {
forward_extremities:
"Forward extremities are the leaf events at the end of a Directed acyclic graph (DAG) in a room, aka events that have no children. The more exist in a room, the more state resolution that Synapse needs to perform (hint: it's an expensive operation). While Synapse has code to prevent too many of these existing at one time in a room, bugs can sometimes make them crop up again. If a room has >10 forward extremities, it's worth checking which room is the culprit and potentially removing them using the SQL queries mentioned in #1760.",
},
enums: { enums: {
join_rules: { join_rules: {
public: "Public", public: "Public",
@ -291,6 +295,15 @@ const en = {
media_length: "Media length", media_length: "Media length",
}, },
}, },
forward_extremities: {
name: "Forward Extremities",
fields: {
id: "Event ID",
received_ts: "Timestamp",
depth: "Depth",
state_group: "State group",
},
},
room_state: { room_state: {
name: "State events", name: "State events",
fields: { fields: {

View file

@ -208,6 +208,22 @@ const resourceMap = {
return json.total; return json.total;
}, },
}, },
forward_extremities: {
map: fe => ({
...fe,
id: fe.event_id,
}),
reference: id => ({
endpoint: `/_synapse/admin/v1/rooms/${id}/forward_extremities`,
}),
data: "results",
total: json => {
return json.count;
},
delete: params => ({
endpoint: `/_synapse/admin/v1/rooms/${params.id}/forward_extremities`,
}),
},
room_directory: { room_directory: {
path: "/_matrix/client/r0/publicRooms", path: "/_matrix/client/r0/publicRooms",
map: rd => ({ map: rd => ({