mirror of
https://github.com/neondatabase/neon.git
synced 2025-12-26 15:49:58 +00:00
fix(pageserver): ensure remote size gets computed (#12520)
## Problem Follow up of #12400 ## Summary of changes We didn't set remote_size_mb to Some when initialized so it never gets computed :( Also added a new API to force refresh the properties. Signed-off-by: Alex Chi Z <chi@neon.tech>
This commit is contained in:
@@ -409,11 +409,12 @@ impl TenantFeatureResolver {
|
|||||||
|
|
||||||
/// Refresh the cached properties and flags on the critical path.
|
/// Refresh the cached properties and flags on the critical path.
|
||||||
pub fn refresh_properties_and_flags(&self, tenant_shard: &TenantShard) {
|
pub fn refresh_properties_and_flags(&self, tenant_shard: &TenantShard) {
|
||||||
let mut remote_size_mb = None;
|
let mut remote_size_mb = Some(0.0);
|
||||||
for timeline in tenant_shard.list_timelines() {
|
for timeline in tenant_shard.list_timelines() {
|
||||||
let size = timeline.metrics.resident_physical_size_get();
|
let size = timeline.metrics.resident_physical_size_get();
|
||||||
if size == 0 {
|
if size == 0 {
|
||||||
remote_size_mb = None;
|
remote_size_mb = None;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if let Some(ref mut remote_size_mb) = remote_size_mb {
|
if let Some(ref mut remote_size_mb) = remote_size_mb {
|
||||||
*remote_size_mb += size as f64 / 1024.0 / 1024.0;
|
*remote_size_mb += size as f64 / 1024.0 / 1024.0;
|
||||||
|
|||||||
@@ -3691,6 +3691,23 @@ async fn read_tar_eof(mut reader: (impl tokio::io::AsyncRead + Unpin)) -> anyhow
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn force_refresh_feature_flag(
|
||||||
|
request: Request<Body>,
|
||||||
|
_cancel: CancellationToken,
|
||||||
|
) -> Result<Response<Body>, ApiError> {
|
||||||
|
let tenant_shard_id: TenantShardId = parse_request_param(&request, "tenant_shard_id")?;
|
||||||
|
check_permission(&request, Some(tenant_shard_id.tenant_id))?;
|
||||||
|
|
||||||
|
let state = get_state(&request);
|
||||||
|
let tenant = state
|
||||||
|
.tenant_manager
|
||||||
|
.get_attached_tenant_shard(tenant_shard_id)?;
|
||||||
|
tenant
|
||||||
|
.feature_resolver
|
||||||
|
.refresh_properties_and_flags(&tenant);
|
||||||
|
json_response(StatusCode::OK, ())
|
||||||
|
}
|
||||||
|
|
||||||
async fn tenant_evaluate_feature_flag(
|
async fn tenant_evaluate_feature_flag(
|
||||||
request: Request<Body>,
|
request: Request<Body>,
|
||||||
_cancel: CancellationToken,
|
_cancel: CancellationToken,
|
||||||
@@ -4156,6 +4173,9 @@ pub fn make_router(
|
|||||||
.get("/v1/tenant/:tenant_shard_id/feature_flag/:flag_key", |r| {
|
.get("/v1/tenant/:tenant_shard_id/feature_flag/:flag_key", |r| {
|
||||||
api_handler(r, tenant_evaluate_feature_flag)
|
api_handler(r, tenant_evaluate_feature_flag)
|
||||||
})
|
})
|
||||||
|
.post("/v1/tenant/:tenant_shard_id/force_refresh_feature_flag", |r| {
|
||||||
|
api_handler(r, force_refresh_feature_flag)
|
||||||
|
})
|
||||||
.put("/v1/feature_flag/:flag_key", |r| {
|
.put("/v1/feature_flag/:flag_key", |r| {
|
||||||
testing_api_handler("force override feature flag - put", r, force_override_feature_flag_for_testing_put)
|
testing_api_handler("force override feature flag - put", r, force_override_feature_flag_for_testing_put)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1247,3 +1247,10 @@ class PageserverHttpClient(requests.Session, MetricsGetter):
|
|||||||
)
|
)
|
||||||
self.verbose_error(res)
|
self.verbose_error(res)
|
||||||
return res.json()
|
return res.json()
|
||||||
|
|
||||||
|
def force_refresh_feature_flag(self, tenant_id: TenantId | TenantShardId):
|
||||||
|
res = self.post(
|
||||||
|
f"http://localhost:{self.port}/v1/tenant/{tenant_id}/force_refresh_feature_flag",
|
||||||
|
)
|
||||||
|
self.verbose_error(res)
|
||||||
|
return res.json()
|
||||||
|
|||||||
@@ -49,3 +49,12 @@ def test_feature_flag(neon_env_builder: NeonEnvBuilder):
|
|||||||
env.initial_tenant, "test-feature-flag"
|
env.initial_tenant, "test-feature-flag"
|
||||||
)["result"]
|
)["result"]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
env.pageserver.http_client().force_refresh_feature_flag(env.initial_tenant)
|
||||||
|
|
||||||
|
# Check if the properties exist
|
||||||
|
result = env.pageserver.http_client().evaluate_feature_flag_multivariate(
|
||||||
|
env.initial_tenant, "test-feature-flag"
|
||||||
|
)
|
||||||
|
assert "tenant_remote_size_mb" in result["properties"]
|
||||||
|
assert "tenant_id" in result["properties"]
|
||||||
|
|||||||
Reference in New Issue
Block a user