<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->
<FindBugsFilter>

  <!-- same code as in FileSystem is triggering the same warning. -->
  <Match>
    <Class name="org.apache.hadoop.fs.s3native.S3xLoginHelper" />
    <Method name="checkPath" />
    <Bug pattern="ES_COMPARING_STRINGS_WITH_EQ" />
  </Match>
  <!-- Redundant null check makes code clearer, future-proof here. -->
  <Match>
    <Class name="org.apache.hadoop.fs.s3a.S3AFileSystem" />
    <Method name="s3Exists" />
    <Bug pattern="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE" />
  </Match>

  <!--
    This extends the serializable S3Object, so findbug checks
    serializability. It is never serialized however, so its
    warnings are false positives.
  -->
  <Match>
    <Class name="org.apache.hadoop.fs.s3a.InconsistentS3Object" />
    <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED" />
  </Match>
  <Match>
    <Class name="org.apache.hadoop.fs.s3a.InconsistentS3Object" />
    <Bug pattern="SE_NO_SERIALVERSIONID" />
  </Match>

  <!--
   findbugs gets confused by lambda expressions in synchronized methods
   and considers references to fields to be unsynchronized.
   As you can't disable the methods individually, we have to disable
   them for the entire class.
    -->
  <Match>
    <Class name="org.apache.hadoop.fs.s3a.S3AInputStream"/>
    <Bug pattern="IS2_INCONSISTENT_SYNC"/>
  </Match>
  <!--
    findbugs reporting RV ignored. Not true.
    "Return value of S3AReadOpContext.getReadInvoker() ignored,
    but method has no side effect"
  -->
  <Match>
    <Class name="org.apache.hadoop.fs.s3a.S3AInputStream"/>
    <Method name="reopen"/>
    <Bug pattern="RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT"/>
  </Match>
  <Match>
    <Class name="org.apache.hadoop.fs.s3a.S3AFileSystem"/>
    <Method name="openFileWithOptions"/>
    <Bug pattern="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE"/>
  </Match>
  <Match>
    <Class name="org.apache.hadoop.fs.s3a.s3guard.S3GuardTool$BucketInfo"/>
    <Method name="run"/>
    <Bug pattern="SF_SWITCH_FALLTHROUGH"/>
  </Match>

  <!--
  Some of the S3A Instrumentation classes increment volatile references from
  within synchronized contexts; they use volatile to keep the cost
  of these updates and reading them down.
   -->
  <Match>
    <Class name="org.apache.hadoop.fs.s3a.S3AInstrumentation$InputStreamStatisticsImpl"/>
    <Bug pattern="VO_VOLATILE_INCREMENT"/>
  </Match>

</FindBugsFilter>
