Skip to content

Change Tag to hold a String instead of Cow<str> - #52

Merged
morrisonlevi merged 2 commits into
mainfrom
levi/to_owned
Sep 14, 2022
Merged

morrisonlevi merged 2 commits into
mainfrom
levi/to_owned

Conversation

@morrisonlevi

@morrisonlevi morrisonlevi commented Sep 13, 2022 •

Copy link
Copy Markdown
Contributor

What does this PR do?

Change Tag to hold a String instead of Cow<str>.

I also implemented AsRef<str> for Tag.

Motivation

This originated from a lint on nightly which didn't like Cow::to_owned
being called, and instead callers should use Cow::clone or
Cow::into_owned. However, while inspecting the code with fresh eyes, we
saw that we're always holding a Cow::Owned variant, so just hold the
String instead.

Simultaneously, I got a crash report in Rust for the PHP profiler. I
don't support forking, and they forked. Anyway, for this particular
crash it's not much harder to support fork (well, it leaks
technically but works) than to disable everything on a fork. As part of
supporting fork, I need to fixup the process_id tag to have the new
pid after a fork, and Tag::as_ref will help with that.

Additional Notes

I also noticed that we were fully qualifying two usages of DateTime and
Utc even though we're publicly using those, so I shortened them.

How to test the change?

If your code is calling Tag::to_owned then it will break. It should be
reworked into using a Tag::clone or call .to_string on it or similar.

This originated from a lint on nightly which didn't like Cow::to_owned
being called, and instead callers should use Cow::clone or
Cow::into_owned. However, while inspecting the code with fresh eyes, we
saw that we're always holding a Cow::Owned variant, so just hold the
String instead.
@morrisonlevi
morrisonlevi requested a review from a team as a code owner September 13, 2022 16:24
This allows callers to see if a Tag matches a prefix like:

    if tag.as_ref().starts_with("process_id:")

@r1viollet r1viollet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@morrisonlevi
morrisonlevi merged commit 7068677 into main Sep 14, 2022
@morrisonlevi
morrisonlevi deleted the levi/to_owned branch September 14, 2022 20:24
ivoanjo pushed a commit that referenced this pull request Jun 18, 2025
* Initial version of CODEOWNERS

* update CODEOWNERS with new group names

* Update CODEOWNERS
gh-worker-dd-mergequeue-cf854d Bot pushed a commit that referenced this pull request Oct 26, 2026
# What does this PR do?

Adds `Disabled`, `Immediate`, and `FutureExperimentsOnly` evaluation modes using `dd_experimentation_opt_out_at`. SDK wrappers resolve provider configuration; the evaluator reads no process settings.

- Immediate mode skips exposure-logging allocations before targeting and randomization.
- Future mode retains activation strictly before the cutoff. Equal, later, missing, or null activation excludes the allocation.
- Invalid activation returns per-flag `PARSE_ERROR` only for future mode with a valid cutoff, including unreachable allocations.
- Cutoff and activation share the documented ASCII timestamp grammar: valid Gregorian fields, lowercase t/z, nanosecond truncation, and normalized UTC years 0000–9999. Whitespace, named zones, compact offsets and leap seconds are rejected; allocation schedules retain their existing parser.
- Ordinary allocations and retained exposure eligibility remain intact. Existing C entry points retain their default and boolean-mode behavior.

# Motivation

Customers need to exclude subjects from experimentation immediately or from experiments activated at or after their opt-out time.

# Additional Notes

The parser refinement follows the [review feedback](#2698 (comment)) and the scoped D005/D006/D007 contract. The cross-SDK lowercase disagreement remains separately tracked.

# How to test the change?

Native tests cover all 90 shared policy cases, malformed input, unreachable allocations, valid neighboring flags, timestamp boundaries, inactive exclusion calls, and panic containment. Shared fixtures use the merged #52 commit.

| Tested commit | Validation | Result | Evidence |
| --- | --- | --- | --- |
| `DataDog/libdatadog@ead1d3d` | Packaged C integration: mode/cutoff/error boundaries, allocation metadata, exposure eligibility, and legacy APIs; macOS/arm64 | 252 cases and 504 calls passed; 1 FFE example passed. 9 null/array/object attribute cases cannot be represented by the C API. | [Native receipt](https://github.com/DataDog/ffe-system-test-data/blob/98f1f5a4aab6e92fa0b74787cee94e36cc7c8e80/contracts/experimentation-opt-out/evidence/libdatadog-adoption-20261023/native-receipt.json) |

Downstream SDK runtime and telemetry delivery were not tested. [Shared decisions and scoped adoption](https://github.com/DataDog/ffe-system-test-data/blob/98f1f5a4aab6e92fa0b74787cee94e36cc7c8e80/contracts/experimentation-opt-out/libdatadog-adoption.md).

Parser follow-up at [`975c8e4fe`](975c8e4): all 50 timestamp cases pass through both production paths across 464 evaluations, including all seven reviewer examples. The new adapter fails against the prior parser. All 110 native tests pass, including the unchanged 90 policy cases and FFI tests; check, formatting, Clippy, docs and shared-model verification pass. The C integration receipt above remains historical evidence for its stated commit, not this follow-up. [Parser validation and publication receipt](https://github.com/DataDog/ffe-system-test-data/blob/64ea4a312f2167c7d48c7df642ae1e5d0a9327de/contracts/experimentation-opt-out/evidence/libdatadog-parser-20261026/publication.json).


Co-authored-by: leo.romanovsky <leo.romanovsky@datadoghq.com>
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.

4 participants