Skip to content

Commit 2d4feda

Browse files
committed
chore: test
1 parent 32d385f commit 2d4feda

File tree

7 files changed

+95
-38
lines changed

7 files changed

+95
-38
lines changed

packages/cubejs-api-gateway/src/sql-server.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {
22
setupLogger,
3+
resetLogger,
34
registerInterface,
45
shutdownInterface,
56
execSql,
@@ -382,5 +383,9 @@ export class SQLServer {
382383

383384
public async shutdown(mode: ShutdownMode): Promise<void> {
384385
await shutdownInterface(this.sqlInterfaceInstance!, mode);
386+
387+
resetLogger(
388+
process.env.CUBEJS_LOG_LEVEL === 'trace' ? 'trace' : 'warn'
389+
);
385390
}
386391
}

packages/cubejs-api-gateway/test/auth.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import express, { Application as ExpressApplication, RequestHandler } from 'expr
33
// eslint-disable-next-line import/no-extraneous-dependencies
44
import request from 'supertest';
55
import jwt from 'jsonwebtoken';
6-
import { pausePromise } from '@cubejs-backend/shared';
6+
import {getEnv, pausePromise} from '@cubejs-backend/shared';
77

88
import { ApiGateway, ApiGatewayOptions, CubejsHandlerError, Request } from '../src';
99
import { AdapterApiMock, DataSourceStorageMock } from './mocks';
@@ -113,7 +113,7 @@ describe('test authorization with native gateway', () => {
113113
await apiGateway.shutdownSQLServer();
114114
});
115115

116-
fit('default authorization', async () => {
116+
it('default authorization', async () => {
117117
const token = generateAuthToken({ uid: 5, });
118118

119119
await request(app)

packages/cubejs-backend-native/js/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,12 @@ export const setupLogger = (logger: (extra: any) => unknown, logLevel: LogLevel)
352352
native.setupLogger({ logger: wrapNativeFunctionWithChannelCallback(logger), logLevel });
353353
};
354354

355+
/// Reset local to default implementation, which uses STDOUT
356+
export const resetLogger = (logLevel: LogLevel): void => {
357+
const native = loadNative();
358+
native.resetLogger({ logLevel });
359+
};
360+
355361
export const isFallbackBuild = (): boolean => {
356362
const native = loadNative();
357363
return native.isFallbackBuild();

packages/cubejs-backend-native/src/channel.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,9 @@ impl SqlGenerator for NodeSqlGenerator {
398398
impl Drop for NodeSqlGenerator {
399399
fn drop(&mut self) {
400400
let channel = self.channel.clone();
401+
/// Safety: Safe, because on_track take is used only for dropping
401402
let sql_generator_obj = self.sql_generator_obj.take().unwrap();
403+
402404
channel.send(move |mut cx| {
403405
let _ = match Arc::try_unwrap(sql_generator_obj) {
404406
Ok(v) => v.into_inner(&mut cx),

packages/cubejs-backend-native/src/lib.rs

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -48,29 +48,13 @@ pub fn tokio_runtime() -> Result<&'static Runtime, CubeError> {
4848
})
4949
}
5050

51-
pub fn create_logger(log_level: log::Level) -> SimpleLogger {
52-
SimpleLogger::new()
53-
.with_level(log::Level::Error.to_level_filter())
54-
.with_module_level("cubesql", log_level.to_level_filter())
55-
.with_module_level("cubejs_native", log_level.to_level_filter())
56-
.with_module_level("datafusion", log::Level::Warn.to_level_filter())
57-
.with_module_level("pg_srv", log::Level::Warn.to_level_filter())
58-
}
59-
6051
#[cfg(feature = "neon-entrypoint")]
6152
#[neon::main]
6253
fn main(cx: ModuleContext) -> NeonResult<()> {
6354
// We use log_rerouter to swap logger, because we init logger from js side in api-gateway
6455
log_reroute::init().unwrap();
6556

66-
let logger = Box::new(create_logger(log::Level::Error));
67-
log_reroute::reroute_boxed(logger);
68-
69-
ReportingLogger::init(
70-
Box::new(LocalReporter::new()),
71-
log::Level::Error.to_level_filter(),
72-
)
73-
.unwrap();
57+
node_export::setup_local_logger(log::Level::Error);
7458

7559
node_export::register_module_exports::<NodeConfigurationImpl>(cx)?;
7660

packages/cubejs-backend-native/src/logger.rs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ use crate::channel::call_js_with_channel_as_callback;
1111
#[derive(Debug)]
1212
pub struct NodeBridgeLogger {
1313
channel: Arc<Channel>,
14-
on_track: Arc<Root<JsFunction>>,
14+
on_track: Option<Arc<Root<JsFunction>>>,
1515
}
1616

1717
impl NodeBridgeLogger {
1818
pub fn new(channel: Channel, on_track: Root<JsFunction>) -> Self {
1919
Self {
2020
channel: Arc::new(channel),
21-
on_track: Arc::new(on_track),
21+
on_track: Some(Arc::new(on_track)),
2222
}
2323
}
2424
}
@@ -35,12 +35,34 @@ impl LogReporter for NodeBridgeLogger {
3535
let extra = serde_json::to_string(&EventBox { event: props }).unwrap();
3636

3737
let channel = self.channel.clone();
38-
let on_track = self.on_track.clone();
38+
/// Safety: Safe, because on_track take is used only for dropping
39+
let on_track = self.on_track.as_ref().expect("Unable to unwrap on_track to log event for NodeBridgeLogger. Logger was dropped?").clone();
40+
3941
// TODO: Move to spawning loops
4042
spawn(async move { log(channel, on_track, Some(extra)).await });
4143
}
4244
}
4345

46+
impl Drop for NodeBridgeLogger {
47+
fn drop(&mut self) {
48+
let channel = self.channel.clone();
49+
let on_track = self.on_track.take().expect("NodeBridgeLogger.on_track was t already dropped");
50+
51+
channel.send(move |mut cx| {
52+
let _ = match Arc::try_unwrap(on_track) {
53+
Ok(v) => {
54+
v.into_inner(&mut cx)
55+
},
56+
Err(_) => {
57+
log::error!("Unable to drop sql generator: reference is copied somewhere else. Potential memory leak");
58+
return Ok(());
59+
},
60+
};
61+
Ok(())
62+
});
63+
}
64+
}
65+
4466
async fn log(channel: Arc<Channel>, on_track: Arc<Root<JsFunction>>, extra: Option<String>) {
4567
let _ = call_js_with_channel_as_callback::<String>(channel, on_track, extra).await;
4668
}

packages/cubejs-backend-native/src/node_export.rs

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::cubesql_utils::with_session;
1616
use crate::logger::NodeBridgeLogger;
1717
use crate::sql4sql::sql4sql;
1818
use crate::stream::OnDrainHandler;
19-
use crate::tokio_runtime_node;
19+
use crate::{tokio_runtime_node};
2020
use crate::transport::NodeBridgeTransport;
2121
use crate::utils::batch_to_rows;
2222
use cubenativeutils::wrappers::neon::context::neon_run_with_guarded_lifetime;
@@ -31,9 +31,10 @@ use std::rc::Rc;
3131
use std::sync::Arc;
3232

3333
use cubesql::{telemetry::ReportingLogger, CubeError};
34-
34+
use cubesql::telemetry::LocalReporter;
3535
use neon::prelude::*;
3636
use neon::result::Throw;
37+
use simple_logger::SimpleLogger;
3738

3839
pub(crate) struct SQLInterface {
3940
pub(crate) services: Arc<NodeCubeServices>,
@@ -497,29 +498,34 @@ fn is_fallback_build(mut cx: FunctionContext) -> JsResult<JsBoolean> {
497498
Ok(JsBoolean::new(&mut cx, true))
498499
}
499500

500-
pub fn setup_logger(mut cx: FunctionContext) -> JsResult<JsUndefined> {
501-
let options = cx.argument::<JsObject>(0)?;
502-
let cube_logger = options
503-
.get::<JsFunction, _, _>(&mut cx, "logger")?
504-
.root(&mut cx);
505-
506-
let log_level_handle = options.get_value(&mut cx, "logLevel")?;
507-
let log_level = if log_level_handle.is_a::<JsString, _>(&mut cx) {
508-
let value = log_level_handle.downcast_or_throw::<JsString, _>(&mut cx)?;
509-
let log_level = match value.value(&mut cx).as_str() {
501+
fn get_log_level_from_variable(log_level_handle: Handle<JsValue>, cx: &mut FunctionContext) -> NeonResult<log::Level> {
502+
if log_level_handle.is_a::<JsString, _>(cx) {
503+
let value = log_level_handle.downcast_or_throw::<JsString, _>(cx)?;
504+
let log_level = match value.value(cx).as_str() {
510505
"error" => log::Level::Error,
511506
"warn" => log::Level::Warn,
512507
"info" => log::Level::Info,
513508
"debug" => log::Level::Debug,
514509
"trace" => log::Level::Trace,
515510
x => cx.throw_error(format!("Unrecognized log level: {}", x))?,
516511
};
517-
log_level
512+
513+
Ok(log_level)
518514
} else {
519-
log::Level::Trace
520-
};
515+
Ok(log::Level::Trace)
516+
}
517+
}
518+
519+
pub fn setup_logger(mut cx: FunctionContext) -> JsResult<JsUndefined> {
520+
let options = cx.argument::<JsObject>(0)?;
521+
let cube_logger = options
522+
.get::<JsFunction, _, _>(&mut cx, "logger")?
523+
.root(&mut cx);
521524

522-
let logger = crate::create_logger(log_level);
525+
let log_level_handle = options.get_value(&mut cx, "logLevel")?;
526+
let log_level = get_log_level_from_variable(log_level_handle, &mut cx)?;
527+
528+
let logger = create_logger(log_level);
523529
log_reroute::reroute_boxed(Box::new(logger));
524530

525531
ReportingLogger::init(
@@ -531,6 +537,37 @@ pub fn setup_logger(mut cx: FunctionContext) -> JsResult<JsUndefined> {
531537
Ok(cx.undefined())
532538
}
533539

540+
pub fn create_logger(log_level: log::Level) -> SimpleLogger {
541+
SimpleLogger::new()
542+
.with_level(log::Level::Error.to_level_filter())
543+
.with_module_level("cubesql", log_level.to_level_filter())
544+
.with_module_level("cubejs_native", log_level.to_level_filter())
545+
.with_module_level("datafusion", log::Level::Warn.to_level_filter())
546+
.with_module_level("pg_srv", log::Level::Warn.to_level_filter())
547+
}
548+
549+
pub fn setup_local_logger(log_level: log::Level) {
550+
let logger = create_logger(log_level);
551+
log_reroute::reroute_boxed(Box::new(logger));
552+
553+
ReportingLogger::init(
554+
Box::new(LocalReporter::new()),
555+
log::Level::Error.to_level_filter(),
556+
)
557+
.unwrap();
558+
}
559+
560+
pub fn reset_logger(mut cx: FunctionContext) -> JsResult<JsUndefined> {
561+
let options = cx.argument::<JsObject>(0)?;
562+
563+
let log_level_handle = options.get_value(&mut cx, "logLevel")?;
564+
let log_level = get_log_level_from_variable(log_level_handle, &mut cx)?;
565+
566+
setup_local_logger(log_level);
567+
568+
Ok(cx.undefined())
569+
}
570+
534571
//============ sql planner ===================
535572

536573
fn build_sql_and_params(cx: FunctionContext) -> JsResult<JsValue> {
@@ -570,6 +607,7 @@ pub fn register_module_exports<C: NodeConfiguration + 'static>(
570607
mut cx: ModuleContext,
571608
) -> NeonResult<()> {
572609
cx.export_function("setupLogger", setup_logger)?;
610+
cx.export_function("resetLogger", reset_logger)?;
573611
cx.export_function("registerInterface", register_interface::<C>)?;
574612
cx.export_function("shutdownInterface", shutdown_interface)?;
575613
cx.export_function("execSql", exec_sql)?;

0 commit comments

Comments
 (0)