Skip to content

Add native CDC support#13287

Open
tclinkenbeard-oai wants to merge 128 commits into
apple:mainfrom
tclinkenbeard-oai:dev/tclinkenbeard/native-fdb-cdc
Open

Add native CDC support#13287
tclinkenbeard-oai wants to merge 128 commits into
apple:mainfrom
tclinkenbeard-oai:dev/tclinkenbeard/native-fdb-cdc

Conversation

@tclinkenbeard-oai

@tclinkenbeard-oai tclinkenbeard-oai commented May 27, 2026

Copy link
Copy Markdown
Collaborator

This PR extends FDB to support natively streaming mutations to tracked key ranges. Clients register CDC streams and these are tracked via CDC proxies, which peek from the log system and pop once acknowledgements are received from clients. New pseudo-tags are added to mutations by commit proxies in order to support this. Overlapping CDC streams are supported, and a mutation can't be safely popped until all CDC streams have sent corresponding acknowledgements. This PR does not add support for the CDC interface in the bindings, that is planned for a future PR.

Full documentation of the feature is added in design/cdc.md.

100k/100k filtered *NativeCDC* correctness tests passed.

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-clang-arm on Linux CentOS 7

  • Commit ID: 9b4b2f5
  • Duration 0:03:36
  • Result: ❌ FAILED
  • Error: Error while executing command: if [[ $(git diff --shortstat 2> /dev/null | tail -n1) == "" ]]; then echo "CODE FORMAT CLEAN"; else echo "CODE FORMAT NOT CLEAN"; echo; echo "THE FOLLOWING FILES NEED TO BE FORMATTED"; echo; git ls-files -m; echo; if [[ $FDB_VERSION =~ 7\.\3. ]]; then echo skip; else exit 1; fi; fi. Reason: exit status 1
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-clang on Linux RHEL 9

  • Commit ID: 9b4b2f5
  • Duration 0:04:20
  • Result: ❌ FAILED
  • Error: Error while executing command: if [[ $(git diff --shortstat 2> /dev/null | tail -n1) == "" ]]; then echo "CODE FORMAT CLEAN"; else echo "CODE FORMAT NOT CLEAN"; echo; echo "THE FOLLOWING FILES NEED TO BE FORMATTED"; echo; git ls-files -m; echo; if [[ $FDB_VERSION =~ 7\.\3. ]]; then echo skip; else exit 1; fi; fi. Reason: exit status 1
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-cluster-tests on Linux RHEL 9

  • Commit ID: 9b4b2f5
  • Duration 0:04:28
  • Result: ❌ FAILED
  • Error: Error while executing command: if [[ $(git diff --shortstat 2> /dev/null | tail -n1) == "" ]]; then echo "CODE FORMAT CLEAN"; else echo "CODE FORMAT NOT CLEAN"; echo; echo "THE FOLLOWING FILES NEED TO BE FORMATTED"; echo; git ls-files -m; echo; if [[ $FDB_VERSION =~ 7\.\3. ]]; then echo skip; else exit 1; fi; fi. Reason: exit status 1
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)
  • Cluster Test Logs zip file of the test logs (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-clang-ide on Linux RHEL 9

  • Commit ID: 9b4b2f5
  • Duration 0:04:24
  • Result: ❌ FAILED
  • Error: Error while executing command: if [[ $(git diff --shortstat 2> /dev/null | tail -n1) == "" ]]; then echo "CODE FORMAT CLEAN"; else echo "CODE FORMAT NOT CLEAN"; echo; echo "THE FOLLOWING FILES NEED TO BE FORMATTED"; echo; git ls-files -m; echo; if [[ $FDB_VERSION =~ 7\.\3. ]]; then echo skip; else exit 1; fi; fi. Reason: exit status 1
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-clang-ide on Linux RHEL 9

  • Commit ID: f9faf26
  • Duration 0:21:50
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@tclinkenbeard-oai tclinkenbeard-oai left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is it trying to do?

This adds native CDC support: durable named CDC streams over registered key ranges, CDC pseudo-tag routing in the commit path, CDC proxies that peek/filter/buffer/serve/ack/pop TLog data, shared-tag safe-pop semantics, recovery/failover support, and simulation coverage. Bindings are intentionally deferred.

Is it correct?

By inspection, yes. I traced the registration/removal metadata path, commit-path CDC tag injection, clear-range clipping, proxy buffering and delivery frontiers, durable acknowledgement reconciliation, active/retired tag popping, recovery retention, proxy recruitment, and primary/remote/satellite TLog propagation.

I also checked the earlier AI-review findings against the current head. The previously reported high/medium issues appear fixed or explicitly documented as intended behavior. I did not find a concrete correctness regression.

Are there bugs?

No confirmed bugs found.

Are there omissions?

No blocking omissions. The test coverage appears broad by inspection: lifecycle behavior, clear clipping, proxy replacement, memory bounds, durable acknowledgement scanning, retired-tag cleanup/recovery, disabled restart/drain, and satellite configurations.

I did not run builds, tests, simulations, or other validation commands.

Are there better ways of doing things?

The remaining notable limitation is scalability: registration, safe-pop reconstruction, and assignment publication still scan global CDC metadata in single transactions. The design already identifies this as a scaling boundary. A future follow-up could maintain per-tag aggregate safe-pop state and an indexed assignment structure so these paths become incremental.

Should this CL be LGTMd?

Yes, subject to the pending public CI completing successfully.

Current public CI has no failures: clang-format and Test Boost CONFIG Mode on Windows pass; the default, clang, clang-arm, clang-ide, macOS, macOS_m1, and cluster-test builders are still pending.

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-macos-m1 on macOS 14.x

  • Commit ID: f9faf26
  • Duration 0:33:28
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@tclinkenbeard-oai

Copy link
Copy Markdown
Collaborator Author

@gxglass I mostly added new test code since the last review, but re-requesting review now while I run another filtered 100k correctness test ensemble, because the PR has grown more

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-clang-arm on Linux RHEL 9

  • Commit ID: f9faf26
  • Duration 0:45:52
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr on Linux RHEL 9

  • Commit ID: f9faf26
  • Duration 0:48:47
  • Result: ❌ FAILED
  • Error: Error while executing command: if python3 -m joshua.joshua list --stopped | grep ${ENSEMBLE_ID} | grep -q 'pass=10[0-9][0-9][0-9]'; then echo PASS; else echo FAIL && exit 1; fi. Reason: exit status 1
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-clang on Linux RHEL 9

  • Commit ID: f9faf26
  • Duration 0:55:51
  • Result: ❌ FAILED
  • Error: Error while executing command: if python3 -m joshua.joshua list --stopped | grep ${ENSEMBLE_ID} | grep -q 'pass=10[0-9][0-9][0-9]'; then echo PASS; else echo FAIL && exit 1; fi. Reason: exit status 1
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-cluster-tests on Linux RHEL 9

  • Commit ID: f9faf26
  • Duration 1:03:40
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)
  • Cluster Test Logs zip file of the test logs (available for 30 days)

@gxglass

gxglass commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator

Here's the current review from local AI. This diff: 60 files changed, 7529 insertions(+), 91 deletions(-).
Human review still pending (took a bit of a delay this week)

pr13287-cdc-review-round3.md

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-macos on macOS 14.x

  • Commit ID: f9faf26
  • Duration 4:07:02
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-clang-ide on Linux RHEL 9

  • Commit ID: eb75790
  • Duration 0:22:04
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-macos-m1 on macOS 14.x

  • Commit ID: eb75790
  • Duration 0:33:18
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-clang-arm on Linux RHEL 9

  • Commit ID: eb75790
  • Duration 0:47:44
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-macos on macOS 14.x

  • Commit ID: eb75790
  • Duration 0:47:50
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-clang on Linux RHEL 9

  • Commit ID: eb75790
  • Duration 0:59:26
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr on Linux RHEL 9

  • Commit ID: eb75790
  • Duration 1:01:16
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-cluster-tests on Linux RHEL 9

  • Commit ID: eb75790
  • Duration 1:03:11
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)
  • Cluster Test Logs zip file of the test logs (available for 30 days)

@gxglass gxglass left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partial review comments follow. This round was essentially just a close second reading of the design doc with a couple Ctrl-F searches to discover knob values for clarity.

This is obviously a very good design doc. It describes the system from all important angles at the right level of detail to convince a reader that the choices are well motivated and can be pulled off. The design itself seems sound and fits in well with how FDB works.

Comments below reflect a few clarity nits and future-work-documentation suggestions, and a question or two. None of this gates LGTM or points to risks/gaps/etc. It's basically just doc enhancement related.

Comment thread design/cdc.md
`fdbclient/CDCProxyInterface.h`.

```cpp
Future<CDCStreamId> registerNativeCdcStreamClient(Database cx, Key name, KeyRange keys);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It helps here and below if readers know that CDCStreamId is a uint64_t typedef (I had to look it up)

Comment thread design/cdc.md Outdated
per-stream in-memory buffer.

All raw peek windows and stream buffers owned by one CDC proxy share a
`CDC_PROXY_BUFFER_BYTES` budget. A replicated log read may retain one separately

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mention production default 1GB

Comment thread design/cdc.md
## Acknowledgement and tag popping

Acknowledgement is per stream, while TLog popping is per CDC tag. This
distinction is the core retention rule.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice

also: it's fifos all the way down

Comment thread design/cdc.md Outdated
retention decision.

Acknowledgement notifications are level-triggered and coalesced for at least
`CDC_PROXY_POP_MIN_INTERVAL`. A notification received during a durable-state

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mention 100ms default for clarity

Comment thread design/cdc.md Outdated
3. For a new name, it validates the feature knob.
4. It allocates a new monotonically increasing `CDCStreamId`.
5. It selects a CDC tag using current active stream counts. The allocator uses
the least populated tag among `NATIVE_CDC_TAG_COUNT` tags, choosing the

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

give production default (256) here

Comment thread design/cdc.md Outdated
differs.

`NATIVE_CDC_TAG_COUNT` controls the bounded tag pool used for new stream
allocation and must be between 1 and 65,536 inclusive. Invalid values reject

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prefer to discuss considerations about how a good default can be chosen. (Also it's totally unclear why somebody would want 64K tags.) I'm guessing the default is chosen by something like the following: it's roughly 10x more than the number of proxies we anticipate, so that load balancing of tags to processes ends up with proxies being roughly evenly balanced even if moderate (small mulitple) per-tag variance in write traffic exists.

Comment thread design/cdc.md
proxy throughput, buffer memory, lag, or number of active readers.
* Assignment mutations use one coalescing change key that wakes a full durable
ownership rescan. This is appropriate for low-rate control-plane changes but
should be sharded if registration and removal throughput becomes material.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

API users should perhaps be aware of this -- maybe mention expected registrations/sec in the API example section much earlier

Comment thread design/cdc.md
response to load. A future implementation can use versioned tag history to
make such changes without losing the ability to read earlier tagged data.
* The native interface does not yet provide external binding support,
administrative tooling, or a higher-level consumer checkpoint abstraction.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a command to force unregister a stream? If not maybe a short section on "Needed for production" stuff (which I think this would be?)

Comment thread design/cdc.md
abandoned consumer, but it would silently violate the stated retention
contract for a slow active stream. The initial design therefore requires an
acknowledgement or explicit removal before releasing required history and
treats administrative expiration policy as future work.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Somehow I'm guessing this is going to need to be invented before long, but of course it's fine to pipeline the work.

Scenario: CDC downstream/consumer system is having trouble, AND FDB performance under tlog spilling is borderline overloaded for a cluster in question. What do we want to happen? I'm guessing some manner of "turn off CDC and recompute downstream application state from a full scan of the database" once the downstream system gets generally unwedged. At least some of the time this would probably be desired. That said, maybe I'm wrong about TLOG performance / spilling being considered something to generally avoid. My impression is we try pretty hard to avoid that locally.

Comment thread design/cdc.md
acknowledgement lag, safe-pop distance, CDC-attributed TLog retention, and proxy
buffer pressure. The oldest required stream ID identifies the first consumer
to investigate. Because the initial implementation has no automatic stream
expiration, operators must repair the consumer, explicitly discard its

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mentioned above but some table of anticipated tooling to guide future development work may be helpful here.

@gxglass gxglass left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review through fdbclient/.

The natural diff ordering here represents a reasonable review order: design/, fdbclient/, fdbserver/, fdbserver/workloads, tests/, so I'll just go in that order.

NOTE: a couple comments below say "uint64_t" when they mean to say "uint16_t".

#include "fdbclient/CommitTransaction.h"
#include "flow/FileIdentifier.h"
#include "fdbrpc/fdbrpc.h"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minor: suggest a link to design/cdc.md re: this protocol & its messages

Optional<Value> decodeTagLocalityListKey(KeyRef const&);
int8_t decodeTagLocalityListValue(ValueRef const&);

// Native CDC stream routing and lifecycle metadata persisted in the transaction state store.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this stuff is well described in the design doc so a comment link here too could be useful

Comment thread fdbclient/NativeCdc.cpp Outdated

bool validNativeCdcTagCount(int tagCount) {
return tagCount > 0 &&
static_cast<uint64_t>(tagCount) <= static_cast<uint64_t>(std::numeric_limits<uint16_t>::max()) + 1;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggest a typedef for the uint64_t because it's used below and drift here would be bad

Comment thread fdbclient/NativeCdc.cpp Outdated
class NativeCdcIdentifierAllocator {
bool sawStream = false;
CDCStreamId maxStreamId = 0;
std::unordered_map<uint16_t, uint32_t> tagStreamCounts;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggest uint64_t ==> CDCTagId_t or something. also increases clarity a little

Comment thread fdbclient/NativeCdc.cpp
}

void signalNativeCdcProxyAssignmentChange(Transaction* tr) {
// Assignment updates are low-rate control-plane operations. A single

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could put a metric to count this to be able to confirm it's actually low rate

Comment thread fdbclient/NativeCdc.cpp
const Key nameKey = cdcStreamNameKeyFor(name);
Optional<Value> currentId = co_await tr.get(nameKey);
if (!nativeCdcNameMatchesStream(currentId, streamId)) {
CODE_PROBE(currentId.present(), "Native CDC preserves a replacement stream during removal retry");

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know how rare this is expected to be but logging something here may be useful

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-clang-arm on Linux RHEL 9

  • Commit ID: b1e3e87
  • Duration 0:46:01
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-clang-ide on Linux RHEL 9

  • Commit ID: b1e3e87
  • Duration 0:46:45
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr on Linux RHEL 9

  • Commit ID: b1e3e87
  • Duration 1:11:09
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-cluster-tests on Linux RHEL 9

  • Commit ID: b1e3e87
  • Duration 1:15:18
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)
  • Cluster Test Logs zip file of the test logs (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-clang on Linux RHEL 9

  • Commit ID: b1e3e87
  • Duration 1:28:31
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-macos-m1 on macOS 14.x

  • Commit ID: b1e3e87
  • Duration 1:40:44
  • Result: ✅ SUCCEEDED
  • Error: N/A
  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

@foundationdb-ci

Copy link
Copy Markdown
Contributor

Result of foundationdb-pr-macos on macOS 14.x

  • Commit ID: b1e3e87
  • Duration 4:12:19
  • Result: ❌ FAILED
  • Error: `Error while executing command: # compatible with bash and zsh
    ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ${HOME}/.ssh_key
    -o ServerAliveInterval=9 ec2-user@${MAC_EC2_HOST} "
    set -e -o noclobber
    BUILDNUM=${CODEBUILD_BUILD_NUMBER}
    WAIT_TIME=14400 # 4 hours
    LOCK_STALE=4500 # 75 minutes
    LOCK=/tmp/ci.lock
    "'

macOS stat flags, not linux compatible

lock_mtime() { stat -f %m $LOCK || echo 0 }
I=0
while ! (echo $BUILDNUM >$LOCK) 2>/dev/null ; do
if (( ++I >= WAIT_TIME )); then
echo "timeout waiting for ci.lock after $I seconds"
exit 1
fi
if (( $(date +%s) - $(lock_mtime) >= LOCK_STALE )); then
echo "lock expired after $LOCK_STALE seconds ..."
# racy but sleep so chances are low
sleep $(( 3 + RANDOM % 8 ))
if (( $(date +%s) - $(lock_mtime) >= LOCK_STALE )); then
echo "lock holder is gone"
rm -f $LOCK
else
echo "new lock holder"
fi
fi
sleep 1
done
echo "acquired ci.lock"
'
. Reason: exit status 1`

  • Build Log terminal output (available for 30 days)
  • Build Workspace zip file of the working directory (available for 30 days)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants