Skip to content

Commit 347777e

Browse files
fix(compression): restore zops passthrough in CodeFull.gs, add debug logs
- Re-add _doTunnelBatchForwardCompressed and if(req.zops) check - Add info-level batch response body log in client for debugging - Add tunnel-node logs for zops/zc/compression state Known issue: zops request compression decompresses to empty on tunnel-node — response compression (zr) works and provides the speed benefit. Request compression to be fixed separately. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent c465fca commit 347777e

4 files changed

Lines changed: 82 additions & 9 deletions

File tree

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
kotlin version: 2.0.0
2+
error message: java.nio.file.FileSystemException: /Users/vahidt/Library/Application Support/kotlin/daemon/kotlin-daemon-client-tsmarker14146352882521302893.tmp: Operation not permitted
3+
4+
error message: Daemon compilation failed: Could not connect to Kotlin compile daemon
5+
java.lang.RuntimeException: Could not connect to Kotlin compile daemon
6+
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemon(GradleKotlinCompilerWork.kt:214)
7+
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemonOrFallbackImpl(GradleKotlinCompilerWork.kt:159)
8+
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:111)
9+
at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:76)
10+
at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
11+
at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66)
12+
at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62)
13+
at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
14+
at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62)
15+
at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
16+
at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
17+
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
18+
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
19+
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
20+
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
21+
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
22+
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
23+
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
24+
at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
25+
at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59)
26+
at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:174)
27+
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
28+
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:195)
29+
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:128)
30+
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:170)
31+
at org.gradle.internal.Factories$1.create(Factories.java:31)
32+
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:267)
33+
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:131)
34+
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:136)
35+
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:165)
36+
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:134)
37+
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
38+
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
39+
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
40+
at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
41+
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
42+
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
43+
at java.base/java.lang.Thread.run(Thread.java:1583)
44+
45+

assets/apps_script/CodeFull.gs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,11 @@ function _doTunnel(req) {
201201
// On a 5-DNS-query batch, this collapses 5 serial cache.get round trips
202202
// into one cache.getAll round trip.
203203
function _doTunnelBatch(req) {
204+
// Compressed batch: forward opaquely, skip edge-DNS inspection.
205+
if (req.zops) {
206+
return _doTunnelBatchForwardCompressed(req.zops);
207+
}
208+
204209
var ops = (req && req.ops) || [];
205210
var zc = req && req.zc;
206211

@@ -306,6 +311,23 @@ function _doTunnelBatchForward(ops, zc) {
306311
.setMimeType(ContentService.MimeType.JSON);
307312
}
308313

314+
// Compressed forward: zops is an opaque blob, passed to tunnel-node as-is.
315+
// Response is also opaque (may contain zr instead of r).
316+
function _doTunnelBatchForwardCompressed(zops) {
317+
var resp = UrlFetchApp.fetch(TUNNEL_SERVER_URL + "/tunnel/batch", {
318+
method: "post",
319+
contentType: "application/json",
320+
payload: JSON.stringify({ k: TUNNEL_AUTH_KEY, zops: zops }),
321+
muteHttpExceptions: true,
322+
followRedirects: true,
323+
});
324+
if (resp.getResponseCode() !== 200) {
325+
return _json({ e: "tunnel batch HTTP " + resp.getResponseCode() });
326+
}
327+
return ContentService.createTextOutput(resp.getContentText())
328+
.setMimeType(ContentService.MimeType.JSON);
329+
}
330+
309331
// Forward + parse for the splice path. Returns { r:[...] } on success or
310332
// { error: "..." } on any failure.
311333
function _doTunnelBatchFetch(ops, zc) {

src/domain_fronter.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3248,10 +3248,10 @@ impl DomainFronter {
32483248
// credentials), and even at debug level a leaked log line ends
32493249
// up in user-shared bug reports. Status + length are sufficient
32503250
// for diagnosis; full body is available behind RUST_LOG=trace.
3251-
tracing::debug!(
3252-
"batch response: status={} body_len={}",
3251+
tracing::info!(
3252+
"batch response: status={} body={}",
32533253
status,
3254-
json_str.len()
3254+
&json_str[..json_str.len().min(200)]
32553255
);
32563256
tracing::trace!(
32573257
"batch response body (trace only): {}",
@@ -3260,12 +3260,15 @@ impl DomainFronter {
32603260
match serde_json::from_str::<BatchTunnelResponse>(json_str) {
32613261
Ok(mut resp) => {
32623262
if let Some(zr_b64) = resp.zr.take() {
3263-
if let Ok(compressed) = B64.decode(&zr_b64) {
3264-
if let Ok(decompressed) = zstd::decode_all(compressed.as_slice()) {
3265-
if let Ok(r) = serde_json::from_slice(&decompressed) {
3266-
resp.r = r;
3267-
}
3268-
}
3263+
match B64.decode(&zr_b64) {
3264+
Ok(compressed) => match zstd::decode_all(compressed.as_slice()) {
3265+
Ok(decompressed) => match serde_json::from_slice(&decompressed) {
3266+
Ok(r) => { resp.r = r; }
3267+
Err(e) => tracing::error!("zr json parse failed: {}", e),
3268+
},
3269+
Err(e) => tracing::error!("zr zstd decompress failed: {}", e),
3270+
},
3271+
Err(e) => tracing::error!("zr base64 decode failed: {}", e),
32693272
}
32703273
}
32713274
if resp.zc.is_some() && !self.zstd_enabled.load(Ordering::Relaxed) {

tunnel-node/src/main.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,7 @@ async fn handle_batch(
779779

780780
let had_zops = req.zops.is_some();
781781
let client_zstd = had_zops || req.zc.is_some();
782+
tracing::info!("batch: had_zops={} zc={:?} client_zstd={} ops_len={}", had_zops, req.zc, client_zstd, req.ops.len());
782783
let ops: Vec<BatchOp> = if let Some(zops_b64) = req.zops {
783784
match B64.decode(&zops_b64) {
784785
Ok(compressed) => match zstd::decode_all(compressed.as_slice()) {
@@ -1252,11 +1253,13 @@ async fn handle_batch(
12521253
results.sort_by_key(|(i, _)| *i);
12531254
let r_vec: Vec<TunnelResponse> = results.into_iter().map(|(_, r)| r).collect();
12541255

1256+
tracing::info!("batch response: r_count={} client_zstd={}", r_vec.len(), client_zstd);
12551257
let json = if client_zstd {
12561258
let r_json = serde_json::to_vec(&r_vec).unwrap_or_default();
12571259
match zstd::encode_all(r_json.as_slice(), 3) {
12581260
Ok(compressed) => {
12591261
let zr_b64 = B64.encode(&compressed);
1262+
tracing::info!("batch response: sending zr ({} bytes compressed)", compressed.len());
12601263
serde_json::to_vec(&serde_json::json!({"zr": zr_b64, "zc": 1})).unwrap_or_default()
12611264
}
12621265
Err(_) => serde_json::to_vec(&BatchResponse { r: r_vec }).unwrap_or_default(),

0 commit comments

Comments
 (0)