public AmzaActivityWALWriter(
      AmzaWALUtil amzaWALUtil, long replicateTimeoutMillis, ObjectMapper mapper) {
    this.amzaWALUtil = amzaWALUtil;
    this.replicateTimeoutMillis = replicateTimeoutMillis;

    JacksonJsonObjectTypeMarshaller<MiruPartitionedActivity> partitionedActivityMarshaller =
        new JacksonJsonObjectTypeMarshaller<>(MiruPartitionedActivity.class, mapper);
    this.activityWALKeyFunction =
        (partitionedActivity) -> {
          long activityCollisionId;
          if (partitionedActivity.type != MiruPartitionedActivity.Type.BEGIN
              && partitionedActivity.type != MiruPartitionedActivity.Type.END) {
            activityCollisionId = partitionedActivity.timestamp;
          } else {
            activityCollisionId = partitionedActivity.writerId;
          }

          try {
            return columnKeyMarshaller.toLexBytes(
                new MiruActivityWALColumnKey(
                    partitionedActivity.type.getSort(), activityCollisionId));
          } catch (Exception e) {
            throw new RuntimeException(e);
          }
        };
    this.activitySerializerFunction =
        partitionedActivity -> {
          try {
            return partitionedActivityMarshaller.toBytes(partitionedActivity);
          } catch (Exception e) {
            throw new RuntimeException(e);
          }
        };
  }
 @Override
 public void delete(
     MiruTenantId tenantId, MiruPartitionId partitionId, Collection<MiruActivityWALColumnKey> keys)
     throws Exception {
   EmbeddedClient client = amzaWALUtil.getActivityClient(tenantId, partitionId);
   if (client != null) {
     try {
       client.commit(
           Consistency.leader_quorum,
           null,
           (txKeyValueStream) -> {
             for (MiruActivityWALColumnKey columnKey : keys) {
               if (!txKeyValueStream.commit(
                   columnKeyMarshaller.toLexBytes(columnKey), null, -1, true)) {
                 return false;
               }
             }
             return true;
           },
           replicateTimeoutMillis,
           TimeUnit.MILLISECONDS);
     } catch (PropertiesNotPresentException | PartitionIsDisposedException e) {
       // Ignored
     } catch (FailedToAchieveQuorumException e) {
       throw new MiruWALWrongRouteException(e);
     }
   }
 }