class_docstr: A writable datasource that logs node IDs of write tasks, for testing.
class_docstr_tok: ["A","writable","datasource","that","logs","node","IDs","of","write","tasks",",","for","testing","."]
code: def on_write_failed(
      self,
      write_results: List[ObjectRef[WriteResult]],
      error: Exception,
  ) -> None:
      self.num_failed += 1
  
imports: import os
  from typing import Iterable, List
  import pandas
  import pyarrow
  import pyarrow.parquet
  import pytest
  import torchvision
  from fsspec.implementations.http import HTTPFileSystem
  from fsspec.implementations.local import LocalFileSystem
  import ray
  from ray._private.test_utils import wait_for_condition
  from ray.data._internal.execution.interfaces import TaskContext
  from ray.data.block import Block, BlockAccessor
  from ray.data.datasource import Datasource, DummyOutputDatasource, WriteResult
  from ray.data.datasource.file_meta_provider import _handle_read_os_error
  from ray.data.tests.conftest import *
  from ray.data.tests.mock_http_server import *
  from ray.data.tests.util import extract_values
  from ray.tests.conftest import *
  from ray.types import ObjectRef
label_desc: Use image node_id 4 for calling the NodeLoggerOutputDatasource obj's underlying member method code with example usage: obj.on_write_failed(write_results, error) without return types