Skip to content

Commit 149fc79

Browse files
authored
fix(native): Use async logger for Node.js non blocking STDOUT (#10146)
Node.js marks `STDOUT` and `STDERR` as non blocking, it leads to a problem in Rust code, because Rust doesn't handle errors (blocking error) correctly and panics. Whenever, we try to log large payload from rust code, it crashes. New logger from `log_nonblock` crates, handle it correctly.
1 parent a272978 commit 149fc79

File tree

4 files changed

+129
-13
lines changed

4 files changed

+129
-13
lines changed

packages/cubejs-backend-native/Cargo.lock

Lines changed: 101 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/cubejs-backend-native/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,16 @@ serde_json = "1.0.127"
4444
simple_logger = "1.7.0"
4545
tokio = { version = "1", features = ["full", "rt"] }
4646
uuid = { version = "1", features = ["v4"] }
47+
log_nonblock = { version = "0.1.6", optional = true }
4748

4849
[dependencies.neon]
4950
version = "=1"
5051
default-features = false
5152
features = ["napi-1", "napi-4", "napi-6", "futures"]
5253

5354
[features]
54-
default = ["neon-entrypoint"]
55+
default = ["neon-entrypoint", "async-log"]
5556
neon-debug = []
5657
neon-entrypoint = []
5758
python = ["pyo3", "pyo3-asyncio"]
59+
async-log = ["log_nonblock"]

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ impl NodeCubeServices {
4747

4848
futures.push(tokio::spawn(async move {
4949
if let Err(e) = gateway_server.processing_loop().await {
50-
log::error!("{}", e.to_string());
50+
log::error!("{}", e);
5151
};
5252

5353
Ok(())

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

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,11 @@ use std::sync::Arc;
3030

3131
use cubesql::telemetry::LocalReporter;
3232
use cubesql::{telemetry::ReportingLogger, CubeError};
33+
#[cfg(feature = "async-log")]
34+
use log_nonblock::NonBlockingLoggerBuilder;
3335
use neon::prelude::*;
3436
use neon::result::Throw;
37+
#[cfg(not(feature = "async-log"))]
3538
use simple_logger::SimpleLogger;
3639

3740
pub(crate) struct SQLInterface {
@@ -578,15 +581,34 @@ pub fn setup_logger(mut cx: FunctionContext) -> JsResult<JsUndefined> {
578581
Ok(cx.undefined())
579582
}
580583

581-
pub fn create_logger(log_level: log::Level) -> SimpleLogger {
582-
SimpleLogger::new()
584+
#[cfg(not(feature = "async-log"))]
585+
pub fn create_logger(log_level: log::Level) -> Box<dyn log::Log> {
586+
let logger = SimpleLogger::new()
587+
.with_level(log::Level::Error.to_level_filter())
588+
.with_module_level("cubesql", log_level.to_level_filter())
589+
.with_module_level("cube_xmla", log_level.to_level_filter())
590+
.with_module_level("cube_xmla_engine", log_level.to_level_filter())
591+
.with_module_level("cubejs_native", log_level.to_level_filter())
592+
.with_module_level("datafusion", log::Level::Warn.to_level_filter())
593+
.with_module_level("pg_srv", log::Level::Warn.to_level_filter());
594+
595+
Box::new(logger)
596+
}
597+
598+
#[cfg(feature = "async-log")]
599+
pub fn create_logger(log_level: log::Level) -> Box<dyn log::Log> {
600+
let logger = NonBlockingLoggerBuilder::new()
583601
.with_level(log::Level::Error.to_level_filter())
584602
.with_module_level("cubesql", log_level.to_level_filter())
585603
.with_module_level("cube_xmla", log_level.to_level_filter())
586604
.with_module_level("cube_xmla_engine", log_level.to_level_filter())
587605
.with_module_level("cubejs_native", log_level.to_level_filter())
588606
.with_module_level("datafusion", log::Level::Warn.to_level_filter())
589607
.with_module_level("pg_srv", log::Level::Warn.to_level_filter())
608+
.build()
609+
.unwrap();
610+
611+
Box::new(logger)
590612
}
591613

592614
pub fn setup_local_logger(log_level: log::Level) {

0 commit comments

Comments
 (0)