forked from nodejs/node
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
src: support diagnostics channel in the snapshot
PR-URL: nodejs#44193 Refs: nodejs#44014 Refs: nodejs#37476 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Chengzhong Wu <[email protected]>
- Loading branch information
1 parent
deb03c4
commit 82f22ef
Showing
5 changed files
with
132 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
'use strict'; | ||
|
||
const net = require('net'); | ||
const { | ||
setDeserializeMainFunction | ||
} = require('v8').startupSnapshot; | ||
const dc = require('diagnostics_channel'); | ||
|
||
const echoServer = net.Server(function(connection) { | ||
connection.on('data', function(chunk) { | ||
connection.write(chunk); | ||
}); | ||
connection.on('end', function() { | ||
connection.end(); | ||
}); | ||
}); | ||
|
||
const kNumChars = 256; | ||
const buffer = new Uint8Array(kNumChars); | ||
for (let i = 0; i < kNumChars; ++i) { | ||
buffer[i] = i; | ||
} | ||
|
||
let recv = ''; | ||
|
||
echoServer.on('listening', function() { | ||
const port = this.address().port; | ||
console.log(`server port`, port); | ||
const c = net.createConnection({ host: '127.0.0.1', port }); | ||
|
||
c.on('data', function(chunk) { | ||
recv += chunk.toString('latin1'); | ||
|
||
if (recv.length === buffer.length) { | ||
c.end(); | ||
} | ||
}); | ||
|
||
c.on('connect', function() { | ||
c.write(buffer); | ||
}); | ||
|
||
c.on('close', function() { | ||
console.log(`recv.length: ${recv.length}`); | ||
echoServer.close(); | ||
}); | ||
|
||
}); | ||
|
||
dc.subscribe('net.server.socket', (({ socket }) => { | ||
console.log(`From server diagnostics channel:`, socket.localPort); | ||
})); | ||
|
||
dc.subscribe('net.client.socket', (({ socket }) => { | ||
console.log(`From client diagnostics channel`); | ||
})); | ||
|
||
setDeserializeMainFunction(() => { | ||
echoServer.listen(0); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
'use strict'; | ||
|
||
// This tests that a local TCP server can be snapshotted and the | ||
// diagnostics channels work across serialization. | ||
|
||
require('../common'); | ||
const assert = require('assert'); | ||
const { spawnSync } = require('child_process'); | ||
const tmpdir = require('../common/tmpdir'); | ||
const fixtures = require('../common/fixtures'); | ||
const path = require('path'); | ||
const fs = require('fs'); | ||
|
||
tmpdir.refresh(); | ||
const blobPath = path.join(tmpdir.path, 'snapshot.blob'); | ||
const entry = fixtures.path('snapshot', 'server.js'); | ||
{ | ||
const child = spawnSync(process.execPath, [ | ||
'--snapshot-blob', | ||
blobPath, | ||
'--build-snapshot', | ||
entry, | ||
], { | ||
cwd: tmpdir.path | ||
}); | ||
if (child.status !== 0) { | ||
console.log(child.stderr.toString()); | ||
console.log(child.stdout.toString()); | ||
assert.strictEqual(child.status, 0); | ||
} | ||
const stats = fs.statSync(path.join(tmpdir.path, 'snapshot.blob')); | ||
assert(stats.isFile()); | ||
} | ||
|
||
{ | ||
const child = spawnSync(process.execPath, [ | ||
'--snapshot-blob', | ||
blobPath, | ||
], { | ||
cwd: tmpdir.path, | ||
env: { | ||
...process.env, | ||
} | ||
}); | ||
|
||
const stdout = child.stdout.toString().trim(); | ||
console.log(`[stdout]:\n${stdout}\n`); | ||
const stderr = child.stderr.toString().trim(); | ||
console.log(`[stderr]:\n${stderr}\n`); | ||
assert.strictEqual(child.status, 0); | ||
|
||
const lines = stdout.split('\n'); | ||
assert.strictEqual(lines.length, 4); | ||
|
||
// The log should look like this: | ||
// server port ${port} | ||
// From client diagnostics channel | ||
// From server diagnostics channel: ${port} | ||
// recv.length: 256 | ||
assert.match(lines[0], /server port (\d+)/); | ||
const port = lines[0].match(/server port (\d+)/)[1]; | ||
assert.match(lines[1], /From client diagnostics channel/); | ||
assert.match(lines[2], new RegExp(`From server diagnostics channel: ${port}`)); | ||
assert.match(lines[3], /recv\.length: 256/); | ||
} |