Skip to content

Commit

Permalink
chore: more granular tracing for processRecurrence
Browse files Browse the repository at this point in the history
  • Loading branch information
Dschoordsch committed May 7, 2024
1 parent c71ec42 commit e8e0e89
Showing 1 changed file with 59 additions and 56 deletions.
115 changes: 59 additions & 56 deletions packages/server/graphql/private/mutations/processRecurrence.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,64 +158,67 @@ const processRecurrence: MutationResolvers['processRecurrence'] = async (_source
)
await tracer.trace('processRecurrence.startActiveMeetingSeries', async () =>
Promise.allSettled(
activeMeetingSeries.map(async (meetingSeries) => {
const seriesTeam = await dataLoader.get('teams').loadNonNull(meetingSeries.teamId)
if (seriesTeam.isArchived || !seriesTeam.isPaid) {
return
}

const [seriesOrg, lastMeeting] = await Promise.all([
dataLoader.get('organizations').load(seriesTeam.orgId),
dataLoader.get('lastMeetingByMeetingSeriesId').load(meetingSeries.id)
])

// remove this check after 2024-05-05
if (
lastMeeting?.meetingSeriesId !== meetingSeries.id ||
lastMeeting.teamId !== meetingSeries.teamId
) {
const error = new Error(
'lastMeetingByMeetingSeriesId returned a meeting that does not match the series'
)
sendToSentry(error)
throw error
}

if (seriesOrg.lockedAt) {
return
}

// For meetings that should still be active, start the meeting and set its end time.
// Any subscriptions are handled by the shared meeting start code
const rrule = RRule.fromString(meetingSeries.recurrenceRule)
// technically, RRULE should never return NaN here but there's a bug in the library
// https://github.com/jakubroztocil/rrule/issues/321
if (isNaN(rrule.options.interval)) {
return
}

// Only get meetings that should currently be active, i.e. meetings that should have started
// within the last 24 hours, started after the last meeting in the series, and started before
// 'now'.
const fromDate = lastMeeting
? new Date(
Math.max(lastMeeting.createdAt.getTime() + ms('10m'), now.getTime() - ms('24h'))
activeMeetingSeries.map(async (meetingSeries) =>
tracer.trace('processRecurrence.startActiveMeetingSeries.meeting', async (span) => {
span?.setTag('meetingSeriesId', meetingSeries.id)
const seriesTeam = await dataLoader.get('teams').loadNonNull(meetingSeries.teamId)
if (seriesTeam.isArchived || !seriesTeam.isPaid) {
return
}

const [seriesOrg, lastMeeting] = await Promise.all([
dataLoader.get('organizations').load(seriesTeam.orgId),
dataLoader.get('lastMeetingByMeetingSeriesId').load(meetingSeries.id)
])

// remove this check after 2024-05-05
if (
lastMeeting?.meetingSeriesId !== meetingSeries.id ||
lastMeeting.teamId !== meetingSeries.teamId
) {
const error = new Error(
'lastMeetingByMeetingSeriesId returned a meeting that does not match the series'
)
: new Date(0)
const newMeetingsStartTimes = rrule.between(
getRRuleDateFromJSDate(fromDate),
getRRuleDateFromJSDate(now)
)
for (const startTime of newMeetingsStartTimes) {
const err = await startRecurringMeeting(
meetingSeries,
getJSDateFromRRuleDate(startTime),
dataLoader,
subOptions
sendToSentry(error)
throw error
}

if (seriesOrg.lockedAt) {
return
}

// For meetings that should still be active, start the meeting and set its end time.
// Any subscriptions are handled by the shared meeting start code
const rrule = RRule.fromString(meetingSeries.recurrenceRule)
// technically, RRULE should never return NaN here but there's a bug in the library
// https://github.com/jakubroztocil/rrule/issues/321
if (isNaN(rrule.options.interval)) {
return
}

// Only get meetings that should currently be active, i.e. meetings that should have started
// within the last 24 hours, started after the last meeting in the series, and started before
// 'now'.
const fromDate = lastMeeting
? new Date(
Math.max(lastMeeting.createdAt.getTime() + ms('10m'), now.getTime() - ms('24h'))
)
: new Date(0)
const newMeetingsStartTimes = rrule.between(
getRRuleDateFromJSDate(fromDate),
getRRuleDateFromJSDate(now)
)
if (!err) meetingsStarted++
}
})
for (const startTime of newMeetingsStartTimes) {
const err = await startRecurringMeeting(
meetingSeries,
getJSDateFromRRuleDate(startTime),
dataLoader,
subOptions
)
if (!err) meetingsStarted++
}
})
)
)
)

Expand Down

0 comments on commit e8e0e89

Please sign in to comment.