<!--
    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>
  <Match>
    <!-- generated code, we can't be held responsible for findbugs in it //-->
    <Class name="~org\.apache\.distributedlog\.thrift.*" />
  </Match>
  <Match>
    <!-- generated code, we can't be held responsible for findbugs in it //-->
    <Class name="~org\.apache\.distributedlog\.service\.placement\.thrift.*" />
  </Match>
  <Match>
    <!-- it is safe to cast exception here. //-->
    <Class name="org.apache.distributedlog.service.DistributedLogServiceImpl$Stream$2" />
    <Method name="onFailure" />
    <Bug pattern="BC_UNCONFIRMED_CAST" />
  </Match>
  <Match>
    <!-- it is safe to cast exception here. //-->
    <Class name="org.apache.distributedlog.service.stream.BulkWriteOp" />
    <Method name="isDefiniteFailure" />
    <Bug pattern="BC_IMPOSSIBLE_INSTANCEOF" />
  </Match>
</FindBugsFilter>
