-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Description
Describe the bug
I am working on a production deployment of Cube+Cubestore with multi-tenancy. I use pre-aggregations in some models, which are working fine. However, one specific pre-aggregation is currently only being built for one tenant, which causes other tenant's queries that hit it to fail, with the API claiming that it can't find the expected pre-aggregation table:
Error: No pre-aggregation partitions were built yet for the pre-aggregation serving this query and this API instance wasn't set up to build pre-aggregations. Please make sure your refresh worker is configured correctly, running, pre-aggregation tables are built and all pre-aggregation refresh settings like timezone match. Expected table name patterns: pre_aggregations_<tenant>.events_events_by_category_and_city*_5lcntksd_*
I can't seem to figure out the reason for this. Looking at cubestore logs, I see the trail of building all the other pre-aggregations for all tenants, but the specific one I am talking about is never uploaded for the tenants in question. Cube refresh workers also do not show any errors related to this pre-aggregation.
The following things are making the problem here unclear to me:
- The rest of the cube is working -> thus it is able to find the data in the origin database, and filter it correctly by tenant
- The rest of the pre-aggregations are working -> thus my
preAggregationsSchemaandscheduledRefreshContextsshould be OK otherwise I would have no pre-aggregations (right?) - The pre-aggregation works in development mode, when connected to the same sources and tenants -> not 100% sure here, but this should mean that the pre-aggregation is able to run on the data
- It works in one tenant -> thus it can't be that somehow the pre-aggregation isn't loaded in the production environment
I have tried:
- Deleting all cubestore cache and rebuilding everything from scratch -> no effect
- Configuring the instance with only a single tenant (which currently does not have the pre-aggregation) -> also does not build the pre-aggregation
To Reproduce
Steps to reproduce the behavior:
- Create a multi tenant cube configuration, with a model that has a pre-aggregation
- Deploy the configuration in a production environment, using workers+cubestore
- Make a query using the pre-aggregation on two different tenants
- One tenant works, the other one does not
Expected behavior
Both tenants should have the pre-aggregation built.
Minimally reproducible Cube Schema
cubes:
- name: events
sql_table: '"{COMPILE_CONTEXT.securityContext.tenantId}".events'
data_source: default
public: false
dimensions:
- name: event_id
type: number
sql: id
primary_key: true
- name: event_status
type: string
sql: status
measures:
- name: num_events
type: count
drill_members:
- categories.category_name
- cities.city_name
- event_status
pre_aggregations:
- name: events_by_category_and_city
measures:
- CUBE.num_events
dimensions:
- categories.category_name
- cities.city_name
- name: categories
sql_table: '"{COMPILE_CONTEXT.securityContext.tenantId}".categories'
data_source: default
public: false
dimensions:
- name: category_id
type: number
sql: id
primary_key: true
- name: category_name
type: string
sql: name
- name: cities
sql_table: '"{COMPILE_CONTEXT.securityContext.tenantId}".cities'
data_source: default
public: false
dimensions:
- name: city_id
type: number
sql: id
primary_key: true
- name: city_name
type: string
sql: nameVersion:
v1.1.7
Additional context
Here is my cube.js configuration file:
const TENANTS = process.env.CUBEJS_TENANTS
? process.env.CUBEJS_TENANTS.split(",")
: [];
module.exports = {
contextToAppId: ({ securityContext }) =>
`CUBE_APP_${securityContext.tenantId}`,
contextToOrchestratorId: ({ securityContext }) =>
`CUBE_APP_${securityContext.tenantId}`,
scheduledRefreshContexts: () =>
TENANTS.map((tenantId) => ({
securityContext: {
tenantId,
},
})),
preAggregationsSchema: ({ securityContext }) => {
return `pre_aggregations_${securityContext.tenantId.replace(/-/g, "_")}`;
}
}