Skip to content

Commit 196ea99

Browse files
committed
tmp
1 parent a60ffca commit 196ea99

4 files changed

Lines changed: 181 additions & 8 deletions

File tree

.semaphore/semaphore.yml

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,148 @@ blocks:
194194
- bash -c '../../ci/tests/run_perf_test.sh'
195195
- rm -rf ./node_modules
196196

197+
- name: "PR Artifacts: Linux amd64"
198+
run:
199+
when: "branch != 'master' AND tag !~ '^v[0-9]\\.' AND change_in(['/package.json', '/lib', '/src'])"
200+
dependencies: [ ]
201+
task:
202+
agent:
203+
machine:
204+
type: s1-prod-ubuntu24-04-amd64-1
205+
env_vars:
206+
- name: ARCHITECTURE
207+
value: "x64"
208+
- name: PLATFORM
209+
value: "linux"
210+
- name: LIBC
211+
value: "glibc"
212+
prologue:
213+
commands:
214+
- '[[ -z $DOCKERHUB_APIKEY ]] || docker login --username $DOCKERHUB_USER --password $DOCKERHUB_APIKEY'
215+
jobs:
216+
- name: "Build PR Artifact"
217+
matrix:
218+
- env_var: NODE_VERSION_ABI
219+
values:
220+
- 20,115
221+
- 22,127
222+
commands:
223+
- export NODE_VERSION=$(echo $NODE_VERSION_ABI | cut -d, -f1)
224+
- export NODE_ABI=$(echo $NODE_VERSION_ABI | cut -d, -f2)
225+
- export PR_ID="pr-${SEMAPHORE_GIT_BRANCH}-${SEMAPHORE_GIT_SHA:0:7}"
226+
- .semaphore/docker_run_with_volumes.sh node:${NODE_VERSION}-bullseye /v/.semaphore/build-docker-debian.sh
227+
- export PKG_VERSION=$(node -p "require('./package.json').version")
228+
- export ARTIFACT_PATTERN="*-node-v${NODE_ABI}-${PLATFORM}-${LIBC}-${ARCHITECTURE}.tar.gz"
229+
- export BUILT_ARTIFACT=$(find build/stage/${PKG_VERSION} -name "${ARTIFACT_PATTERN}" -type f | head -1)
230+
- if [ -z "$BUILT_ARTIFACT" ]; then echo "Error: Artifact not found"; exit 1; fi
231+
- mkdir -p pr-artifacts/${PR_ID}
232+
- cp "$BUILT_ARTIFACT" "pr-artifacts/${PR_ID}/$(basename $BUILT_ARTIFACT)"
233+
- artifact push workflow "pr-artifacts/${PR_ID}/$(basename $BUILT_ARTIFACT)" --destination "pr-artifacts/${PR_ID}/$(basename $BUILT_ARTIFACT)"
234+
- echo "Published artifact: pr-artifacts/${PR_ID}/$(basename $BUILT_ARTIFACT)"
235+
236+
- name: "PR Artifacts: Linux amd64 (musl)"
237+
run:
238+
when: "branch != 'master' AND tag !~ '^v[0-9]\\.' AND change_in(['/package.json', '/lib', '/src'])"
239+
dependencies: [ ]
240+
task:
241+
agent:
242+
machine:
243+
type: s1-prod-ubuntu24-04-amd64-1
244+
env_vars:
245+
- name: ARCHITECTURE
246+
value: "x64"
247+
- name: PLATFORM
248+
value: "linux"
249+
- name: LIBC
250+
value: "musl"
251+
prologue:
252+
commands:
253+
- '[[ -z $DOCKERHUB_APIKEY ]] || docker login --username $DOCKERHUB_USER --password $DOCKERHUB_APIKEY'
254+
jobs:
255+
- name: "Build PR Artifact"
256+
matrix:
257+
- env_var: NODE_VERSION_ABI
258+
values:
259+
- 20,115
260+
- 22,127
261+
commands:
262+
- export NODE_VERSION=$(echo $NODE_VERSION_ABI | cut -d, -f1)
263+
- export NODE_ABI=$(echo $NODE_VERSION_ABI | cut -d, -f2)
264+
- export PR_ID="pr-${SEMAPHORE_GIT_BRANCH}-${SEMAPHORE_GIT_SHA:0:7}"
265+
- .semaphore/docker_run_with_volumes.sh node:${NODE_VERSION}-alpine /v/.semaphore/build-docker-alpine.sh
266+
- export PKG_VERSION=$(node -p "require('./package.json').version")
267+
- export ARTIFACT_PATTERN="*-node-v${NODE_ABI}-linux-${LIBC}-${ARCHITECTURE}.tar.gz"
268+
- export BUILT_ARTIFACT=$(find build/stage/${PKG_VERSION} -name "${ARTIFACT_PATTERN}" -type f | head -1)
269+
- if [ -z "$BUILT_ARTIFACT" ]; then echo "Error: Artifact not found"; exit 1; fi
270+
- mkdir -p pr-artifacts/${PR_ID}
271+
- cp "$BUILT_ARTIFACT" "pr-artifacts/${PR_ID}/$(basename $BUILT_ARTIFACT)"
272+
- artifact push workflow "pr-artifacts/${PR_ID}/$(basename $BUILT_ARTIFACT)" --destination "pr-artifacts/${PR_ID}/$(basename $BUILT_ARTIFACT)"
273+
- echo "Published artifact: pr-artifacts/${PR_ID}/$(basename $BUILT_ARTIFACT)"
274+
275+
- name: "PR Artifacts: macOS arm64"
276+
run:
277+
when: "branch != 'master' AND tag !~ '^v[0-9]\\.' AND change_in(['/package.json', '/lib', '/src'])"
278+
dependencies: []
279+
task:
280+
agent:
281+
machine:
282+
type: s1-macos-15-arm64-8
283+
env_vars:
284+
- name: ARCHITECTURE
285+
value: "arm64"
286+
- name: PLATFORM
287+
value: "darwin"
288+
- name: LIBC
289+
value: "unknown"
290+
jobs:
291+
- name: "Build PR Artifact"
292+
matrix:
293+
- env_var: NODE_VERSION_ABI
294+
values:
295+
- 20,115
296+
- 22,127
297+
commands:
298+
- export NODE_VERSION=$(echo $NODE_VERSION_ABI | cut -d, -f1)
299+
- export NODE_ABI=$(echo $NODE_VERSION_ABI | cut -d, -f2)
300+
- sem-version node $NODE_VERSION
301+
- export PR_ID="pr-${SEMAPHORE_GIT_BRANCH}-${SEMAPHORE_GIT_SHA:0:7}"
302+
- npm ci
303+
- npx node-pre-gyp package
304+
- export PKG_VERSION=$(node -p "require('./package.json').version")
305+
- export ARTIFACT_PATTERN="*-node-v${NODE_ABI}-${PLATFORM}-${LIBC}-${ARCHITECTURE}.tar.gz"
306+
- export BUILT_ARTIFACT=$(find build/stage/${PKG_VERSION} -name "${ARTIFACT_PATTERN}" -type f | head -1)
307+
- if [ -z "$BUILT_ARTIFACT" ]; then echo "Error: Artifact not found"; exit 1; fi
308+
- mkdir -p pr-artifacts/${PR_ID}
309+
- cp "$BUILT_ARTIFACT" "pr-artifacts/${PR_ID}/$(basename $BUILT_ARTIFACT)"
310+
- artifact push workflow "pr-artifacts/${PR_ID}/$(basename $BUILT_ARTIFACT)" --destination "pr-artifacts/${PR_ID}/$(basename $BUILT_ARTIFACT)"
311+
- echo "Published artifact: pr-artifacts/${PR_ID}/$(basename $BUILT_ARTIFACT)"
312+
313+
- name: "PR Artifacts: Summary"
314+
dependencies:
315+
- "PR Artifacts: Linux amd64"
316+
- "PR Artifacts: Linux amd64 (musl)"
317+
- "PR Artifacts: macOS arm64"
318+
run:
319+
when: "branch != 'master' AND tag !~ '^v[0-9]\\.' AND change_in(['/package.json', '/lib', '/src'])"
320+
task:
321+
agent:
322+
machine:
323+
type: s1-prod-ubuntu24-04-amd64-1
324+
jobs:
325+
- name: "List PR Artifacts"
326+
commands:
327+
- export PR_ID="pr-${SEMAPHORE_GIT_BRANCH}-${SEMAPHORE_GIT_SHA:0:7}"
328+
- artifact pull workflow pr-artifacts/${PR_ID}
329+
- echo "=== PR Artifacts Available for Download ==="
330+
- echo "PR ID: ${PR_ID}"
331+
- echo "Branch: ${SEMAPHORE_GIT_BRANCH}"
332+
- echo "Commit: ${SEMAPHORE_GIT_SHA}"
333+
- echo ""
334+
- echo "Available artifacts:"
335+
- find pr-artifacts/${PR_ID} -name "*.tar.gz" -type f | while read f; do echo " - $(basename $f)"; done || echo " No artifacts found (may still be building)"
336+
- echo ""
337+
- echo "Download artifacts from Semaphore CI workflow artifacts section"
338+
197339
- name: "Linux amd64: Release"
198340
dependencies: [ ]
199341
run:

lib/util.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,4 @@ util.dictToStringList = function (mapOrObject) {
5252
return list;
5353
};
5454

55-
util.bindingVersion = '1.8.0';
55+
util.bindingVersion = '1.8.0-test';

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@confluentinc/kafka-javascript",
3-
"version": "1.8.0",
3+
"version": "1.8.0-test",
44
"description": "Node.js bindings for librdkafka",
55
"librdkafka": "2.13.0",
66
"librdkafka_win": "2.13.0",

src/common.cc

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -262,10 +262,26 @@ v8::Local<v8::Object> ToV8Object(const rd_kafka_Node_t* node) {
262262
*/
263263
v8::Local<v8::Object> obj = Nan::New<v8::Object>();
264264

265+
// Check if node is NULL - can happen during broker restarts/metadata updates
266+
if (!node) {
267+
Nan::Set(obj, Nan::New("id").ToLocalChecked(), Nan::New<v8::Number>(-1));
268+
Nan::Set(obj, Nan::New("host").ToLocalChecked(), Nan::Null());
269+
Nan::Set(obj, Nan::New("port").ToLocalChecked(), Nan::New<v8::Number>(-1));
270+
return obj;
271+
}
272+
265273
Nan::Set(obj, Nan::New("id").ToLocalChecked(),
266274
Nan::New<v8::Number>(rd_kafka_Node_id(node)));
267-
Nan::Set(obj, Nan::New("host").ToLocalChecked(),
268-
Nan::New<v8::String>(rd_kafka_Node_host(node)).ToLocalChecked());
275+
276+
// Check host for NULL before using - prevents segfault when host is NULL
277+
const char* host = rd_kafka_Node_host(node);
278+
if (host) {
279+
Nan::Set(obj, Nan::New("host").ToLocalChecked(),
280+
Nan::New<v8::String>(host).ToLocalChecked());
281+
} else {
282+
Nan::Set(obj, Nan::New("host").ToLocalChecked(), Nan::Null());
283+
}
284+
269285
Nan::Set(obj, Nan::New("port").ToLocalChecked(),
270286
Nan::New<v8::Number>(rd_kafka_Node_port(node)));
271287

@@ -1496,15 +1512,25 @@ v8::Local<v8::Array> FromDescribeTopicsResult(
14961512

14971513
const rd_kafka_Node_t* leader =
14981514
rd_kafka_TopicPartitionInfo_leader(partition);
1499-
Nan::Set(partition_object, Nan::New("leader").ToLocalChecked(),
1500-
Conversion::Util::ToV8Object(leader));
1515+
// Check leader for NULL - can happen when partition has no leader
1516+
if (leader) {
1517+
Nan::Set(partition_object, Nan::New("leader").ToLocalChecked(),
1518+
Conversion::Util::ToV8Object(leader));
1519+
} else {
1520+
Nan::Set(partition_object, Nan::New("leader").ToLocalChecked(), Nan::Null());
1521+
}
15011522

15021523
size_t isr_cnt;
15031524
const rd_kafka_Node_t** isr =
15041525
rd_kafka_TopicPartitionInfo_isr(partition, &isr_cnt);
15051526
v8::Local<v8::Array> isrArray = Nan::New<v8::Array>();
15061527
for (size_t k = 0; k < isr_cnt; k++) {
1507-
Nan::Set(isrArray, k, Conversion::Util::ToV8Object(isr[k]));
1528+
// Check for NULL nodes in ISR array - can happen during broker restarts
1529+
if (isr[k]) {
1530+
Nan::Set(isrArray, k, Conversion::Util::ToV8Object(isr[k]));
1531+
} else {
1532+
Nan::Set(isrArray, k, Nan::Null());
1533+
}
15081534
}
15091535
Nan::Set(partition_object, Nan::New("isr").ToLocalChecked(), isrArray);
15101536

@@ -1513,7 +1539,12 @@ v8::Local<v8::Array> FromDescribeTopicsResult(
15131539
rd_kafka_TopicPartitionInfo_replicas(partition, &replicas_cnt);
15141540
v8::Local<v8::Array> replicasArray = Nan::New<v8::Array>();
15151541
for (size_t k = 0; k < replicas_cnt; k++) {
1516-
Nan::Set(replicasArray, k, Conversion::Util::ToV8Object(replicas[k]));
1542+
// Check for NULL nodes in replicas array - can happen during broker restarts
1543+
if (replicas[k]) {
1544+
Nan::Set(replicasArray, k, Conversion::Util::ToV8Object(replicas[k]));
1545+
} else {
1546+
Nan::Set(replicasArray, k, Nan::Null());
1547+
}
15171548
}
15181549
Nan::Set(partition_object, Nan::New("replicas").ToLocalChecked(),
15191550
replicasArray);

0 commit comments

Comments
 (0)