# Licensed to the Apache Software Foundation (ASF) under one or more contributor
# license agreements; and to You under the Apache License, Version 2.0.

whisk.spi {
  ArtifactStoreProvider = whisk.core.database.CouchDbStoreProvider
  ActivationStoreProvider = whisk.core.entity.ArtifactActivationStoreProvider
  MessagingProvider = whisk.connector.kafka.KafkaMessagingProvider
  ContainerFactoryProvider = whisk.core.containerpool.docker.DockerContainerFactoryProvider
  LogStoreProvider = whisk.core.containerpool.logging.DockerToActivationLogStoreProvider
  LoadBalancerProvider = whisk.core.loadBalancer.ShardingContainerPoolBalancer
}

dispatchers {
  # Custom dispatcher for CouchDB Client. Tune as needed.
  couch-dispatcher {
    type = Dispatcher
    executor = "thread-pool-executor"

    # Underlying thread pool implementation is java.util.concurrent.ThreadPoolExecutor
    thread-pool-executor {
      # Min number of threads to cap factor-based corePoolSize number to
      core-pool-size-min = 2

      # The core-pool-size-factor is used to determine corePoolSize of the
      # ThreadPoolExecutor using the following formula:
      # ceil(available processors * factor).
      # Resulting size is then bounded by the core-pool-size-min and
      # core-pool-size-max values.
      core-pool-size-factor = 2.0

      # Max number of threads to cap factor-based corePoolSize number to
      core-pool-size-max = 32
    }
    # Throughput defines the number of messages that are processed in a batch
    # before the thread is returned to the pool. Set to 1 for as fair as possible.
    throughput = 5
  }

  # Custom dispatcher for Kafka client. Tune as needed.
  kafka-dispatcher {
    type = Dispatcher
    executor = "thread-pool-executor"

    # Underlying thread pool implementation is java.util.concurrent.ThreadPoolExecutor
    thread-pool-executor {
      # Min number of threads to cap factor-based corePoolSize number to
      core-pool-size-min = 2

      # The core-pool-size-factor is used to determine corePoolSize of the
      # ThreadPoolExecutor using the following formula:
      # ceil(available processors * factor).
      # Resulting size is then bounded by the core-pool-size-min and
      # core-pool-size-max values.
      core-pool-size-factor = 2.0

      # Max number of threads to cap factor-based corePoolSize number to
      core-pool-size-max = 32
    }

    # Throughput defines the number of messages that are processed in a batch
    # before the thread is returned to the pool. Set to 1 for as fair as possible.
    throughput = 5
  }
}
