<!--
   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>
     <!-- It is okay to skip up to end of file. No need to check return value. -->
     <Match>
       <Class name="org.apache.hadoop.fs.azure.AzureNativeFileSystemStore" />
       <Method name="retrieve" />
       <Bug pattern="SR_NOT_CHECKED" />
       <Priority value="2" />
     </Match>

     <!-- Returning fully loaded array to iterate through is a convenience
	  and helps performance. -->
     <Match>
       <Class name="org.apache.hadoop.fs.azure.NativeAzureFileSystem$FolderRenamePending" />
       <Method name="getFiles" />
       <Bug pattern="EI_EXPOSE_REP" />
       <Priority value="2" />
     </Match>

     <!-- Need to start keep-alive thread for SelfRenewingLease in constructor. -->
     <Match>
       <Class name="org.apache.hadoop.fs.azure.SelfRenewingLease" />
       <Bug pattern="SC_START_IN_CTOR" />
       <Priority value="2" />
     </Match>
     
     <!-- Using a key set iterator is fine because this is not a performance-critical
	  method. -->
     <Match>
       <Class name="org.apache.hadoop.fs.azure.PageBlobOutputStream" />
       <Method name="logAllStackTraces" />
       <Bug pattern="WMI_WRONG_MAP_ITERATOR" />
       <Priority value="2" />
     </Match>
 </FindBugsFilter>
