1 /***********************************************************************
2  * Copyright (c) 2013-2024 Commonwealth Computer Research, Inc.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Apache License, Version 2.0
5  * which accompanies this distribution and is available at
6  * http://www.opensource.org/licenses/apache2.0.php.
7  ***********************************************************************/
8 
9 package org.locationtech.geomesa.fs.data
10 
11 import com.github.benmanes.caffeine.cache.{CacheLoader, Caffeine}
12 import com.typesafe.scalalogging.LazyLogging
13 import org.apache.hadoop.conf.Configuration
14 import org.apache.hadoop.fs.{FileContext, Path}
15 import org.locationtech.geomesa.fs.storage.api._
16 import org.locationtech.geomesa.fs.storage.common.utils.PathCache
17 import org.locationtech.geomesa.utils.io.CloseQuietly
18 import org.locationtech.geomesa.utils.stats.MethodProfiling
19 
20 import java.util.concurrent.ConcurrentHashMap
21 import scala.util.control.NonFatal
22 
23 /**
24   * Manages the storages and associated simple feature types underneath a given path
25   *
26   * @param fc file context
27   * @param conf configuration
28   * @param root root path for the data store
29   */
30 class FileSystemStorageManager private (fc: FileContext, conf: Configuration, root: Path, namespace: Option[String])
31     extends MethodProfiling with LazyLogging {
32 
33   import scala.collection.JavaConverters._
34 
35   private val cache = new ConcurrentHashMap[String, (Path, FileSystemStorage)]().asScala
36 
37   /**
38     * Gets the storage associated with the given simple feature type, if any
39     *
40     * @param typeName simple feature type name
41     * @return
42     */
43   def storage(typeName: String): Option[FileSystemStorage] = {
44     cache.get(typeName).map(_._2) // check cached values
45         .orElse(Some(defaultPath(typeName)).filter(PathCache.exists(fc, _)).flatMap(loadPath)) // check expected (default) path
46         .orElse(loadAll().find(_.metadata.sft.getTypeName == typeName)) // check other paths until we find it
47   }
48 
49   /**
50     * Gets all storages under the root path
51     *
52     * @return
53     */
54   def storages(): Seq[FileSystemStorage] = {
55     loadAll().foreach(_ => ()) // force loading of everything
56     cache.map { case (_, (_, storage)) => storage }.toSeq
57   }
58 
59   /**
60     * Caches a storage instance for future use. Avoids loading it a second time if referenced later.
61     *
62     * @param path path for the storage
63     * @param storage storage instance
64     */
65   def register(path: Path, storage: FileSystemStorage): Unit =
66     cache.put(storage.metadata.sft.getTypeName, (path, storage))
67 
68   /**
69     * Default path for a given simple feature type name. Generally the simple feature type will go under
70     * a folder with the type name, but this is not required
71     *
72     * @param typeName simple feature type name
73     * @return
74     */
75   def defaultPath(typeName: String): Path = new Path(root, typeName)
76 
77   /**
78     * Loads all storages under this root (if they aren't already loaded)
79     *
80     * @return
81     */
82   private def loadAll(): Iterator[FileSystemStorage] = {
83     if (!PathCache.exists(fc, root)) { Iterator.empty } else {
84       val dirs = PathCache.list(fc, root).filter(_.isDirectory).map(_.getPath)
85       dirs.filterNot(path => cache.exists { case (_, (p, _)) => p == path }).flatMap(loadPath)
86     }
87   }
88 
89   /**
90     * Attempt to load a storage under the given root path. Requires an appropriate storage implementation
91     * to be available on the classpath.
92     *
93     * @param path storage root path
94     * @return
95     */
96   private def loadPath(path: Path): Option[FileSystemStorage] = {
97 
98     def complete(storage: Option[FileSystemStorage], time: Long): Unit =
99       logger.debug(s"${ if (storage.isDefined) "Loaded" else "No" } storage at path '$path' in ${time}ms")
100 
101     profile(complete _) {
102       val context = FileSystemContext(fc, conf, path, namespace)
103       StorageMetadataFactory.load(context).map { meta =>
104         try {
105           val storage = FileSystemStorageFactory(context, meta)
106           register(path, storage)
107           storage
108         } catch {
109           case NonFatal(e) => CloseQuietly(meta).foreach(e.addSuppressed); throw e
110         }
111       }
112     }
113   }
114 }
115 
116 object FileSystemStorageManager {
117 
118   private val cache = Caffeine.newBuilder().build(
119     new CacheLoader[(FileContext, Configuration, Path, Option[String]), FileSystemStorageManager]() {
120       override def load(key: (FileContext, Configuration, Path, Option[String])): FileSystemStorageManager =
121         new FileSystemStorageManager(key._1, key._2, key._3, key._4)
122     }
123   )
124 
125   /**
126     * Load a cached storage manager instance
127     *
128     * @param fc file context
129     * @param conf configuration
130     * @param root data store root path
131     * @return
132     */
133   def apply(fc: FileContext, conf: Configuration, root: Path, namespace: Option[String]): FileSystemStorageManager =
134     cache.get((fc, conf, root, namespace))
135 }
Line Stmt Id Pos Tree Symbol Tests Code
35 84591 1453 - 1519 Select scala.collection.convert.Decorators.AsScala.asScala scala.collection.JavaConverters.mapAsScalaConcurrentMapConverter[String, (org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage)](new java.util.concurrent.ConcurrentHashMap[String,(org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage)]()).asScala
35 84590 1453 - 1511 Apply java.util.concurrent.ConcurrentHashMap.<init> new java.util.concurrent.ConcurrentHashMap[String,(org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage)]()
44 84592 1769 - 1773 Select scala.Tuple2._2 x$1._2
45 84593 1819 - 1840 Apply org.locationtech.geomesa.fs.data.FileSystemStorageManager.defaultPath FileSystemStorageManager.this.defaultPath(typeName)
45 84595 1849 - 1872 Apply org.locationtech.geomesa.fs.storage.common.utils.PathCache.exists org.locationtech.geomesa.fs.storage.common.utils.PathCache.exists(FileSystemStorageManager.this.fc, x$2, org.locationtech.geomesa.fs.storage.common.utils.PathCache.exists$default$3)
45 84594 1866 - 1868 Select org.locationtech.geomesa.fs.data.FileSystemStorageManager.fc FileSystemStorageManager.this.fc
45 84597 1814 - 1891 Apply scala.Option.flatMap scala.Some.apply[org.apache.hadoop.fs.Path](FileSystemStorageManager.this.defaultPath(typeName)).filter(((x$2: org.apache.hadoop.fs.Path) => org.locationtech.geomesa.fs.storage.common.utils.PathCache.exists(FileSystemStorageManager.this.fc, x$2, org.locationtech.geomesa.fs.storage.common.utils.PathCache.exists$default$3))).flatMap[org.locationtech.geomesa.fs.storage.api.FileSystemStorage]({ ((path: org.apache.hadoop.fs.Path) => FileSystemStorageManager.this.loadPath(path)) })
45 84596 1882 - 1890 Apply org.locationtech.geomesa.fs.data.FileSystemStorageManager.loadPath FileSystemStorageManager.this.loadPath(path)
46 84599 1942 - 1996 Apply scala.collection.Iterator.find FileSystemStorageManager.this.loadAll().find(((x$3: org.locationtech.geomesa.fs.storage.api.FileSystemStorage) => x$3.metadata.sft.getTypeName().==(typeName)))
46 84598 1957 - 1995 Apply java.lang.Object.== x$3.metadata.sft.getTypeName().==(typeName)
46 84600 1745 - 1997 Apply scala.Option.orElse FileSystemStorageManager.this.cache.get(typeName).map[org.locationtech.geomesa.fs.storage.api.FileSystemStorage](((x$1: (org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage)) => x$1._2)).orElse[org.locationtech.geomesa.fs.storage.api.FileSystemStorage](scala.Some.apply[org.apache.hadoop.fs.Path](FileSystemStorageManager.this.defaultPath(typeName)).filter(((x$2: org.apache.hadoop.fs.Path) => org.locationtech.geomesa.fs.storage.common.utils.PathCache.exists(FileSystemStorageManager.this.fc, x$2, org.locationtech.geomesa.fs.storage.common.utils.PathCache.exists$default$3))).flatMap[org.locationtech.geomesa.fs.storage.api.FileSystemStorage]({ ((path: org.apache.hadoop.fs.Path) => FileSystemStorageManager.this.loadPath(path)) })).orElse[org.locationtech.geomesa.fs.storage.api.FileSystemStorage](FileSystemStorageManager.this.loadAll().find(((x$3: org.locationtech.geomesa.fs.storage.api.FileSystemStorage) => x$3.metadata.sft.getTypeName().==(typeName))))
55 84601 2190 - 2192 Literal <nosymbol> ()
55 84602 2167 - 2193 Apply scala.collection.Iterator.foreach FileSystemStorageManager.this.loadAll().foreach[Unit](((x$4: org.locationtech.geomesa.fs.storage.api.FileSystemStorage) => ()))
56 84603 2267 - 2274 Ident org.locationtech.geomesa.fs.data.FileSystemStorageManager.storage storage
56 84605 2229 - 2282 Select scala.collection.TraversableOnce.toSeq FileSystemStorageManager.this.cache.map[org.locationtech.geomesa.fs.storage.api.FileSystemStorage, scala.collection.mutable.Iterable[org.locationtech.geomesa.fs.storage.api.FileSystemStorage]](((x0$1: (String, (org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage))) => x0$1 match { case (_1: String, _2: (org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage))(String, (org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage))(_, (_1: org.apache.hadoop.fs.Path, _2: org.locationtech.geomesa.fs.storage.api.FileSystemStorage)(org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage)(_, (storage @ _))) => storage }))(mutable.this.Iterable.canBuildFrom[org.locationtech.geomesa.fs.storage.api.FileSystemStorage]).toSeq
56 84604 2239 - 2239 TypeApply scala.collection.mutable.Iterable.canBuildFrom mutable.this.Iterable.canBuildFrom[org.locationtech.geomesa.fs.storage.api.FileSystemStorage]
66 84607 2596 - 2611 Apply scala.Tuple2.apply scala.Tuple2.apply[org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage](path, storage)
66 84606 2562 - 2594 Apply org.geotools.api.feature.simple.SimpleFeatureType.getTypeName storage.metadata.sft.getTypeName()
66 84609 2561 - 2561 Literal <nosymbol> ()
66 84608 2552 - 2612 Apply scala.collection.mutable.MapLike.put FileSystemStorageManager.this.cache.put(storage.metadata.sft.getTypeName(), scala.Tuple2.apply[org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage](path, storage))
75 84611 2903 - 2927 Apply org.apache.hadoop.fs.Path.<init> new org.apache.hadoop.fs.Path(FileSystemStorageManager.this.root, typeName)
75 84610 2912 - 2916 Select org.locationtech.geomesa.fs.data.FileSystemStorageManager.root FileSystemStorageManager.this.root
83 84613 3122 - 3126 Select org.locationtech.geomesa.fs.data.FileSystemStorageManager.root FileSystemStorageManager.this.root
83 84612 3118 - 3120 Select org.locationtech.geomesa.fs.data.FileSystemStorageManager.fc FileSystemStorageManager.this.fc
83 84615 3131 - 3145 Select scala.collection.Iterator.empty scala.`package`.Iterator.empty
83 84614 3100 - 3127 Select scala.Boolean.unary_! org.locationtech.geomesa.fs.storage.common.utils.PathCache.exists(FileSystemStorageManager.this.fc, FileSystemStorageManager.this.root, org.locationtech.geomesa.fs.storage.common.utils.PathCache.exists$default$3).unary_!
83 84616 3131 - 3145 Block scala.collection.Iterator.empty scala.`package`.Iterator.empty
83 84628 3153 - 3334 Block <nosymbol> { val dirs: Iterator[org.apache.hadoop.fs.Path] = org.locationtech.geomesa.fs.storage.common.utils.PathCache.list(FileSystemStorageManager.this.fc, FileSystemStorageManager.this.root, org.locationtech.geomesa.fs.storage.common.utils.PathCache.list$default$3).filter(((x$5: org.apache.hadoop.fs.FileStatus) => x$5.isDirectory())).map[org.apache.hadoop.fs.Path](((x$6: org.apache.hadoop.fs.FileStatus) => x$6.getPath())); dirs.filterNot(((path: org.apache.hadoop.fs.Path) => FileSystemStorageManager.this.cache.exists(((x0$1: (String, (org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage))) => x0$1 match { case (_1: String, _2: (org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage))(String, (org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage))(_, (_1: org.apache.hadoop.fs.Path, _2: org.locationtech.geomesa.fs.storage.api.FileSystemStorage)(org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage)((p @ _), _)) => p.==(path) })))).flatMap[org.locationtech.geomesa.fs.storage.api.FileSystemStorage]({ ((path: org.apache.hadoop.fs.Path) => scala.this.Option.option2Iterable[org.locationtech.geomesa.fs.storage.api.FileSystemStorage](FileSystemStorageManager.this.loadPath(path))) }) }
84 84617 3187 - 3189 Select org.locationtech.geomesa.fs.data.FileSystemStorageManager.fc FileSystemStorageManager.this.fc
84 84619 3204 - 3217 Apply org.apache.hadoop.fs.FileStatus.isDirectory x$5.isDirectory()
84 84618 3191 - 3195 Select org.locationtech.geomesa.fs.data.FileSystemStorageManager.root FileSystemStorageManager.this.root
84 84621 3172 - 3233 Apply scala.collection.Iterator.map org.locationtech.geomesa.fs.storage.common.utils.PathCache.list(FileSystemStorageManager.this.fc, FileSystemStorageManager.this.root, org.locationtech.geomesa.fs.storage.common.utils.PathCache.list$default$3).filter(((x$5: org.apache.hadoop.fs.FileStatus) => x$5.isDirectory())).map[org.apache.hadoop.fs.Path](((x$6: org.apache.hadoop.fs.FileStatus) => x$6.getPath()))
84 84620 3223 - 3232 Apply org.apache.hadoop.fs.FileStatus.getPath x$6.getPath()
85 84623 3298 - 3307 Block java.lang.Object.== p.==(path)
85 84622 3298 - 3307 Apply java.lang.Object.== p.==(path)
85 84625 3319 - 3327 Apply org.locationtech.geomesa.fs.data.FileSystemStorageManager.loadPath FileSystemStorageManager.this.loadPath(path)
85 84624 3263 - 3309 Apply scala.collection.IterableLike.exists FileSystemStorageManager.this.cache.exists(((x0$1: (String, (org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage))) => x0$1 match { case (_1: String, _2: (org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage))(String, (org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage))(_, (_1: org.apache.hadoop.fs.Path, _2: org.locationtech.geomesa.fs.storage.api.FileSystemStorage)(org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage)((p @ _), _)) => p.==(path) }))
85 84627 3240 - 3328 Apply scala.collection.Iterator.flatMap dirs.filterNot(((path: org.apache.hadoop.fs.Path) => FileSystemStorageManager.this.cache.exists(((x0$1: (String, (org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage))) => x0$1 match { case (_1: String, _2: (org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage))(String, (org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage))(_, (_1: org.apache.hadoop.fs.Path, _2: org.locationtech.geomesa.fs.storage.api.FileSystemStorage)(org.apache.hadoop.fs.Path, org.locationtech.geomesa.fs.storage.api.FileSystemStorage)((p @ _), _)) => p.==(path) })))).flatMap[org.locationtech.geomesa.fs.storage.api.FileSystemStorage]({ ((path: org.apache.hadoop.fs.Path) => scala.this.Option.option2Iterable[org.locationtech.geomesa.fs.storage.api.FileSystemStorage](FileSystemStorageManager.this.loadPath(path))) })
85 84626 3319 - 3327 ApplyImplicitView scala.Option.option2Iterable scala.this.Option.option2Iterable[org.locationtech.geomesa.fs.storage.api.FileSystemStorage](FileSystemStorageManager.this.loadPath(path))
101 84629 3815 - 3823 Apply org.locationtech.geomesa.fs.data.FileSystemStorageManager.complete complete(storage, time)
101 84643 3807 - 4205 Apply org.locationtech.geomesa.utils.stats.MethodProfiling.profile FileSystemStorageManager.this.profile[Option[org.locationtech.geomesa.fs.storage.api.FileSystemStorage]]({ ((storage: Option[org.locationtech.geomesa.fs.storage.api.FileSystemStorage], time: Long) => complete(storage, time)) })({ val context: org.locationtech.geomesa.fs.storage.api.FileSystemContext = org.locationtech.geomesa.fs.storage.api.`package`.FileSystemContext.apply(FileSystemStorageManager.this.fc, FileSystemStorageManager.this.conf, path, FileSystemStorageManager.this.namespace); org.locationtech.geomesa.fs.storage.api.StorageMetadataFactory.load(context).map[org.locationtech.geomesa.fs.storage.api.FileSystemStorage](((meta: org.locationtech.geomesa.fs.storage.api.StorageMetadata) => try { val storage: org.locationtech.geomesa.fs.storage.api.FileSystemStorage = org.locationtech.geomesa.fs.storage.api.FileSystemStorageFactory.apply(context, meta); FileSystemStorageManager.this.register(path, storage); storage } catch { case scala.util.control.NonFatal.unapply(<unapply-selector>) <unapply> ((e @ _)) => { org.locationtech.geomesa.utils.io.`package`.CloseQuietly.apply[org.locationtech.geomesa.fs.storage.api.StorageMetadata](meta)(io.this.IsCloseable.closeableIsCloseable).foreach[Unit]({ ((x$1: Throwable) => e.addSuppressed(x$1)) }); throw e } })) })
102 84631 3871 - 3875 Select org.locationtech.geomesa.fs.data.FileSystemStorageManager.conf FileSystemStorageManager.this.conf
102 84630 3867 - 3869 Select org.locationtech.geomesa.fs.data.FileSystemStorageManager.fc FileSystemStorageManager.this.fc
102 84633 3849 - 3893 Apply org.locationtech.geomesa.fs.storage.api.FileSystemContext.apply org.locationtech.geomesa.fs.storage.api.`package`.FileSystemContext.apply(FileSystemStorageManager.this.fc, FileSystemStorageManager.this.conf, path, FileSystemStorageManager.this.namespace)
102 84632 3883 - 3892 Select org.locationtech.geomesa.fs.data.FileSystemStorageManager.namespace FileSystemStorageManager.this.namespace
103 84642 3900 - 4199 Apply scala.Option.map org.locationtech.geomesa.fs.storage.api.StorageMetadataFactory.load(context).map[org.locationtech.geomesa.fs.storage.api.FileSystemStorage](((meta: org.locationtech.geomesa.fs.storage.api.StorageMetadata) => try { val storage: org.locationtech.geomesa.fs.storage.api.FileSystemStorage = org.locationtech.geomesa.fs.storage.api.FileSystemStorageFactory.apply(context, meta); FileSystemStorageManager.this.register(path, storage); storage } catch { case scala.util.control.NonFatal.unapply(<unapply-selector>) <unapply> ((e @ _)) => { org.locationtech.geomesa.utils.io.`package`.CloseQuietly.apply[org.locationtech.geomesa.fs.storage.api.StorageMetadata](meta)(io.this.IsCloseable.closeableIsCloseable).foreach[Unit]({ ((x$1: Throwable) => e.addSuppressed(x$1)) }); throw e } }))
104 84636 3975 - 4080 Block <nosymbol> { val storage: org.locationtech.geomesa.fs.storage.api.FileSystemStorage = org.locationtech.geomesa.fs.storage.api.FileSystemStorageFactory.apply(context, meta); FileSystemStorageManager.this.register(path, storage); storage }
105 84634 3989 - 4028 Apply org.locationtech.geomesa.fs.storage.api.FileSystemStorageFactory.apply org.locationtech.geomesa.fs.storage.api.FileSystemStorageFactory.apply(context, meta)
106 84635 4039 - 4062 Apply org.locationtech.geomesa.fs.data.FileSystemStorageManager.register FileSystemStorageManager.this.register(path, storage)
109 84637 4141 - 4141 Select org.locationtech.geomesa.utils.io.IsCloseableImplicits.closeableIsCloseable io.this.IsCloseable.closeableIsCloseable
109 84639 4129 - 4172 Apply scala.Option.foreach org.locationtech.geomesa.utils.io.`package`.CloseQuietly.apply[org.locationtech.geomesa.fs.storage.api.StorageMetadata](meta)(io.this.IsCloseable.closeableIsCloseable).foreach[Unit]({ ((x$1: Throwable) => e.addSuppressed(x$1)) })
109 84638 4156 - 4171 Apply java.lang.Throwable.addSuppressed e.addSuppressed(x$1)
109 84641 4126 - 4181 Block <nosymbol> { org.locationtech.geomesa.utils.io.`package`.CloseQuietly.apply[org.locationtech.geomesa.fs.storage.api.StorageMetadata](meta)(io.this.IsCloseable.closeableIsCloseable).foreach[Unit]({ ((x$1: Throwable) => e.addSuppressed(x$1)) }); throw e }
109 84640 4174 - 4181 Throw <nosymbol> throw e
118 84650 4270 - 4588 Apply com.github.benmanes.caffeine.cache.Caffeine.build com.github.benmanes.caffeine.cache.Caffeine.newBuilder().build[(org.apache.hadoop.fs.FileContext, org.apache.hadoop.conf.Configuration, org.apache.hadoop.fs.Path, Option[String]), org.locationtech.geomesa.fs.data.FileSystemStorageManager]({ final class $anon extends Object with com.github.benmanes.caffeine.cache.CacheLoader[(org.apache.hadoop.fs.FileContext, org.apache.hadoop.conf.Configuration, org.apache.hadoop.fs.Path, Option[String]),org.locationtech.geomesa.fs.data.FileSystemStorageManager] { def <init>(): <$anon: com.github.benmanes.caffeine.cache.CacheLoader[(org.apache.hadoop.fs.FileContext, org.apache.hadoop.conf.Configuration, org.apache.hadoop.fs.Path, Option[String]),org.locationtech.geomesa.fs.data.FileSystemStorageManager]> = { $anon.super.<init>(); () }; override def load(key: (org.apache.hadoop.fs.FileContext, org.apache.hadoop.conf.Configuration, org.apache.hadoop.fs.Path, Option[String])): org.locationtech.geomesa.fs.data.FileSystemStorageManager = new FileSystemStorageManager(key._1, key._2, key._3, key._4) }; new $anon() })
119 84649 4303 - 4306 Apply org.locationtech.geomesa.fs.data.FileSystemStorageManager.$anon.<init> new $anon()
121 84645 4555 - 4561 Select scala.Tuple4._2 key._2
121 84644 4547 - 4553 Select scala.Tuple4._1 key._1
121 84647 4571 - 4577 Select scala.Tuple4._4 key._4
121 84646 4563 - 4569 Select scala.Tuple4._3 key._3
121 84648 4518 - 4578 Apply org.locationtech.geomesa.fs.data.FileSystemStorageManager.<init> new FileSystemStorageManager(key._1, key._2, key._3, key._4)
134 84651 4899 - 4926 Apply scala.Tuple4.apply scala.Tuple4.apply[org.apache.hadoop.fs.FileContext, org.apache.hadoop.conf.Configuration, org.apache.hadoop.fs.Path, Option[String]](fc, conf, root, namespace)
134 84652 4889 - 4927 Apply com.github.benmanes.caffeine.cache.LoadingCache.get FileSystemStorageManager.this.cache.get(scala.Tuple4.apply[org.apache.hadoop.fs.FileContext, org.apache.hadoop.conf.Configuration, org.apache.hadoop.fs.Path, Option[String]](fc, conf, root, namespace))