{"record":{"id":"cd642adb6c8dfd4c","repo":"apache/druid","slug":"cannot-load-data-from-location-s-data-pulling","errorCode":null,"errorMessage":"Cannot load data from location [%s]. Data pulling from [%s] not supported","messagePattern":"Cannot load data from location \\[(.+?)\\]\\. Data pulling from \\[(.+?)\\] not supported","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions-core/lookups-cached-global/src/main/java/org/apache/druid/server/lookup/namespace/UriCacheGenerator.java","lineNumber":86,"sourceCode":"  public String generateCache(\n      final UriExtractionNamespace extractionNamespace,\n      final CacheScheduler.EntryImpl<UriExtractionNamespace> entryId,\n      @Nullable final String lastVersion,\n      final CacheHandler cache\n  ) throws Exception\n  {\n    final boolean doSearch = extractionNamespace.getUriPrefix() != null;\n    final URI originalUri = doSearch ? extractionNamespace.getUriPrefix() : extractionNamespace.getUri();\n    final SearchableVersionedDataFinder<URI> pullerRaw = pullers.get(originalUri.getScheme());\n    if (pullerRaw == null) {\n      throw new IAE(\n          \"Unknown loader type[%s].  Known types are %s\",\n          originalUri.getScheme(),\n          pullers.keySet()\n      );\n    }\n    if (!(pullerRaw instanceof URIDataPuller)) {\n      throw new IAE(\n          \"Cannot load data from location [%s]. Data pulling from [%s] not supported\",\n          originalUri,\n          originalUri.getScheme()\n      );\n    }\n    final URIDataPuller puller = (URIDataPuller) pullerRaw;\n    final URI uri;\n    if (doSearch) {\n      final Pattern versionRegex;\n\n      if (extractionNamespace.getFileRegex() != null) {\n        versionRegex = Pattern.compile(extractionNamespace.getFileRegex());\n      } else {\n        versionRegex = null;\n      }\n      uri = pullerRaw.getLatestVersion(\n          extractionNamespace.getUriPrefix(),\n          versionRegex","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/extensions-core/lookups-cached-global/src/main/java/org/apache/druid/server/lookup/namespace/UriCacheGenerator.java#L68-L104","documentation":"Even when a finder exists for the URI scheme, cache generation requires a finder that implements URIDataPuller (i.e. actually supports pulling data). If the resolved finder cannot pull, generateCache() throws this IAE saying pulling from that scheme is not supported.","triggerScenarios":"generateCache() casting the scheme-resolved SearchableVersionedDataFinder to URIDataPuller when the instance does not implement it — a finder registered for the scheme that is read-only/version-inspecting only.","commonSituations":"Custom or third-party URI finder registered for the scheme without URIDataPuller support; misconfiguration where a non-pulling finder shadows the expected one; using static-lookup mode with a URI that requires pulling.","solutions":["Use a URI scheme whose finder implements URIDataPuller (file, http, s3 with the lookups extension).","If you implemented a custom finder, make it implement URIDataPuller or use it only for version detection.","Check extension versions — an outdated extension may provide a non-pulling finder."],"exampleFix":"// before\nfinal URI uri = URI.create(\"custom://bucket/data\"); // finder lacks URIDataPuller\n// after\nfinal URI uri = URI.create(\"https://bucket/data\"); // supported puller","handlingStrategy":"type-guard","validationCode":"SearchableVersionedDataFinder<URI> finder = pullers.get(URI.create(uri).getScheme());\nboolean canPull = finder instanceof URIDataPuller;","typeGuard":"boolean supportsPulling(Object finder) { return finder instanceof URIDataPuller; }","tryCatchPattern":"try { scheduler.schedule(uriNamespace); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"Data pulling from\")) { /* switch to a pulling scheme/extension */ } else { throw e; } }","preventionTips":["Use schemes whose finders implement URIDataPuller","Verify custom finders implement URIDataPuller before registering them"],"tags":["uri","lookup","unsupported-operation"],"backgroundTag":"unsupported-operation","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}