Selected changesmerged Oct 26, 2026
ENH: implement ExtensionArray.__array_function__ (GH#26380)Python · 80 + / 0 −
Introduces 4 new declarations in pandas/core/arrays/base.py.
Adds new core implementation rather than adjusting what was there. Tests changed with it, with code of their own.
pandas/core/arrays/base.py ↗ · 5 files
@@ -3235,6 +3268,53 @@ def _groupby_first_last( return self.take(result_indices, allow_fill=True) +# -----------------------------------------------------------------------------+# __array_function__ helpers++# True while ExtensionArray.__array_function__ is handling a call+_IN_ARRAY_FUNCTION = contextvars.ContextVar("_IN_ARRAY_FUNCTION", default=False)+++# Overrides so these keep the extension dtype. Returning NotImplemented falls+# back to numpy's implementation.+++def _delete(arr, obj, axis=None):+ # the ExtensionArray may be obj rather than arr+ if (+ not isinstance(arr, ExtensionArray)+ or arr.ndim != 1+ or axis not in (None, 0, -1)+ ):+ return NotImplemented+ return arr.delete(obj)+++def _concatenate(arrays, axis=0, out=None, dtype=None, casting="same_kind"):+ if (+ not isinstance(arrays, (list, tuple))+ or not arrays+ or axis not in (None, 0, -1)+ or out is not None+ or dtype is not None+ or casting != "same_kind"
[Fix] Fix NUMA and cpuset detection in CBPython · 80 + / 9 −
Introduces 3 new declarations in src/transformers/generation/continuous_batching/utils.py.
Adds new core implementation rather than adjusting what was there. Tests changed with it, with code of their own.
src/transformers/generation/continuous_batching/utils.py ↗ · 2 files
@@ -319,6 +325,73 @@ def memory_pool_context(mem_pool: Any) -> AbstractContextManager: # --------------------------------------------------- MEMORY UTILS --------------------------------------------------- # +def _parse_numa_node_list(node_list: str) -> set[int]:+ """Parses a node list in the kernel format, e.g. "0-1,3" -> {0, 1, 3}."""+ nodes = set()+ for node_range in node_list.split(","):+ first_node, _, last_node = node_range.partition("-")+ nodes.update(range(int(first_node), int(last_node or first_node) + 1))+ return nodes+++def _get_allowed_numa_nodes() -> set[int]:+ """Returns the NUMA nodes the process can allocate memory from, i.e. the nodes allowed both by its cpuset (cgroups,+ `docker --cpuset-mems`, ...) and by its memory policy (`numactl --membind`, ...). Returns an empty set if they+ cannot be read, e.g. if we are not on Linux or there is no NUMA support."""+ allowed_sets: list[set[int]] = []++ # Retrieve the allowed nodes from the cpuset+ mems_allowed = None+ try:+ # The cpuset restricts memory to the nodes in "Mems_allowed_list: <nodes>"+ with open("/proc/self/status", encoding="utf-8", errors="replace") as f:+ for line in f:+ if line.startswith("Mems_allowed_list:"):+ mems_allowed = line.split(":")[1].strip()+ break+ except OSError:+ pass++ if mems_allowed is not None:+ allowed_sets.append(_parse_numa_node_list(mems_allowed))+
Pass initial events through input channel preparing for moving the initial event fetching to separate goroutineGo · 69 + / 34 −
Introduces 3 new declarations in staging/src/k8s.io/apiserver/pkg/storage/cacher/cache_watcher.go.
Adds new systems design rather than adjusting what was there. Tests changed with it, with code of their own.
staging/src/k8s.io/apiserver/pkg/storage/cacher/cache_watcher.go ↗ · 3 files
@@ -466,22 +472,60 @@ func (c *cacheWatcher) sendWatchCacheEvent(event *watchCacheEvent) (builtAt, sen return builtAt, sentAt } -func (c *cacheWatcher) process(ctx context.Context, cacheInterval *watchCacheInterval) {+func (c *cacheWatcher) process(ctx context.Context) { defer utilruntime.HandleCrashWithContext(ctx) defer close(c.result) defer c.Stop()+ initialized := false+ var resourceVersion uint64 - if err := c.processInitialEvents(cacheInterval); err != nil {- return+ for {+ select {+ case item, ok := <-c.input:+ if !ok {+ return+ }+ switch {+ case item.interval != nil:+ if initialized {+ klog.ErrorS(nil, "Unexpected interval after watch was already initialized", "resource", c.groupResource, "identifier", c.identifier)+ if consistency.PanicOnCacheInconsistency {+ panic(fmt.Sprintf("Unexpected interval after watch was already initialized, resource: %q, identifier: %q", c.groupResource, c.identifier))+ }+ return+ }+ if err := c.processInitialEvents(item.interval); err != nil {+ return+ }+ resourceVersion = item.interval.resourceVersion+ // At this point we already start processing incoming watch events.
Rollup of 5 pull requestsRust · 146 + / 127 −
Introduces 3 new declarations in compiler/rustc_lint/src/levels.rs.
Adds new language design rather than adjusting what was there. Tests changed with it, with code of their own.
compiler/rustc_lint/src/levels.rs ↗ · 16 files
@@ -713,41 +702,27 @@ where ShouldEmit::ErrorsAndLints { recovery: Recovery::Allowed }, Some(self.registered_lint_tools), );- parsed- .into_iter()- .find_map(|p| {- if let Attribute::Parsed(AttributeKind::LintCheck(lints)) = p {- Some(lints)- } else {- None- }- })- .unwrap_or_default()+ self.add_hir_inner(&parsed, is_crate_node) } - fn add(&mut self, attrs: &[impl AttributeExt + 'static], is_crate_node: bool) {+ fn add_hir(&mut self, attrs: &[Attribute], is_crate_node: bool) { if attrs.is_empty() { return; }- for attr in attrs {- if attr.is_automatically_derived_attr() {- self.provider.insert(- LintId::of(SINGLE_USE_LIFETIMES),- LevelSpec::new(Level::Allow, None, LintLevelSource::Default),- );- continue;- }-- // `#[doc(hidden)]` disables missing_docs check.- if attr.is_doc_hidden() {- self.provider.insert(
Support fs.stat in Turbopack webpack loadersRust · 310 + / 26 −
Introduces 11 new declarations in turbopack/crates/turbo-tasks-fs/src/watcher/mod.rs.
Adds new framework internals rather than adjusting what was there. Tests changed with it, with code of their own.
turbopack/crates/turbo-tasks-fs/src/watcher/mod.rs ↗ · 19 files
@@ -1327,6 +1362,109 @@ mod tests { .unwrap(); } + #[cfg(not(miri))]+ #[tokio::test]+ async fn metadata_events_only_invalidate_metadata_readers() {+ let tt = TurboTasks::new(TurboTasksBackend::new(+ BackendOptions::default(),+ noop_backing_storage(),+ ));+ tt.run_once(async move {+ let invalidator_map = InvalidatorMap::new();+ let dir_invalidator_map = InvalidatorMap::new();+ let metadata_invalidator_map = InvalidatorMap::new();+ let path = PathBuf::from("root/file");+ let invalidator = turbo_tasks::get_invalidator().unwrap();+ invalidator_map.insert(Arc::new(path.clone()), invalidator);+ metadata_invalidator_map.insert(Arc::new(path.clone()), invalidator);++ let mut batch =+ BatchedInvalidations::new(DiskWatcherRecursiveMode::NonRecursive, false);+ let event = notify::Event::new(EventKind::Modify(ModifyKind::Metadata(+ MetadataKind::Permissions,+ )))+ .add_path(path.clone());+ assert!(batch.add_event(+ event,+ &invalidator_map,+ &dir_invalidator_map,+ &metadata_invalidator_map+ ));+ batch.execute(+ &invalidator_map,