Skip to content

Fix: Act on early query cancellation#53

Merged
nathan-sift merged 4 commits into
mainfrom
nathan/fix/act-on-early-query-cancel
Feb 27, 2026
Merged

Fix: Act on early query cancellation#53
nathan-sift merged 4 commits into
mainfrom
nathan/fix/act-on-early-query-cancel

Conversation

@nathan-sift
Copy link
Copy Markdown
Contributor

@nathan-sift nathan-sift commented Feb 26, 2026

Description

Currently, when a cancellation request is made while querying data, the cancellation does not flow down to the actual data queries being performed. This can lead to concurrent requests being performed, and unexpected behavior.

We now pass the request context throughout the query call stack, and properly propagate any cancellation signals.

Verification
Queried 90 days of data, then canceled the query using the UI. Then made a second query for a shorter period of time.

Current plugin. A cancellation request appears in the logs, but isn't handled by the initial query. The initial query results return after the second query has completed

# Initial query
sift-grafana-datasource  | logger=datasources t=2026-02-26T20:21:57.518750335Z level=debug msg="Querying for data source via SQL store" uid=P5B56D21E16392E86 orgId=1
sift-grafana-datasource  | logger=query_data t=2026-02-26T20:21:57.522806133Z level=debug msg="Processed metrics query" ref_id=A from=1764361317506 to=1772137317506 interval=3600000 max_data_points=2197 query="{\"annotationFilter\":\"\",\"annotationType\":\"\",\"channelDataQueries\":[{\"assetQueries\":[{\"asSelect\":true,REDACTED_ASSET_AND_CHANNELS,\"runQueries\":[]}],\"combineRuns\":true,\"datasource\":{\"type\":\"sift-grafana-datasource\",\"uid\":\"P5B56D21E16392E86\"},\"datasourceId\":1,\"enumDisplay\":\"\",\"hide\":false,\"intervalMs\":3600000,\"key\":\"\",\"maxDataPoints\":2197,\"queryType\":\"\",\"queryVersion\":\"2.1\",\"refId\":\"A\"}"
sift-grafana-datasource  | logger=plugin.sift-grafana-datasource t=2026-02-26T20:21:57.527023848Z level=debug msg="Plugin Request Started" dsUid=P5B56D21E16392E86 endpoint=queryData uname= pluginVersion=1.4.1 dsName=Sift pluginId=sift-grafana-datasource
# Canceled query
sift-grafana-datasource  | logger=context userId=0 orgId=1 uname= t=2026-02-26T20:22:00.397233048Z level=error msg="Internal server error" error="[plugin.downstreamError] client: failed to query data: Failed to query data: rpc error: code = Canceled desc = context canceled" remote_addr=192.168.107.1 traceID=
sift-grafana-datasource  | logger=context userId=0 orgId=1 uname= t=2026-02-26T20:22:00.397353924Z level=error msg="Request Completed" method=POST path=/api/ds/query status=500 remote_addr=192.168.107.1 time_ms=2885 duration=2.885939016s size=116 referer="http://localhost:3005/d/ad5xnfj/new-dashboard?from=now-90d&orgId=1&to=now" handler=/api/ds/query status_source=downstream
# Short second query
sift-grafana-datasource  | logger=datasources t=2026-02-26T20:22:02.672028685Z level=debug msg="Querying for data source via SQL store" uid=P5B56D21E16392E86 orgId=1
sift-grafana-datasource  | logger=query_data t=2026-02-26T20:22:02.67541444Z level=debug msg="Processed metrics query" ref_id=A from=1772137022655 to=1772137322655 interval=100 max_data_points=2197 query="{\"annotationFilter\":\"\",\"annotationType\":\"\",\"channelDataQueries\":[{\"assetQueries\":[{\"asSelect\":true,REDACTED_ASSET_AND_CHANNELS,\"runQueries\":[]}],\"combineRuns\":true,\"datasource\":{\"type\":\"sift-grafana-datasource\",\"uid\":\"P5B56D21E16392E86\"},\"datasourceId\":1,\"enumDisplay\":\"\",\"hide\":false,\"intervalMs\":100,\"key\":\"\",\"maxDataPoints\":2197,\"queryType\":\"\",\"queryVersion\":\"2.1\",\"refId\":\"A\"}"
sift-grafana-datasource  | logger=plugin.sift-grafana-datasource t=2026-02-26T20:22:02.68321416Z level=debug msg="Plugin Request Started" dsName=Sift pluginId=sift-grafana-datasource pluginVersion=1.4.1 uname= dsUid=P5B56D21E16392E86 endpoint=queryData
# Second query completed
sift-grafana-datasource  | logger=plugin.sift-grafana-datasource t=2026-02-26T20:22:02.965634169Z level=debug msg=timings gettingData=270 loadingQueries=0 generatingDataFrame=5
sift-grafana-datasource  | logger=plugin.sift-grafana-datasource t=2026-02-26T20:22:02.966083378Z level=info msg="Plugin Request Completed" duration=276.783959ms endpoint=queryData statusSource=plugin uname= dsUid=P5B56D21E16392E86 dsName=Sift pluginId=sift-grafana-datasource pluginVersion=1.4.1 status=ok
# First query completed (completes successfully despite cancellation)
sift-grafana-datasource  | logger=plugin.sift-grafana-datasource t=2026-02-26T20:22:08.239350992Z level=debug msg=timings generatingDataFrame=27 gettingData=10682 loadingQueries=0
sift-grafana-datasource  | logger=plugin.sift-grafana-datasource t=2026-02-26T20:22:08.239468326Z level=info msg="Plugin Request Completed" duration=10.711388435s pluginId=sift-grafana-datasource pluginVersion=1.4.1 status=ok dsName=Sift dsUid=P5B56D21E16392E86 endpoint=queryData statusSource=plugin uname=

With the changes from this PR, the original query is fully canceled upon request. The next query performs as expected

# Initial query
sift-grafana-datasource  | logger=datasources t=2026-02-26T20:26:59.395109632Z level=debug msg="Querying for data source via SQL store" uid=P5B56D21E16392E86 orgId=1
sift-grafana-datasource  | logger=query_data t=2026-02-26T20:26:59.396381389Z level=debug msg="Processed metrics query" ref_id=A from=1764361619377 to=1772137619377 interval=3600000 max_data_points=2197 query="{\"annotationFilter\":\"\",\"annotationType\":\"\",\"channelDataQueries\":[{\"assetQueries\":[{\"asSelect\":true,REDACTED_ASSET_AND_CHANNELS,\"runQueries\":[]}],\"combineRuns\":true,\"datasource\":{\"type\":\"sift-grafana-datasource\",\"uid\":\"P5B56D21E16392E86\"},\"datasourceId\":1,\"enumDisplay\":\"\",\"hide\":false,\"intervalMs\":3600000,\"key\":\"\",\"maxDataPoints\":2197,\"queryType\":\"\",\"queryVersion\":\"2.1\",\"refId\":\"A\"}"
sift-grafana-datasource  | logger=plugin.sift-grafana-datasource t=2026-02-26T20:26:59.405590065Z level=debug msg="Plugin Request Started" pluginVersion=1.4.1 dsName=Sift dsUid=P5B56D21E16392E86 pluginId=sift-grafana-datasource endpoint=queryData uname=
# Canceled query
sift-grafana-datasource  | logger=context userId=0 orgId=1 uname= t=2026-02-26T20:27:02.129853602Z level=error msg="Internal server error" error="[plugin.downstreamError] client: failed to query data: Failed to query data: rpc error: code = Canceled desc = context canceled" remote_addr=192.168.107.1 traceID=
sift-grafana-datasource  | logger=context userId=0 orgId=1 uname= t=2026-02-26T20:27:02.130179604Z level=error msg="Request Completed" method=POST path=/api/ds/query status=500 remote_addr=192.168.107.1 time_ms=2743 duration=2.743722145s size=116 referer="http://localhost:3005/d/ad5xnfj/new-dashboard?from=now-90d&orgId=1&to=now" handler=/api/ds/query status_source=downstream
# First query completed (failure due to cancellation)
sift-grafana-datasource  | logger=plugin.sift-grafana-datasource t=2026-02-26T20:27:02.168226523Z level=error msg="Partial data response error" statusSource=plugin dsName=Sift dsUid=P5B56D21E16392E86 pluginId=sift-grafana-datasource refID=A error="request cancelled" uname= endpoint=queryData pluginVersion=1.4.1 status=499
sift-grafana-datasource  | logger=plugin.sift-grafana-datasource t=2026-02-26T20:27:02.168321816Z level=error msg="Plugin Request Completed" dsUid=P5B56D21E16392E86 duration=2.762207956s endpoint=queryData pluginId=sift-grafana-datasource pluginVersion=1.4.1 uname= status=error statusSource=plugin dsName=Sift
# Second query
sift-grafana-datasource  | logger=query_data t=2026-02-26T20:27:04.178537723Z level=debug msg="Processed metrics query" ref_id=A from=1772137324166 to=1772137624166 interval=100 max_data_points=2197 query="{\"annotationFilter\":\"\",\"annotationType\":\"\",\"channelDataQueries\":[{\"assetQueries\":[{\"asSelect\":true,REDACTED_ASSET_AND_CHANNELS,\"runQueries\":[]}],\"combineRuns\":true,\"datasource\":{\"type\":\"sift-grafana-datasource\",\"uid\":\"P5B56D21E16392E86\"},\"datasourceId\":1,\"enumDisplay\":\"\",\"hide\":false,\"intervalMs\":100,\"key\":\"\",\"maxDataPoints\":2197,\"queryType\":\"\",\"queryVersion\":\"2.1\",\"refId\":\"A\"}"
sift-grafana-datasource  | logger=plugin.sift-grafana-datasource t=2026-02-26T20:27:04.186083807Z level=debug msg="Plugin Request Started" endpoint=queryData pluginVersion=1.4.1 uname= dsName=Sift dsUid=P5B56D21E16392E86 pluginId=sift-grafana-datasource
# Second query completes
sift-grafana-datasource  | logger=plugin.sift-grafana-datasource t=2026-02-26T20:27:04.502243395Z level=debug msg=timings generatingDataFrame=1 gettingData=315 loadingQueries=0
sift-grafana-datasource  | logger=plugin.sift-grafana-datasource t=2026-02-26T20:27:04.502469354Z level=info msg="Plugin Request Completed" endpoint=queryData pluginId=sift-grafana-datasource pluginVersion=1.4.1 statusSource=plugin dsName=Sift dsUid=P5B56D21E16392E86 uname= duration=317.293511ms status=ok

Comment thread pkg/plugin/cache_utils.go
@nathan-sift nathan-sift merged commit ad16df8 into main Feb 27, 2026
11 checks passed
@nathan-sift nathan-sift deleted the nathan/fix/act-on-early-query-cancel branch February 27, 2026 00:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants