This is an automated email from the ASF dual-hosted git repository.

gabota pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/hadoop.git


The following commit(s) were added to refs/heads/trunk by this push:
     new c58e11b  HADOOP-16383. Pass ITtlTimeProvider instance in initialize 
method in MetadataStore interface.  Contributed by Gabor Bota. (#1009)
c58e11b is described below

commit c58e11bf521d746842ce16724211a2a0339d7b61
Author: Gabor Bota <gabor.b...@cloudera.com>
AuthorDate: Wed Jul 17 16:24:39 2019 +0200

    HADOOP-16383. Pass ITtlTimeProvider instance in initialize method in 
MetadataStore interface.  Contributed by Gabor Bota. (#1009)
---
 .../org/apache/hadoop/fs/s3a/S3AFileSystem.java    |  7 ++-
 .../fs/s3a/impl/MultiObjectDeleteSupport.java      |  2 +-
 .../fs/s3a/s3guard/DelayedUpdateRenameTracker.java | 12 ++--
 .../fs/s3a/s3guard/DynamoDBMetadataStore.java      | 73 +++++++++++-----------
 .../hadoop/fs/s3a/s3guard/LocalMetadataStore.java  | 39 +++++++-----
 .../hadoop/fs/s3a/s3guard/MetadataStore.java       | 40 ++++++------
 .../hadoop/fs/s3a/s3guard/NullMetadataStore.java   | 16 +++--
 .../fs/s3a/s3guard/ProgressiveRenameTracker.java   | 16 ++---
 .../org/apache/hadoop/fs/s3a/s3guard/S3Guard.java  | 14 +++--
 .../apache/hadoop/fs/s3a/s3guard/S3GuardTool.java  |  4 +-
 .../s3a/ITestS3AMetadataPersistenceException.java  |  4 +-
 .../fs/s3a/impl/TestPartialDeleteFailures.java     | 18 +++---
 .../fs/s3a/s3guard/ITestDynamoDBMetadataStore.java | 21 +++----
 .../s3guard/ITestDynamoDBMetadataStoreScale.java   |  6 +-
 .../fs/s3a/s3guard/ITestS3GuardConcurrentOps.java  |  4 +-
 .../fs/s3a/s3guard/ITestS3GuardToolDynamoDB.java   |  2 +-
 .../fs/s3a/s3guard/MetadataStoreTestBase.java      | 21 ++++---
 .../scale/AbstractITestS3AMetadataStoreScale.java  |  8 +--
 .../fs/s3a/scale/ITestLocalMetadataStoreScale.java |  3 +-
 19 files changed, 159 insertions(+), 151 deletions(-)

diff --git 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java
 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java
index a0eaff7..3c4f5bf 100644
--- 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java
+++ 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java
@@ -396,7 +396,7 @@ public class S3AFileSystem extends FileSystem implements 
StreamCapabilities,
           DEFAULT_METADATASTORE_METADATA_TTL, TimeUnit.MILLISECONDS);
       ttlTimeProvider = new S3Guard.TtlTimeProvider(authDirTtl);
 
-      setMetadataStore(S3Guard.getMetadataStore(this));
+      setMetadataStore(S3Guard.getMetadataStore(this, ttlTimeProvider));
       allowAuthoritativeMetadataStore = 
conf.getBoolean(METADATASTORE_AUTHORITATIVE,
           DEFAULT_METADATASTORE_AUTHORITATIVE);
       allowAuthoritativePaths = S3Guard.getAuthoritativePaths(this);
@@ -1767,7 +1767,7 @@ public class S3AFileSystem extends FileSystem implements 
StreamCapabilities,
       instrumentation.directoryDeleted();
     }
     deleteObject(key);
-    metadataStore.delete(f, ttlTimeProvider);
+    metadataStore.delete(f);
   }
 
   /**
@@ -2293,7 +2293,7 @@ public class S3AFileSystem extends FileSystem implements 
StreamCapabilities,
       }
       try(DurationInfo ignored =
               new DurationInfo(LOG, false, "Delete metastore")) {
-        metadataStore.deleteSubtree(f, ttlTimeProvider);
+        metadataStore.deleteSubtree(f);
       }
     } else {
       LOG.debug("delete: Path is a file: {}", key);
@@ -4066,6 +4066,7 @@ public class S3AFileSystem extends FileSystem implements 
StreamCapabilities,
   @VisibleForTesting
   protected void setTtlTimeProvider(ITtlTimeProvider ttlTimeProvider) {
     this.ttlTimeProvider = ttlTimeProvider;
+    metadataStore.setTtlTimeProvider(ttlTimeProvider);
   }
 
   /**
diff --git 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/MultiObjectDeleteSupport.java
 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/MultiObjectDeleteSupport.java
index fce1780..9943715 100644
--- 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/MultiObjectDeleteSupport.java
+++ 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/MultiObjectDeleteSupport.java
@@ -178,7 +178,7 @@ public final class MultiObjectDeleteSupport extends 
AbstractStoreOperation {
     //  metastore entries
     deleted.forEach(path -> {
       try {
-        metadataStore.delete(path, getStoreContext().getTimeProvider());
+        metadataStore.delete(path);
       } catch (IOException e) {
         // trouble: we failed to delete the far end entry
         // try with the next one.
diff --git 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/DelayedUpdateRenameTracker.java
 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/DelayedUpdateRenameTracker.java
index 916714b..22c4434 100644
--- 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/DelayedUpdateRenameTracker.java
+++ 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/DelayedUpdateRenameTracker.java
@@ -135,9 +135,7 @@ public class DelayedUpdateRenameTracker extends 
RenameTracker {
 
   @Override
   public void completeRename() throws IOException {
-    metadataStore.move(sourcePaths, destMetas,
-        getStoreContext().getTimeProvider(),
-        getOperationState());
+    metadataStore.move(sourcePaths, destMetas, getOperationState());
     super.completeRename();
   }
 
@@ -147,12 +145,10 @@ public class DelayedUpdateRenameTracker extends 
RenameTracker {
     try (DurationInfo ignored = new DurationInfo(LOG,
         "Cleaning up deleted paths")) {
       // the destination paths are updated; the source is left alone.
-      metadataStore.move(new ArrayList<>(0), destMetas,
-          getStoreContext().getTimeProvider(),
-          getOperationState());
+      metadataStore.move(new ArrayList<>(0), destMetas, getOperationState());
       for (Path deletedPath : deletedPaths) {
         // this is not ideal in that it may leave parent stuff around.
-        metadataStore.delete(deletedPath, getStoreContext().getTimeProvider());
+        metadataStore.delete(deletedPath);
       }
       deleteParentPaths();
     } catch (IOException | SdkBaseException e) {
@@ -185,7 +181,7 @@ public class DelayedUpdateRenameTracker extends 
RenameTracker {
       PathMetadata md = metadataStore.get(parent, true);
       if (md != null && md.isEmptyDirectory() == Tristate.TRUE) {
         // if were confident that this is empty: delete it.
-        metadataStore.delete(parent, getStoreContext().getTimeProvider());
+        metadataStore.delete(parent);
       }
     }
   }
diff --git 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/DynamoDBMetadataStore.java
 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/DynamoDBMetadataStore.java
index be5de96..c74fb30 100644
--- 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/DynamoDBMetadataStore.java
+++ 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/DynamoDBMetadataStore.java
@@ -200,8 +200,8 @@ import static org.apache.hadoop.fs.s3a.s3guard.S3Guard.*;
  * sub-tree.
  *
  * Some mutating operations, notably
- * {@link MetadataStore#deleteSubtree(Path, ITtlTimeProvider)} and
- * {@link MetadataStore#move(Collection, Collection, ITtlTimeProvider, 
BulkOperationState)}
+ * {@link MetadataStore#deleteSubtree(Path)} and
+ * {@link MetadataStore#move(Collection, Collection, BulkOperationState)}
  * are less efficient with this schema.
  * They require mutating multiple items in the DynamoDB table.
  *
@@ -356,7 +356,7 @@ public class DynamoDBMetadataStore implements MetadataStore,
    * Time source. This is used during writes when parent
    * entries need to be created.
    */
-  private ITtlTimeProvider timeProvider;
+  private ITtlTimeProvider ttlTimeProvider;
 
   /**
    * A utility function to create DynamoDB instance.
@@ -391,11 +391,13 @@ public class DynamoDBMetadataStore implements 
MetadataStore,
    * FS via {@link S3AFileSystem#shareCredentials(String)}; this will
    * increment the reference counter of these credentials.
    * @param fs {@code S3AFileSystem} associated with the MetadataStore
+   * @param ttlTp the time provider to use for metadata expiry
    * @throws IOException on a failure
    */
   @Override
   @Retries.OnceRaw
-  public void initialize(FileSystem fs) throws IOException {
+  public void initialize(FileSystem fs, ITtlTimeProvider ttlTp)
+      throws IOException {
     Preconditions.checkNotNull(fs, "Null filesystem");
     Preconditions.checkArgument(fs instanceof S3AFileSystem,
         "DynamoDBMetadataStore only supports S3A filesystem.");
@@ -433,7 +435,7 @@ public class DynamoDBMetadataStore implements MetadataStore,
         this::retryEvent
     );
 
-    timeProvider = new S3Guard.TtlTimeProvider(conf);
+    this.ttlTimeProvider = ttlTp;
     initTable();
 
     instrumentation.initialized();
@@ -453,7 +455,7 @@ public class DynamoDBMetadataStore implements MetadataStore,
     instrumentation = context.getInstrumentation().getS3GuardInstrumentation();
     username = context.getUsername();
     executor = context.createThrottledExecutor();
-    timeProvider = Preconditions.checkNotNull(
+    ttlTimeProvider = Preconditions.checkNotNull(
         context.getTimeProvider(),
         "ttlTimeProvider must not be null");
   }
@@ -468,7 +470,8 @@ public class DynamoDBMetadataStore implements MetadataStore,
    *
    * This is used to operate the metadata store directly beyond the scope of 
the
    * S3AFileSystem integration, e.g. command line tools.
-   * Generally, callers should use {@link #initialize(FileSystem)}
+   * Generally, callers should use
+   * {@link MetadataStore#initialize(FileSystem, ITtlTimeProvider)}
    * with an initialized {@code S3AFileSystem} instance.
    *
    * Without a filesystem to act as a reference point, the configuration itself
@@ -479,13 +482,14 @@ public class DynamoDBMetadataStore implements 
MetadataStore,
    * using the base fs.s3a.* options, as there is no bucket to infer per-bucket
    * settings from.
    *
-   * @see #initialize(FileSystem)
+   * @see MetadataStore#initialize(FileSystem, ITtlTimeProvider)
    * @throws IOException if there is an error
    * @throws IllegalArgumentException if the configuration is incomplete
    */
   @Override
   @Retries.OnceRaw
-  public void initialize(Configuration config) throws IOException {
+  public void initialize(Configuration config,
+      ITtlTimeProvider ttlTp) throws IOException {
     conf = config;
     // use the bucket as the DynamoDB table name if not specified in config
     tableName = conf.getTrimmed(S3GUARD_DDB_TABLE_NAME_KEY);
@@ -512,7 +516,7 @@ public class DynamoDBMetadataStore implements MetadataStore,
         TimeUnit.SECONDS,
         "s3a-ddb-" + tableName);
     initDataAccessRetries(conf);
-    timeProvider = new S3Guard.TtlTimeProvider(conf);
+    this.ttlTimeProvider = ttlTp;
     initTable();
   }
 
@@ -540,16 +544,16 @@ public class DynamoDBMetadataStore implements 
MetadataStore,
 
   @Override
   @Retries.RetryTranslated
-  public void delete(Path path, ITtlTimeProvider ttlTimeProvider)
+  public void delete(Path path)
       throws IOException {
-    innerDelete(path, true, ttlTimeProvider, null);
+    innerDelete(path, true, null);
   }
 
   @Override
   @Retries.RetryTranslated
   public void forgetMetadata(Path path) throws IOException {
     LOG.debug("Forget metadata for {}", path);
-    innerDelete(path, false, null, null);
+    innerDelete(path, false, null);
   }
 
   /**
@@ -558,15 +562,12 @@ public class DynamoDBMetadataStore implements 
MetadataStore,
    * There is no check as to whether the entry exists in the table first.
    * @param path path to delete
    * @param tombstone flag to create a tombstone marker
-   * @param ttlTimeProvider The time provider to set last_updated. Must not
-   *                        be null if tombstone is true.
    * @param ancestorState ancestor state for logging
    * @throws IOException I/O error.
    */
   @Retries.RetryTranslated
   private void innerDelete(final Path path,
       final boolean tombstone,
-      final ITtlTimeProvider ttlTimeProvider,
       final AncestorState ancestorState)
       throws IOException {
     checkPath(path);
@@ -615,7 +616,7 @@ public class DynamoDBMetadataStore implements MetadataStore,
 
   @Override
   @Retries.RetryTranslated
-  public void deleteSubtree(Path path, ITtlTimeProvider ttlTimeProvider)
+  public void deleteSubtree(Path path)
       throws IOException {
     checkPath(path);
     LOG.debug("Deleting subtree from table {} in region {}: {}",
@@ -639,7 +640,7 @@ public class DynamoDBMetadataStore implements MetadataStore,
           desc.hasNext();) {
         final Path pathToDelete = desc.next().getPath();
         futures.add(submit(executor, () -> {
-          innerDelete(pathToDelete, true, ttlTimeProvider, state);
+          innerDelete(pathToDelete, true, state);
           return null;
         }));
         if (futures.size() > S3GUARD_DDB_SUBMITTED_TASK_LIMIT) {
@@ -823,13 +824,11 @@ public class DynamoDBMetadataStore implements 
MetadataStore,
    * Callers are required to synchronize on ancestorState.
    * @param pathsToCreate paths to create
    * @param ancestorState ongoing ancestor state.
-   * @param ttlTimeProvider Must not be null
    * @return the full ancestry paths
    */
   private Collection<DDBPathMetadata> completeAncestry(
       final Collection<DDBPathMetadata> pathsToCreate,
-      final AncestorState ancestorState,
-      final ITtlTimeProvider ttlTimeProvider) throws PathIOException {
+      final AncestorState ancestorState) throws PathIOException {
     // Key on path to allow fast lookup
     Map<Path, DDBPathMetadata> ancestry = new HashMap<>();
     LOG.debug("Completing ancestry for {} paths", pathsToCreate.size());
@@ -913,9 +912,7 @@ public class DynamoDBMetadataStore implements MetadataStore,
   @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
   @Override
   @Retries.RetryTranslated
-  public void addAncestors(
-      final Path qualifiedPath,
-      final ITtlTimeProvider ttlTimeProvider,
+  public void addAncestors(final Path qualifiedPath,
       @Nullable final BulkOperationState operationState) throws IOException {
 
     Collection<DDBPathMetadata> newDirs = new ArrayList<>();
@@ -1000,10 +997,8 @@ public class DynamoDBMetadataStore implements 
MetadataStore,
    */
   @Override
   @Retries.RetryTranslated
-  public void move(
-      @Nullable Collection<Path> pathsToDelete,
+  public void move(@Nullable Collection<Path> pathsToDelete,
       @Nullable Collection<PathMetadata> pathsToCreate,
-      final ITtlTimeProvider ttlTimeProvider,
       @Nullable final BulkOperationState operationState) throws IOException {
     if (pathsToDelete == null && pathsToCreate == null) {
       return;
@@ -1032,8 +1027,7 @@ public class DynamoDBMetadataStore implements 
MetadataStore,
         newItems.addAll(
             completeAncestry(
                 pathMetaToDDBPathMeta(pathsToCreate),
-                ancestorState,
-                extractTimeProvider(ttlTimeProvider)));
+                ancestorState));
       }
     }
     // sort all the new items topmost first.
@@ -1222,7 +1216,7 @@ public class DynamoDBMetadataStore implements 
MetadataStore,
   public void put(
       final Collection<? extends PathMetadata> metas,
       @Nullable final BulkOperationState operationState) throws IOException {
-    innerPut(pathMetaToDDBPathMeta(metas), operationState, timeProvider);
+    innerPut(pathMetaToDDBPathMeta(metas), operationState, ttlTimeProvider);
   }
 
   /**
@@ -1236,7 +1230,7 @@ public class DynamoDBMetadataStore implements 
MetadataStore,
    * create entries in the table without parents.
    * @param metas metadata entries to write.
    * @param operationState (nullable) operational state for a bulk update
-   * @param ttlTimeProvider
+   * @param ttlTp The time provider for metadata expiry
    * @throws IOException failure.
    */
   @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
@@ -1244,7 +1238,7 @@ public class DynamoDBMetadataStore implements 
MetadataStore,
   private void innerPut(
       final Collection<DDBPathMetadata> metas,
       @Nullable final BulkOperationState operationState,
-      final ITtlTimeProvider ttlTimeProvider) throws IOException {
+      final ITtlTimeProvider ttlTp) throws IOException {
     if (metas.isEmpty()) {
       // Happens when someone calls put() with an empty list.
       LOG.debug("Ignoring empty list of entries to put");
@@ -1258,7 +1252,7 @@ public class DynamoDBMetadataStore implements 
MetadataStore,
     Item[] items;
     synchronized (ancestorState) {
       items = pathMetadataToItem(
-          completeAncestry(metas, ancestorState, ttlTimeProvider));
+          completeAncestry(metas, ancestorState));
     }
     LOG.debug("Saving batch of {} items to table {}, region {}", items.length,
         tableName, region);
@@ -1644,7 +1638,7 @@ public class DynamoDBMetadataStore implements 
MetadataStore,
     try {
       LOG.debug("innerPut on metas: {}", metas);
       if (!metas.isEmpty()) {
-        innerPut(metas, state, timeProvider);
+        innerPut(metas, state, ttlTimeProvider);
       }
     } catch (IOException e) {
       String msg = String.format("IOException while setting false "
@@ -2320,15 +2314,20 @@ public class DynamoDBMetadataStore implements 
MetadataStore,
     return new AncestorState(this, operation, dest);
   }
 
+  @Override
+  public void setTtlTimeProvider(ITtlTimeProvider ttlTimeProvider) {
+    this.ttlTimeProvider = ttlTimeProvider;
+  }
+
   /**
    * Extract a time provider from the argument or fall back to the
    * one in the constructor.
-   * @param ttlTimeProvider nullable time source passed in as an argument.
+   * @param ttlTp nullable time source passed in as an argument.
    * @return a non-null time source.
    */
   private ITtlTimeProvider extractTimeProvider(
-      @Nullable ITtlTimeProvider ttlTimeProvider) {
-    return ttlTimeProvider != null ? ttlTimeProvider : timeProvider;
+      @Nullable ITtlTimeProvider ttlTp) {
+    return ttlTp != null ? ttlTp : this.ttlTimeProvider;
   }
 
   /**
diff --git 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/LocalMetadataStore.java
 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/LocalMetadataStore.java
index 4327002..7d05eed 100644
--- 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/LocalMetadataStore.java
+++ 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/LocalMetadataStore.java
@@ -79,8 +79,11 @@ public class LocalMetadataStore implements MetadataStore {
 
   private String username;
 
+  private ITtlTimeProvider ttlTimeProvider;
+
   @Override
-  public void initialize(FileSystem fileSystem) throws IOException {
+  public void initialize(FileSystem fileSystem,
+      ITtlTimeProvider ttlTp) throws IOException {
     Preconditions.checkNotNull(fileSystem);
     fs = fileSystem;
     URI fsURI = fs.getUri();
@@ -89,11 +92,12 @@ public class LocalMetadataStore implements MetadataStore {
       uriHost = null;
     }
 
-    initialize(fs.getConf());
+    initialize(fs.getConf(), ttlTp);
   }
 
   @Override
-  public void initialize(Configuration conf) throws IOException {
+  public void initialize(Configuration conf, ITtlTimeProvider ttlTp)
+      throws IOException {
     Preconditions.checkNotNull(conf);
     int maxRecords = conf.getInt(S3GUARD_METASTORE_LOCAL_MAX_RECORDS,
         DEFAULT_S3GUARD_METASTORE_LOCAL_MAX_RECORDS);
@@ -110,6 +114,7 @@ public class LocalMetadataStore implements MetadataStore {
 
     localCache = builder.build();
     username = UserGroupInformation.getCurrentUser().getShortUserName();
+    this.ttlTimeProvider = ttlTp;
   }
 
   @Override
@@ -122,7 +127,7 @@ public class LocalMetadataStore implements MetadataStore {
   }
 
   @Override
-  public void delete(Path p, ITtlTimeProvider ttlTimeProvider)
+  public void delete(Path p)
       throws IOException {
     doDelete(p, false, true, ttlTimeProvider);
   }
@@ -133,23 +138,23 @@ public class LocalMetadataStore implements MetadataStore {
   }
 
   @Override
-  public void deleteSubtree(Path path, ITtlTimeProvider ttlTimeProvider)
+  public void deleteSubtree(Path path)
       throws IOException {
     doDelete(path, true, true, ttlTimeProvider);
   }
 
   private synchronized void doDelete(Path p, boolean recursive,
-      boolean tombstone, ITtlTimeProvider ttlTimeProvider) {
+      boolean tombstone, ITtlTimeProvider ttlTp) {
 
     Path path = standardize(p);
 
     // Delete entry from file cache, then from cached parent directory, if any
 
-    deleteCacheEntries(path, tombstone, ttlTimeProvider);
+    deleteCacheEntries(path, tombstone, ttlTp);
 
     if (recursive) {
       // Remove all entries that have this dir as path prefix.
-      deleteEntryByAncestor(path, localCache, tombstone, ttlTimeProvider);
+      deleteEntryByAncestor(path, localCache, tombstone, ttlTp);
     }
   }
 
@@ -202,10 +207,8 @@ public class LocalMetadataStore implements MetadataStore {
   }
 
   @Override
-  public void move(
-      @Nullable Collection<Path> pathsToDelete,
+  public void move(@Nullable Collection<Path> pathsToDelete,
       @Nullable Collection<PathMetadata> pathsToCreate,
-        ITtlTimeProvider ttlTimeProvider,
       @Nullable final BulkOperationState operationState) throws IOException {
     LOG.info("Move {} to {}", pathsToDelete, pathsToCreate);
 
@@ -222,7 +225,7 @@ public class LocalMetadataStore implements MetadataStore {
       // 1. Delete pathsToDelete
       for (Path meta : pathsToDelete) {
         LOG.debug("move: deleting metadata {}", meta);
-        delete(meta, ttlTimeProvider);
+        delete(meta);
       }
 
       // 2. Create new destination path metadata
@@ -487,7 +490,7 @@ public class LocalMetadataStore implements MetadataStore {
    * lock held.
    */
   private void deleteCacheEntries(Path path, boolean tombstone,
-      ITtlTimeProvider ttlTimeProvider) {
+      ITtlTimeProvider ttlTp) {
     LocalMetadataEntry entry = localCache.getIfPresent(path);
     // If there's no entry, delete should silently succeed
     // (based on MetadataStoreTestBase#testDeleteNonExisting)
@@ -501,7 +504,7 @@ public class LocalMetadataStore implements MetadataStore {
     if(entry.hasPathMeta()){
       if (tombstone) {
         PathMetadata pmd = PathMetadata.tombstone(path);
-        pmd.setLastUpdated(ttlTimeProvider.getNow());
+        pmd.setLastUpdated(ttlTp.getNow());
         entry.setPathMetadata(pmd);
       } else {
         entry.setPathMetadata(null);
@@ -528,7 +531,7 @@ public class LocalMetadataStore implements MetadataStore {
         LOG.debug("removing parent's entry for {} ", path);
         if (tombstone) {
           dir.markDeleted(path);
-          dir.setLastUpdated(ttlTimeProvider.getNow());
+          dir.setLastUpdated(ttlTp.getNow());
         } else {
           dir.remove(path);
         }
@@ -595,8 +598,12 @@ public class LocalMetadataStore implements MetadataStore {
   }
 
   @Override
+  public void setTtlTimeProvider(ITtlTimeProvider ttlTimeProvider) {
+    this.ttlTimeProvider = ttlTimeProvider;
+  }
+
+  @Override
   public void addAncestors(final Path qualifiedPath,
-      ITtlTimeProvider ttlTimeProvider,
       @Nullable final BulkOperationState operationState) throws IOException {
 
     Collection<PathMetadata> newDirs = new ArrayList<>();
diff --git 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/MetadataStore.java
 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/MetadataStore.java
index 3767edc..69427ef 100644
--- 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/MetadataStore.java
+++ 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/MetadataStore.java
@@ -50,17 +50,21 @@ public interface MetadataStore extends Closeable {
    * Performs one-time initialization of the metadata store.
    *
    * @param fs {@code FileSystem} associated with the MetadataStore
+   * @param ttlTimeProvider the time provider to use for metadata expiry
    * @throws IOException if there is an error
    */
-  void initialize(FileSystem fs) throws IOException;
+  void initialize(FileSystem fs, ITtlTimeProvider ttlTimeProvider)
+      throws IOException;
 
   /**
    * Performs one-time initialization of the metadata store via configuration.
-   * @see #initialize(FileSystem)
+   * @see #initialize(FileSystem, ITtlTimeProvider)
    * @param conf Configuration.
+   * @param ttlTimeProvider the time provider to use for metadata expiry
    * @throws IOException if there is an error
    */
-  void initialize(Configuration conf) throws IOException;
+  void initialize(Configuration conf,
+      ITtlTimeProvider ttlTimeProvider) throws IOException;
 
   /**
    * Deletes exactly one path, leaving a tombstone to prevent lingering,
@@ -71,16 +75,14 @@ public interface MetadataStore extends Closeable {
    * the lastUpdated field of the record has to be updated to <pre>now</pre>.
    *
    * @param path the path to delete
-   * @param ttlTimeProvider the time provider to set last_updated. Must not
-   *                        be null.
    * @throws IOException if there is an error
    */
-  void delete(Path path, ITtlTimeProvider ttlTimeProvider)
+  void delete(Path path)
       throws IOException;
 
   /**
    * Removes the record of exactly one path.  Does not leave a tombstone (see
-   * {@link MetadataStore#delete(Path, ITtlTimeProvider)}. It is currently
+   * {@link MetadataStore#delete(Path)}. It is currently
    * intended for testing only, and a need to use it as part of normal
    * FileSystem usage is not anticipated.
    *
@@ -103,11 +105,9 @@ public interface MetadataStore extends Closeable {
    * the lastUpdated field of all records have to be updated to <pre>now</pre>.
    *
    * @param path the root of the sub-tree to delete
-   * @param ttlTimeProvider the time provider to set last_updated. Must not
-   *                        be null.
    * @throws IOException if there is an error
    */
-  void deleteSubtree(Path path, ITtlTimeProvider ttlTimeProvider)
+  void deleteSubtree(Path path)
       throws IOException;
 
   /**
@@ -152,14 +152,11 @@ public interface MetadataStore extends Closeable {
    * must have their last updated timestamps set through
    * {@link S3Guard#patchLastUpdated(Collection, ITtlTimeProvider)}.
    * @param qualifiedPath path to update
-   * @param timeProvider time provider for timestamps
    * @param operationState (nullable) operational state for a bulk update
    * @throws IOException failure
    */
   @RetryTranslated
-  void addAncestors(
-      Path qualifiedPath,
-      @Nullable ITtlTimeProvider timeProvider,
+  void addAncestors(Path qualifiedPath,
       @Nullable BulkOperationState operationState) throws IOException;
 
   /**
@@ -184,16 +181,12 @@ public interface MetadataStore extends Closeable {
    *                      source directory tree of the move.
    * @param pathsToCreate Collection of all PathMetadata for the new paths
    *                      that were created at the destination of the rename().
-   * @param ttlTimeProvider the time provider to set last_updated. Must not
-   *                        be null.
    * @param operationState     Any ongoing state supplied to the rename tracker
    *                      which is to be passed in with each move operation.
    * @throws IOException if there is an error
    */
-  void move(
-      @Nullable Collection<Path> pathsToDelete,
+  void move(@Nullable Collection<Path> pathsToDelete,
       @Nullable Collection<PathMetadata> pathsToCreate,
-      ITtlTimeProvider ttlTimeProvider,
       @Nullable BulkOperationState operationState) throws IOException;
 
   /**
@@ -378,4 +371,13 @@ public interface MetadataStore extends Closeable {
     return null;
   }
 
+  /**
+   * The TtlTimeProvider has to be set during the initialization for the
+   * metadatastore, but this method can be used for testing, and change the
+   * instance during runtime.
+   *
+   * @param ttlTimeProvider
+   */
+  void setTtlTimeProvider(ITtlTimeProvider ttlTimeProvider);
+
 }
diff --git 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/NullMetadataStore.java
 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/NullMetadataStore.java
index f0792ab..8cc6370 100644
--- 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/NullMetadataStore.java
+++ 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/NullMetadataStore.java
@@ -40,11 +40,13 @@ import java.util.Map;
 public class NullMetadataStore implements MetadataStore {
 
   @Override
-  public void initialize(FileSystem fs) throws IOException {
+  public void initialize(FileSystem fs, ITtlTimeProvider ttlTimeProvider)
+      throws IOException {
   }
 
   @Override
-  public void initialize(Configuration conf) throws IOException {
+  public void initialize(Configuration conf, ITtlTimeProvider ttlTimeProvider)
+      throws IOException {
   }
 
   @Override
@@ -52,7 +54,7 @@ public class NullMetadataStore implements MetadataStore {
   }
 
   @Override
-  public void delete(Path path, ITtlTimeProvider ttlTimeProvider)
+  public void delete(Path path)
       throws IOException {
   }
 
@@ -61,7 +63,7 @@ public class NullMetadataStore implements MetadataStore {
   }
 
   @Override
-  public void deleteSubtree(Path path, ITtlTimeProvider ttlTimeProvider)
+  public void deleteSubtree(Path path)
       throws IOException {
   }
 
@@ -84,7 +86,6 @@ public class NullMetadataStore implements MetadataStore {
   @Override
   public void move(Collection<Path> pathsToDelete,
       Collection<PathMetadata> pathsToCreate,
-      ITtlTimeProvider ttlTimeProvider,
       final BulkOperationState operationState) throws IOException {
   }
 
@@ -147,8 +148,11 @@ public class NullMetadataStore implements MetadataStore {
   }
 
   @Override
+  public void setTtlTimeProvider(ITtlTimeProvider ttlTimeProvider) {
+  }
+
+  @Override
   public void addAncestors(final Path qualifiedPath,
-      final ITtlTimeProvider timeProvider,
       @Nullable final BulkOperationState operationState) throws IOException {
   }
 
diff --git 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/ProgressiveRenameTracker.java
 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/ProgressiveRenameTracker.java
index 87cba20..6254f4d 100644
--- 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/ProgressiveRenameTracker.java
+++ 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/ProgressiveRenameTracker.java
@@ -155,9 +155,7 @@ public class ProgressiveRenameTracker extends RenameTracker 
{
     // no entries are deleted at this point.
     try (DurationInfo ignored = new DurationInfo(LOG, false,
         "Adding new metastore entries")) {
-      store.move(null, entriesToAdd,
-          getStoreContext().getTimeProvider(),
-          getOperationState());
+      store.move(null, entriesToAdd, getOperationState());
     }
   }
 
@@ -199,9 +197,7 @@ public class ProgressiveRenameTracker extends RenameTracker 
{
     // ...so update the store.
     try (DurationInfo ignored = new DurationInfo(LOG, false,
         "adding %s metastore entries", entriesToAdd.size())) {
-      store.move(null, entriesToAdd,
-          getStoreContext().getTimeProvider(),
-          getOperationState());
+      store.move(null, entriesToAdd, getOperationState());
     }
   }
 
@@ -218,9 +214,7 @@ public class ProgressiveRenameTracker extends RenameTracker 
{
           getSourceRoot(),
           getDest(),
           getOwner());
-      getMetadataStore().move(toDelete, toAdd,
-          getStoreContext().getTimeProvider(),
-          getOperationState());
+      getMetadataStore().move(toDelete, toAdd, getOperationState());
     }
   }
 
@@ -236,9 +230,7 @@ public class ProgressiveRenameTracker extends RenameTracker 
{
     // delete the paths from the metastore
     try (DurationInfo ignored = new DurationInfo(LOG, false,
         "delete %s metastore entries", paths.size())) {
-      getMetadataStore().move(paths, null,
-          getStoreContext().getTimeProvider(),
-          getOperationState());
+      getMetadataStore().move(paths, null, getOperationState());
     }
   }
 
diff --git 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3Guard.java
 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3Guard.java
index 85e4d12..8e5c4d2 100644
--- 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3Guard.java
+++ 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3Guard.java
@@ -83,17 +83,19 @@ public final class S3Guard {
   /**
    * Create a new instance of the configured MetadataStore.
    * The returned MetadataStore will have been initialized via
-   * {@link MetadataStore#initialize(FileSystem)} by this function before
-   * returning it.  Callers must clean up by calling
+   * {@link MetadataStore#initialize(FileSystem, ITtlTimeProvider)}
+   * by this function before returning it.  Callers must clean up by calling
    * {@link MetadataStore#close()} when done using the MetadataStore.
    *
    * @param fs  FileSystem whose Configuration specifies which
    *            implementation to use.
+   * @param ttlTimeProvider
    * @return Reference to new MetadataStore.
    * @throws IOException if the metadata store cannot be instantiated
    */
   @Retries.OnceTranslated
-  public static MetadataStore getMetadataStore(FileSystem fs)
+  public static MetadataStore getMetadataStore(FileSystem fs,
+      ITtlTimeProvider ttlTimeProvider)
       throws IOException {
     Preconditions.checkNotNull(fs);
     Configuration conf = fs.getConf();
@@ -104,7 +106,7 @@ public final class S3Guard {
       msInstance = ReflectionUtils.newInstance(msClass, conf);
       LOG.debug("Using {} metadata store for {} filesystem",
           msClass.getSimpleName(), fs.getScheme());
-      msInstance.initialize(fs);
+      msInstance.initialize(fs, ttlTimeProvider);
       return msInstance;
     } catch (FileNotFoundException e) {
       // Don't log this exception as it means the table doesn't exist yet;
@@ -521,7 +523,7 @@ public final class S3Guard {
   /**
    * This adds all new ancestors of a path as directories.
    * This forwards to
-   * {@link MetadataStore#addAncestors(Path, ITtlTimeProvider, 
BulkOperationState)}.
+   * {@link MetadataStore#addAncestors(Path, BulkOperationState)}.
    * <p>
    * Originally it implemented the logic to probe for an add ancestors,
    * but with the addition of a store-specific bulk operation state
@@ -538,7 +540,7 @@ public final class S3Guard {
       final Path qualifiedPath,
       final ITtlTimeProvider timeProvider,
       @Nullable final BulkOperationState operationState) throws IOException {
-    metadataStore.addAncestors(qualifiedPath, timeProvider, operationState);
+    metadataStore.addAncestors(qualifiedPath, operationState);
   }
 
   /**
diff --git 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3GuardTool.java
 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3GuardTool.java
index 08beae2..492c566 100644
--- 
a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3GuardTool.java
+++ 
b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/s3guard/S3GuardTool.java
@@ -314,9 +314,9 @@ public abstract class S3GuardTool extends Configured 
implements Tool {
     }
 
     if (filesystem == null) {
-      getStore().initialize(conf);
+      getStore().initialize(conf, new S3Guard.TtlTimeProvider(conf));
     } else {
-      getStore().initialize(filesystem);
+      getStore().initialize(filesystem, new S3Guard.TtlTimeProvider(conf));
     }
     LOG.info("Metadata store {} is initialized.", getStore());
     return getStore();
diff --git 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AMetadataPersistenceException.java
 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AMetadataPersistenceException.java
index 3662194..6ef1492 100644
--- 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AMetadataPersistenceException.java
+++ 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AMetadataPersistenceException.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
 
+import org.apache.hadoop.fs.s3a.s3guard.S3Guard;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -88,7 +89,8 @@ public class ITestS3AMetadataPersistenceException extends 
AbstractS3ATestBase {
     ioException = new IOException();
     IOExceptionMetadataStore metadataStore =
         new IOExceptionMetadataStore(ioException);
-    metadataStore.initialize(getConfiguration());
+    metadataStore.initialize(getConfiguration(),
+        new S3Guard.TtlTimeProvider(getConfiguration()));
     fs.setMetadataStore(metadataStore);
   }
 
diff --git 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/TestPartialDeleteFailures.java
 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/TestPartialDeleteFailures.java
index c44fa00..efd3ca4 100644
--- 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/TestPartialDeleteFailures.java
+++ 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/impl/TestPartialDeleteFailures.java
@@ -261,11 +261,13 @@ public class TestPartialDeleteFailures {
     private final List<Path> created = new ArrayList<>();
 
     @Override
-    public void initialize(final FileSystem fs) {
+    public void initialize(final FileSystem fs,
+        ITtlTimeProvider ttlTimeProvider) {
     }
 
     @Override
-    public void initialize(final Configuration conf) {
+    public void initialize(final Configuration conf,
+        ITtlTimeProvider ttlTimeProvider) {
     }
 
     @Override
@@ -316,21 +318,18 @@ public class TestPartialDeleteFailures {
     }
 
     @Override
-    public void delete(final Path path,
-        final ITtlTimeProvider ttlTimeProvider) {
+    public void delete(final Path path) {
       deleted.add(path);
     }
 
     @Override
-    public void deleteSubtree(final Path path,
-        final ITtlTimeProvider ttlTimeProvider) {
+    public void deleteSubtree(final Path path) {
 
     }
 
     @Override
     public void move(@Nullable final Collection<Path> pathsToDelete,
         @Nullable final Collection<PathMetadata> pathsToCreate,
-        final ITtlTimeProvider ttlTimeProvider,
         @Nullable final BulkOperationState operationState) {
     }
 
@@ -353,6 +352,10 @@ public class TestPartialDeleteFailures {
     }
 
     @Override
+    public void setTtlTimeProvider(ITtlTimeProvider ttlTimeProvider) {
+    }
+
+    @Override
     public Map<String, String> getDiagnostics() {
       return null;
     }
@@ -384,7 +387,6 @@ public class TestPartialDeleteFailures {
 
     @Override
     public void addAncestors(final Path qualifiedPath,
-        final ITtlTimeProvider timeProvider,
         @Nullable final BulkOperationState operationState) {
 
     }
diff --git 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestDynamoDBMetadataStore.java
 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestDynamoDBMetadataStore.java
index 68d39dc..b890ec1 100644
--- 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestDynamoDBMetadataStore.java
+++ 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestDynamoDBMetadataStore.java
@@ -210,7 +210,7 @@ public class ITestDynamoDBMetadataStore extends 
MetadataStoreTestBase {
     enableOnDemand(conf);
 
     ddbmsStatic = new DynamoDBMetadataStore();
-    ddbmsStatic.initialize(conf);
+    ddbmsStatic.initialize(conf, new S3Guard.TtlTimeProvider(conf));
   }
 
   @AfterClass
@@ -416,7 +416,7 @@ public class ITestDynamoDBMetadataStore extends 
MetadataStoreTestBase {
     conf.set(S3GUARD_DDB_TABLE_NAME_KEY, tableName);
     DynamoDBMetadataStore ddbms = new DynamoDBMetadataStore();
     try {
-      ddbms.initialize(s3afs);
+      ddbms.initialize(s3afs, new S3Guard.TtlTimeProvider(conf));
       verifyTableInitialized(tableName, ddbms.getDynamoDB());
       assertNotNull(ddbms.getTable());
       assertEquals(tableName, ddbms.getTable().getTableName());
@@ -445,14 +445,14 @@ public class ITestDynamoDBMetadataStore extends 
MetadataStoreTestBase {
         getFileSystem().getBucketLocation());
     conf.unset(S3GUARD_DDB_REGION_KEY);
     try (DynamoDBMetadataStore ddbms = new DynamoDBMetadataStore()) {
-      ddbms.initialize(conf);
+      ddbms.initialize(conf,  new S3Guard.TtlTimeProvider(conf));
       fail("Should have failed because the table name is not set!");
     } catch (IllegalArgumentException ignored) {
     }
     // config table name
     conf.set(S3GUARD_DDB_TABLE_NAME_KEY, tableName);
     try (DynamoDBMetadataStore ddbms = new DynamoDBMetadataStore()) {
-      ddbms.initialize(conf);
+      ddbms.initialize(conf, new S3Guard.TtlTimeProvider(conf));
       fail("Should have failed because as the region is not set!");
     } catch (IllegalArgumentException ignored) {
     }
@@ -460,7 +460,7 @@ public class ITestDynamoDBMetadataStore extends 
MetadataStoreTestBase {
     conf.set(S3GUARD_DDB_REGION_KEY, savedRegion);
     DynamoDBMetadataStore ddbms = new DynamoDBMetadataStore();
     try {
-      ddbms.initialize(conf);
+      ddbms.initialize(conf, new S3Guard.TtlTimeProvider(conf));
       verifyTableInitialized(tableName, ddbms.getDynamoDB());
       assertNotNull(ddbms.getTable());
       assertEquals(tableName, ddbms.getTable().getTableName());
@@ -590,7 +590,7 @@ public class ITestDynamoDBMetadataStore extends 
MetadataStoreTestBase {
     ThrottleTracker throttleTracker = new ThrottleTracker(ms);
     try(DurationInfo ignored = new DurationInfo(LOG, true,
         "Move")) {
-      ms.move(pathsToDelete, newMetas, getTtlTimeProvider(), state);
+      ms.move(pathsToDelete, newMetas, state);
     }
     LOG.info("Throttle status {}", throttleTracker);
     assertEquals("Number of children in source directory",
@@ -662,7 +662,7 @@ public class ITestDynamoDBMetadataStore extends 
MetadataStoreTestBase {
     tagConfiguration(conf);
     DynamoDBMetadataStore ddbms = new DynamoDBMetadataStore();
     try {
-      ddbms.initialize(conf);
+      ddbms.initialize(conf, new S3Guard.TtlTimeProvider(conf));
       Table table = verifyTableInitialized(tableName, ddbms.getDynamoDB());
       // check the tagging too
       verifyStoreTags(createTagMap(), ddbms);
@@ -718,7 +718,7 @@ public class ITestDynamoDBMetadataStore extends 
MetadataStoreTestBase {
     clearBucketOption(conf, b, S3GUARD_DDB_TABLE_NAME_KEY);
     conf.unset(S3GUARD_DDB_TABLE_CREATE_KEY);
     try (DynamoDBMetadataStore ddbms = new DynamoDBMetadataStore()) {
-      ddbms.initialize(s3afs);
+      ddbms.initialize(s3afs, new S3Guard.TtlTimeProvider(conf));
       // if an exception was not raised, a table was created.
       // So destroy it before failing.
       ddbms.destroy();
@@ -820,8 +820,7 @@ public class ITestDynamoDBMetadataStore extends 
MetadataStoreTestBase {
             1024, false))
     );
 
-    ddbms.move(fullSourcePaths, pathsToCreate, getTtlTimeProvider(),
-        bulkWrite);
+    ddbms.move(fullSourcePaths, pathsToCreate, bulkWrite);
     bulkWrite.close();
     // assert that all the ancestors should have been populated automatically
     List<String> paths = Lists.newArrayList(
@@ -923,7 +922,7 @@ public class ITestDynamoDBMetadataStore extends 
MetadataStoreTestBase {
     enableOnDemand(conf);
     DynamoDBMetadataStore ddbms = new DynamoDBMetadataStore();
     try {
-      ddbms.initialize(s3afs);
+      ddbms.initialize(s3afs, new S3Guard.TtlTimeProvider(conf));
       // we can list the empty table
       ddbms.listChildren(testPath);
       DynamoDB dynamoDB = ddbms.getDynamoDB();
diff --git 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestDynamoDBMetadataStoreScale.java
 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestDynamoDBMetadataStoreScale.java
index a39afa4..2bdf51e 100644
--- 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestDynamoDBMetadataStoreScale.java
+++ 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestDynamoDBMetadataStoreScale.java
@@ -148,7 +148,7 @@ public class ITestDynamoDBMetadataStoreScale
     conf.set(S3GUARD_DDB_BACKGROUND_SLEEP_MSEC_KEY, "5ms");
 
     DynamoDBMetadataStore ms = new DynamoDBMetadataStore();
-    ms.initialize(conf);
+    ms.initialize(conf, new S3Guard.TtlTimeProvider(conf));
     // wire up the owner FS so that we can make assertions about throttle
     // events
     ms.bindToOwnerFilesystem(fs);
@@ -337,7 +337,7 @@ public class ITestDynamoDBMetadataStoreScale
   private void retryingDelete(final Path path) {
     try {
       ddbms.getInvoker().retry("Delete ", path.toString(), true,
-          () -> ddbms.delete(path, new S3Guard.TtlTimeProvider(getConf())));
+          () -> ddbms.delete(path));
     } catch (IOException e) {
       LOG.warn("Failed to delete {}: ", path, e);
     }
@@ -432,7 +432,7 @@ public class ITestDynamoDBMetadataStoreScale
           OPERATIONS_PER_THREAD,
           expectThrottling(),
           () -> {
-            ddbms.delete(path, time);
+            ddbms.delete(path);
           });
     }
   }
diff --git 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestS3GuardConcurrentOps.java
 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestS3GuardConcurrentOps.java
index fa7d1dc..c81b205 100644
--- 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestS3GuardConcurrentOps.java
+++ 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestS3GuardConcurrentOps.java
@@ -97,7 +97,7 @@ public class ITestS3GuardConcurrentOps extends 
AbstractS3ATestBase {
 
     //now init the store; this should increment the ref count.
     DynamoDBMetadataStore ms = new DynamoDBMetadataStore();
-    ms.initialize(fs);
+    ms.initialize(fs, new S3Guard.TtlTimeProvider(conf));
 
     // the ref count should have gone up
     assertEquals("Credential Ref count unchanged after initializing metastore "
@@ -145,7 +145,7 @@ public class ITestS3GuardConcurrentOps extends 
AbstractS3ATestBase {
 
               Exception result = null;
               try (DynamoDBMetadataStore store = new DynamoDBMetadataStore()) {
-                store.initialize(conf);
+                store.initialize(conf, new S3Guard.TtlTimeProvider(conf));
               } catch (Exception e) {
                 LOG.error(e.getClass() + ": " + e.getMessage());
                 result = e;
diff --git 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestS3GuardToolDynamoDB.java
 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestS3GuardToolDynamoDB.java
index d64da9d..9e0a08b 100644
--- 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestS3GuardToolDynamoDB.java
+++ 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/ITestS3GuardToolDynamoDB.java
@@ -151,7 +151,7 @@ public class ITestS3GuardToolDynamoDB extends 
AbstractS3GuardToolTestBase {
 
     // Check. Should create new metadatastore with the table name set.
     try (DynamoDBMetadataStore ddbms = new DynamoDBMetadataStore()) {
-      ddbms.initialize(conf);
+      ddbms.initialize(conf, new S3Guard.TtlTimeProvider(conf));
       ListTagsOfResourceRequest listTagsOfResourceRequest = new 
ListTagsOfResourceRequest()
           .withResourceArn(ddbms.getTable().getDescription().getTableArn());
       List<Tag> tags = 
ddbms.getAmazonDynamoDB().listTagsOfResource(listTagsOfResourceRequest).getTags();
diff --git 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/MetadataStoreTestBase.java
 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/MetadataStoreTestBase.java
index 303cf36..ee7efe2 100644
--- 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/MetadataStoreTestBase.java
+++ 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/s3guard/MetadataStoreTestBase.java
@@ -126,7 +126,8 @@ public abstract class MetadataStoreTestBase extends 
HadoopTestBase {
     ms = contract.getMetadataStore();
     assertNotNull("null MetadataStore", ms);
     assertNotNull("null FileSystem", contract.getFileSystem());
-    ms.initialize(contract.getFileSystem());
+    ms.initialize(contract.getFileSystem(),
+        new S3Guard.TtlTimeProvider(contract.getFileSystem().getConf()));
     ttlTimeProvider =
         new S3Guard.TtlTimeProvider(contract.getFileSystem().getConf());
   }
@@ -333,7 +334,7 @@ public abstract class MetadataStoreTestBase extends 
HadoopTestBase {
   public void testDelete() throws Exception {
     setUpDeleteTest();
 
-    ms.delete(strToPath("/ADirectory1/db1/file2"), ttlTimeProvider);
+    ms.delete(strToPath("/ADirectory1/db1/file2"));
 
     /* Ensure delete happened. */
     assertDirectorySize("/ADirectory1/db1", 1);
@@ -362,7 +363,7 @@ public abstract class MetadataStoreTestBase extends 
HadoopTestBase {
     if (!allowMissing()) {
       assertCached(p + "/ADirectory1/db1");
     }
-    ms.deleteSubtree(strToPath(p + "/ADirectory1/db1/"), ttlTimeProvider);
+    ms.deleteSubtree(strToPath(p + "/ADirectory1/db1/"));
 
     assertEmptyDirectory(p + "/ADirectory1");
     assertDeleted(p + "/ADirectory1/db1");
@@ -382,7 +383,7 @@ public abstract class MetadataStoreTestBase extends 
HadoopTestBase {
   public void testDeleteRecursiveRoot() throws Exception {
     setUpDeleteTest();
 
-    ms.deleteSubtree(strToPath("/"), ttlTimeProvider);
+    ms.deleteSubtree(strToPath("/"));
     assertDeleted("/ADirectory1");
     assertDeleted("/ADirectory2");
     assertDeleted("/ADirectory2/db1");
@@ -393,10 +394,10 @@ public abstract class MetadataStoreTestBase extends 
HadoopTestBase {
   @Test
   public void testDeleteNonExisting() throws Exception {
     // Path doesn't exist, but should silently succeed
-    ms.delete(strToPath("/bobs/your/uncle"), ttlTimeProvider);
+    ms.delete(strToPath("/bobs/your/uncle"));
 
     // Ditto.
-    ms.deleteSubtree(strToPath("/internets"), ttlTimeProvider);
+    ms.deleteSubtree(strToPath("/internets"));
   }
 
 
@@ -434,7 +435,7 @@ public abstract class MetadataStoreTestBase extends 
HadoopTestBase {
     }
 
     if (!(ms instanceof NullMetadataStore)) {
-      ms.delete(strToPath(filePath), ttlTimeProvider);
+      ms.delete(strToPath(filePath));
       meta = ms.get(strToPath(filePath));
       assertTrue("Tombstone not left for deleted file", meta.isDeleted());
     }
@@ -612,7 +613,7 @@ public abstract class MetadataStoreTestBase extends 
HadoopTestBase {
     destMetas.add(new PathMetadata(makeDirStatus("/b1")));
     destMetas.add(new PathMetadata(makeFileStatus("/b1/file1", 100)));
     destMetas.add(new PathMetadata(makeFileStatus("/b1/file2", 100)));
-    ms.move(srcPaths, destMetas, ttlTimeProvider, null);
+    ms.move(srcPaths, destMetas, null);
 
     // Assert src is no longer there
     dirMeta = ms.listChildren(strToPath("/a1"));
@@ -662,11 +663,11 @@ public abstract class MetadataStoreTestBase extends 
HadoopTestBase {
 
     // Make sure delete is correct as well
     if (!allowMissing()) {
-      ms.delete(new Path(p2), ttlTimeProvider);
+      ms.delete(new Path(p2));
       meta = ms.get(new Path(p1));
       assertNotNull("Path should not have been deleted", meta);
     }
-    ms.delete(new Path(p1), ttlTimeProvider);
+    ms.delete(new Path(p1));
   }
 
   @Test
diff --git 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/AbstractITestS3AMetadataStoreScale.java
 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/AbstractITestS3AMetadataStoreScale.java
index f1771a3..0a6e17f 100644
--- 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/AbstractITestS3AMetadataStoreScale.java
+++ 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/AbstractITestS3AMetadataStoreScale.java
@@ -144,15 +144,15 @@ public abstract class AbstractITestS3AMetadataStoreScale 
extends
             toDelete = movedPaths;
             toCreate = origMetas;
           }
-          ms.move(toDelete, toCreate, ttlTimeProvider, null);
+          ms.move(toDelete, toCreate, null);
         }
         moveTimer.end();
         printTiming(LOG, "move", moveTimer, operations);
       } finally {
         // Cleanup
         clearMetadataStore(ms, count);
-        ms.move(origPaths, null, ttlTimeProvider, null);
-        ms.move(movedPaths, null, ttlTimeProvider, null);
+        ms.move(origPaths, null, null);
+        ms.move(movedPaths, null, null);
       }
     }
   }
@@ -215,7 +215,7 @@ public abstract class AbstractITestS3AMetadataStoreScale 
extends
       throws IOException {
     describe("Recursive deletion");
     NanoTimer deleteTimer = new NanoTimer();
-    ms.deleteSubtree(BUCKET_ROOT, ttlTimeProvider);
+    ms.deleteSubtree(BUCKET_ROOT);
     deleteTimer.end();
     printTiming(LOG, "delete", deleteTimer, count);
   }
diff --git 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/ITestLocalMetadataStoreScale.java
 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/ITestLocalMetadataStoreScale.java
index 591fb0e..7477ade 100644
--- 
a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/ITestLocalMetadataStoreScale.java
+++ 
b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/ITestLocalMetadataStoreScale.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.fs.s3a.scale;
 
 import org.apache.hadoop.fs.s3a.s3guard.LocalMetadataStore;
 import org.apache.hadoop.fs.s3a.s3guard.MetadataStore;
+import org.apache.hadoop.fs.s3a.s3guard.S3Guard;
 
 import java.io.IOException;
 
@@ -31,7 +32,7 @@ public class ITestLocalMetadataStoreScale
   @Override
   public MetadataStore createMetadataStore() throws IOException {
     MetadataStore ms = new LocalMetadataStore();
-    ms.initialize(getFileSystem());
+    ms.initialize(getFileSystem(), new S3Guard.TtlTimeProvider(getConf()));
     return ms;
   }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-commits-h...@hadoop.apache.org

Reply via email to