# GBDS Configuration

## Configuration File

The GBDS configuration parameters are defined in a configuration file containing all parameters and their respective values. Parameters that are omitted assume their default values. This section describes the properties of the configuration file.

This document is updated for GBDS version 4.6.9.

### File Location

The configuration file is located at: `/etc/griaule/conf/gbds/application.conf`.

### File Properties

The configuration file must follow some requirements so that it can be correctly interpreted by GBDS. These requirements are:

1. The file name and its location must be exactly the same as described in the section [File Location](#localização-do-arquivo)
2. There must be only one configuration parameter per line.
3. Each configuration parameter must have the form `{parameter}={value}`, without line breaks;
4. Each value must be separated by a comma when assigned to the same parameter.

## Akka Configuration Parameters

Akka configuration parameters are structured as a block at the beginning of the configuration file, as shown below:

{% hint style="info" %}
Go to the [Akka Documentation](https://doc.akka.io/docs/akka/current/general/configuration.html) for more information about these parameters.
{% endhint %}

```properties
akka {
	loglevel = "WARNING"
	stdout-loglevel = "INFO"
	loggers = ["akka.event.slf4j.Slf4jLogger"]
	logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
	actor {
		guardian-supervisor-strategy = "com.griaulebiometrics.gbds.driver.topology.GBDSGuardianSupervisionStrategy"
		provider = "cluster"

		allow-java-serialization = on
		serialize-creators = off

		serializers {
			kryo = io.altoo.akka.serialization.kryo.KryoSerializer
			proto = akka.remote.serialization.ProtobufSerializer
		}
		serialization-bindings {
			"com.griaulebiometrics.akka.utils.message.KryoSerializableMessage" = kryo
		}

		default-dispatcher {
			type = "Dispatcher"
			executor = "default-executor"
			default-executor {
				fallback = "fork-join-executor"
			}
			fork-join-executor {
				parallelism-min = 8
				parallelism-factor = 1.0
				parallelism-max = 64
			}
		}
	}

	remote {
		artery.enabled = "on"
		artery.transport = "tcp"
		artery.canonical {
			hostname = "gbds2"
			port = 2551
		}
		artery.advanced {
			image-liveless-timeout = 20s
			client-liveness-timeout = 10s
			maximum-frame-size = 30MiB
			maximum-large-frame-size = 100MiB
			buffer-pool-size = 128
			large-buffer-pool-size = 32
		}
		use-dispatcher = "akka.remote.default-remote-dispatcher"
		transport-failure-detector {
			implementation-class = "akka.remote.DeadlineFailureDetector"
			heartbeat-interval = 120s
			acceptable-heartbeat-pause = 300s
		}
		watch-failure-detector {
			implementation-class = "akka.remote.PhiAccrualFailureDetector"
			heartbeat-interval = 300s
			threshold = 10.0
			max-sample-size = 200
			min-std-deviation = 100s
			acceptable-heartbeat-pause = 300s
			unreachable-nodes-reaper-interval = 10s
			expected-response-after = 120s
		}
	}

	cluster {
		seed-nodes = [
			##NODES##
			"akka://main@<hostname1>:2551",
			"akka://main@<hostname2>:2551",
			"akka://main@<hostname3>:2551",
			"akka://main@<hostname4>:2551"
			##LASTNODE##
		]
		roles =["manager"]
		# Number of nodes that must be up before starting cluster
		role.manager.min-nr-of-members=4
		failure-detector.min-std-deviation = 1000 ms
		failure-detector.threshold = 50.0
		failure-detector.acceptable-heartbeat-pause = 900s
		use-dispatcher = akka.cluster.cluster-dispatcher
		singleton {
			singleton-name = "offsetmanager"
			hand-over-retry-interval = 1s
			min-number-of-hand-over-retries = 15
		}
		singleton-proxy {
			singleton-name = ${akka.cluster.singleton.singleton-name}
			singleton-identification-interval = 1s
			buffer-size = 1000
		}
		cluster-dispatcher {
			type = "Dispatcher"
			executor = "fork-join-executor"
			fork-join-executor {
				parallelism-min = 2
				parallelism-max = 4
			}
		}
	}
}

prio-dispatcher {
	mailbox-type = "com.griaulebiometrics.gbds.driver.mailbox.PriorityMailbox"
	type = "Dispatcher"
	executor = "default-executor"
	default-executor {
		fallback = "fork-join-executor"
	}
	fork-join-executor {
		parallelism-min = 8
		parallelism-factor = 1.0
		parallelism-max = 64
	}
}

akka-kryo-serialization {
	type = graph
	id-strategy = default
	resolve-subclasses = true
	implicit-registration-logging = false
	kryo-initializer = "com.griaulebiometrics.akka.utils.message.KryoInitializer"
}
```

{% hint style="warning" %}
It is highly recommended that **no** Akka configuration parameters be changed without proper guidance to avoid application malfunction.

If it is necessary to update your environment configurations, contact griaule support by email <support@griaule.com> for more information.
{% endhint %}

### loglevel

This parameter defines the level of information that will be kept in the system logs. Values must be set in double quotes.

**Default Value:**

> `"WARNING"`

**Possible Values:**

> * `"OFF"`
> * `"ERROR"`
> * `"WARNING"`
> * `"INFO"`
> * `"DEBUG"`

### stdout-loglevel

This parameter defines the level of information that will be kept by the basic logger that is started during the initialization of the *ActorSystem*. This logger prints the log message to stdout (System.out). Values must be set in double quotes.

**Default Value:**

> `"INFO"`

**Possible Values:**

> * `"OFF"`
> * `"ERROR"`
> * `"WARNING"`
> * `"INFO"`
> * `"DEBUG"`

### loggers

This parameter defines, inside brackets, the logger entities that will be used for logging at boot time.

**Default Value:**

> `"akka.event.slf4j.Slf4jLogger"`

### logging-filter

This parameter defines the log event filter that will be used by the *LoggingAdapter* before publishing log events to the *eventStream*.

**Default Value:**

> `"akka.event.slf4j.Slf4jLoggingFilter"`

### actor

#### guardian-supervisor-strategy

This parameter defines the class that will be used by the guardian to obtain its *supervisorStrategy*

**Default Value:**

> `"com.griaulebiometrics.gbds.driver.topology.GBDSGuardianSupervisionStrategy"`

#### provider

This parameter defines the *ActorProvider* that will be used.

**Default Value:**

> `"cluster"`

**Possible Values:**

> * `"local"`
> * `"remote"`
> * `"cluster"`

#### serializers

This parameter defines the entries for serializers and their bindings.

The serializers used are:

`kryo = io.altoo.akka.serialization.kryo.KryoSerializer` `proto = akka.remote.serialization.ProtobufSerializer`

And their binding is:

`"com.griaulebiometrics.akka.utils.message.KryoSerializableMessage" = kryo`

### remote

#### artery

This parameter defines the configuration for *Artery* based on the transport driver.

**Default values:**

`transport = "tcp"`

`enabled = "on"`

`advanced.image-liveless-timeout = 20s`

`advanced.client-liveness-timeout = 10s`

`advanced.maximum-frame-size = 30MiB`

`advanced.buffer-pool-size = 128`

`advanced.maximum-large-frame-size = 100MiB`

`advanced.large-buffer-pool-size = 32`

`canonical.hostname = "gbds2"`

`canonical.port = 2551`

### cluster

#### seed-nodes

This parameter defines the nodes that will automatically join at startup. Each value must be added in double quotes and separated by commas inside brackets.

**Example Value:**

> `["akka://main@<hostname1>:2551"]`

#### roles

This parameter defines the roles of this member. Each value must be added in double quotes and separated by commas inside brackets.

**Default Value:**

> `["manager"]`

#### role.manager.min-nr-of-members

This parameter defines the minimum number of nodes that must be up before the cluster starts.

**Default Value:**

> `4`

#### singleton.singleton-name

This parameter defines the name of the child singleton actor.

**Default Value:**

> `offsetmanager`

#### singleton.hand-over-retry-interval

When a node is starting to become the oldest, it sends a hand-over request to the previously oldest node, which should be leaving the cluster. This parameter defines the time, in seconds, to retry sending the request until the previously oldest node confirms that the hand-over request has started or the previously oldest member is removed from the cluster.

**Default Value:**

> `1s`

#### singleton.min-number-of-hand-over-retries

This parameter defines the minimum number of retries to resend the hand-over request to the previously oldest node.

**Default Value:**

> `15`

#### singleton-proxy.singleton-name

This parameter defines the name of the singleton actor that is initialized by the *ClusterSingletonManager*.

**Default Value:**

> `${akka.cluster.singleton.singleton-name}`

#### singleton-proxy.singleton-identification-interval

This parameter defines the interval, in seconds, at which the proxy tries to resolve the singleton instance.

**Default Value:**

> `1s`

#### singleton-proxy.buffer-size

If the singleton's location is unknown, the proxy will store the number of messages defined in this parameter in a buffer and deliver them when the singleton is identified. When the buffer is full, the oldest messages will be discarded and new messages will be sent by the proxy.

**Default Value:**

> `1000`

**Possible Values:**

> `1` to `10000`

## Configuration Parameters

This section describes each of the GBDS configuration parameters that can be listed in the configuration file and how they affect the system's operation.

### gbds.log.diagnose

Adds logs to the Kafka queue for each consumption activity.

**Default Value:**

> `true`

### gbds.cluster.kafka.task.topic

This parameter defines the Kafka topic where tasks will be allocated.

**Default Value:**

> `gbds-tasks`

### gbds.cluster.kafka.max-tasks-per-poll

Number of tasks performed in Kafka in each poll. Task consumption in Kafka is done by polling the queue, and the poll retrieves a certain number of records each time. Each record is a task in GBDS. This setting limits how many records are fetched per poll.

**Default Value:**

> `1`

**Possible Values:**

> `1` to `1000`

### gbds.cluster.zookeeper.quorum

This parameter defines the hostname and port where the zookeeper servers can be found. If more than one value is available, each value must be separated by commas

**Default Value:**

> `<hostname>:<port>`

### gbds.cluster.tasks.window-size-for-avoiding-duplicate-tasks

This parameter configures the size of the queue with the last `N` processed/in-processing tasks. If a task is duplicated for processing and is still in the queue, it is ignored.

**Default Value:**

> `1000`

### gbds.cluster.kafka.quorum

This parameter defines the address of the *Kafka broker* and must reflect the Kafka configurations.

**Default Value:**

> `<hostname>:6667`

### gbds.node.matchers.start.parameters

This parameter defines the initial settings for the *node matchers* when the application is starting.

**Default Value:**

> `"-Dakka.remote.netty.tcp.port=0 -Dakka.cluster.roles.0=matcher -Dlog4j.configuration=file:/etc/griaule/conf/gbds/gbds-log4j.xml -XX:MaxMetaspaceSize=256m -Xmx1024m"`

### gbds.node.matchers.actor-system-start.timeout

This parameter defines the *timeout*, in seconds, to initialize each *ActorSystem* remote that will run a *matcher*.

**Default Value:**

> `30s`

### gbds.node.matchers.start.timeout

This parameter defines the *timeout*, in seconds, to open a *matcher* section in the *ActorSystem* remote.

**Default Value:**

> `20s`

### gbds.node.matchers.number

This parameter defines the number of *matchers* that will be used on this GBDS node.

If match microservices are enabled, 3 instances of the microservice will be started for each 1 defined in this setting.

**Default Value:**

> `1`

### gbds.node.sinks.number

This parameter defines the number of *sinks* that will be used on this GBDS node.

**Default Value:**

> `1`

### gbds.node.actor-start.timeout

This parameter defines the *timeout*, in seconds, for initialization of all actors on this GBDS node.

**Default Value:**

> `60s`

### gbds.node.max-loaded-tasks

This parameter defines the maximum number of tasks that can coexist simultaneously in GBDS. When this number is reached, no task will be read until some previous one is sent.

**Default Value:**

> `100`

**Possible Values:**

> `1` a `20000`

### gbds.node.wait-time-when-maxed-tasks:

This parameter defines the wait time before reading more tasks from Kafka.

**Default Value:**

> `1s`

**Possible Values:**

> `0s` a `5s`

### gbds.node.hbase-template-loaders.number

This parameter defines the number of HBase template loaders.

**Default Value::**

> `1`

### gbds.node.rdb-template-loaders.number

This parameter defines the number of RDB template loaders.

**Default Value::**

> `1`

### gbds.biometric.fingerprint.cab.skip-non-cab

This parameter is a flag to skip non-cab templates.

**Default Value::**

> `true`

### gbds.matchers.metrics.enabled

This parameter enables matcher metrics.

**Default Value::**

> `true`

### gbds.biometric.face.identify.enabled

This parameter enables the identification operation for faces.

**Default Value::**

> `true`

### gbds.biometric.face.enroll.enabled

This parameter enables face enrollment.

**Default Value::**

> `true`

### gbds.biometric.fingerprint.cab.search-without-cab

This parameter is a flag to perform searches without cab.

**Default Value::**

> `false`

### gbds.fingerprint.post-matching.enabled

This parameter enables post matching for fingerprints.

**Default Value::**

> `true`

### gbds.face.post-matching.enabled

This parameter enables post matching for face.

**Default Value::**

> `true`

### gbds.cluster.quorum.quorum-check-delay

This parameter defines the delay, in seconds, to make the decision to **Shut Down** a cluster member that is unreachable or removed.

{% hint style="info" %}
Shut Down, in this case, refers to marking the node as unreachable, so that the rest of the system adapts its operation to the case with one fewer node.
{% endhint %}

The delay counter starts and restarts whenever there are changes in the cluster members' states.

**Default Value:**

> `5s`

### gbds.boot.completed-message-ack.timeout

This parameter defines how long, in seconds, the boot actor (*boot*) will wait for receiving an *ack* for the *CompletedBootMessage* from a *NodeManager*

If the *ack* if not received, the message will be resent.

**Default Value:**

> `3s`

### gbds.boot.people.node-nr-scanners

Number of parallel scan actors that will scan registered people during system boot on each node.

**Default Value:**

> `1`

### gbds.boot.shuffler-message-ack.timeout

How long the shuffler actor will wait for an acknowledge. If the acknowledge is not received, the message will be resent.

**Default Value:**

> `90s`

### gbds.boot.scan.ignoreErrorsOnRegion

Determines whether failing HBase regions should be ignored during boot.

**Default Value:**

> `true`

**Possible Values:**

> * `true`
> * `false`

### gbds.boot.scan.ignoreErrorsOnRegion.maxTries

Defines the maximum number of attempts before ignoring a failing region during boot.

**Default Value:**

> `5`

### gbds.boot.scan.maxRowsPerNode

Using this setting, GBDS will stop scanning people on a node as soon as it reaches this number of rows.

**Default Value:**

> `0`

### gbds.boot.scan-delayer.rows

Defines the number of rows to be scanned before the delay.

**Default Value:**

> `0`

### gbds.boot.scan-delayer.secs

Defines the delay time to wait after each block of scanned rows.

**Default Value:**

> `0`

### gbds.ul.boot.scan.enabled

Defines whether UL boot should be ignored.

**Default Value:**

> `true`

**Possible Values:**

> * `true`
> * `false`

### gbds.boot.scan.ignoreErrorsOnRegion

Defines whether bad regions should be ignored during UL boot.

**Default Value:**

> `true`

**Possible Values:**

> * `true`
> * `false`

### gbds.boot.matcher.creation.sleepTime.ms

Defines the sleep time between the creation of matchers.

**Default Value:**

> `500`

**Minimum Value:**

> `0`

**Maximum Value:**

> `30000`

### gbds.biometric.fingerprint.enabled

This parameter is used to determine if fingerprint is the priority search object.

**Default Value:**

> `true`

**Possible Values:**

> * `true`
> * `false`

### gbds.biometric.fingerprint.exception.enabled

This parameter defines if fingerprints should be considered when generating enrollment exceptions (*enrollment*).

**Default Value:**

> `true`

**Possible Values:**

> * `true`
> * `false`

### gbds.biometric.fingerprint.identify.threshold

This parameter defines the minimum match score for a fingerprint comparison to be considered a match during an identification operation.*match*) during the search operation.

**Default Value:**

> `30`

### gbds.biometric.fingerprint.exception.threshold

This parameter defines the minimum match score for a fingerprint comparison to be considered a match*match*) during enrollment operations, generating an exception.

**Default Value:**

> `40`

### gbds.biometric.fingerprint.exception.enroll.min-matches-for-exception

This parameter defines the minimum number of finger matches required to generate an exception during an enrollment operation.

**Default Value:**

> `2`

### gbds.biometric.fingerprint.cab.identify.threshold

This parameter defines the threshold for matches using CAB analysis. This parameter is not used if CAB checking is not enabled.

**Default Value:**

> `5`

### gbds.biometric.fingerprint.latent.threshold

This parameter defines the minimum score to consider a latent fingerprint search a match.

**Default Value:**

> `10`

### gbds.biometric.fingerprint.identify.index.delta-zero

This parameter defines the configuration index for Delta Zero. Delta coefficients are used to optimize searches.

**Default Value:**

> `-1` (disabled)

### gbds.biometric.fingerprint.identify.index.delta-one

This parameter defines the configuration index for Delta One. Delta coefficients are used to optimize searches.

**Default Value:**

> `-1` (disabled)

### gbds.latent.candidates.max-number

This parameter defines the maximum size of the candidate list returned in latent searches.

**Default Value:**

> `1000`

### gbds.biometric.palmprint.enabled

This parameter is used to determine if palmprints are primary search objects.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.biometric.palmprint.exception.enabled

This parameter defines if palmprints should be considered for generating enrollment exceptions (*enroll*).

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.biometric.palmprint.interdigital.identify.threshold

This parameter defines the minimum match score for the comparison between palmar interdigital prints to be considered a match during search operations.

**Default Value:**

> `70`

### gbds.biometric.palmprint.thenar.identify.threshold

This parameter defines the minimum match score for the comparison between palmar thenar prints to be considered a match during search operations.

**Default Value:**

> `70`

### gbds.biometric.palmprint.hypothenar.identify.threshold

This parameter defines the minimum match score for the comparison between palmar hypothenar prints to be considered a match during search operations.

**Default Value:**

> `70`

### gbds.biometric.face.enabled

This parameter is used to determine if faces are used as primary search objects.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.biometric.face.exception.enabled

This parameter defines if facial images should be considered when generating enrollment exceptions (*enroll*).

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.biometric.face.identify.threshold

This parameter defines the minimum match score for face comparisons to be considered a match during a search operation.

**Default Value:**

> `60`

### gbds.biometric.face.exception.threshold

This parameter defines the threshold that will be used when comparing facial biometrics during identification operation. Setting a high value for this parameter may possibly increase the number of false negative occurrences.

**Default Value:**

> `60`

### gbds.biometric.face.exception.minimum.coincident-fingers.ignore.face

This parameter defines the minimum number of coincident fingers required to discard the face comparison result when generating an enrollment exception (*enroll*).

**Default Value:**

> `4`

### gbds.biometric.face.template.format

Defines the template format for face.

The possible values are: `TPT_FORMAT_1` or `TPT_FORMAT_2`.

{% hint style="warning" %}
Face formats are not interchangeable. Faces enrolled in one format will not match faces enrolled in another format.
{% endhint %}

{% hint style="danger" %}
The value of this setting must be the same in the files `application.conf` and `gbdsapi.properties`
{% endhint %}

### gbds.biometric.iris.enabled

This parameter is used to determine if the iris is defined as a primary search object.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.biometric.iris.exception.enabled

This parameter defines if the iris should be considered when generating enrollment exceptions (*enroll*).

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.biometric.iris.exception.threshold

This parameter defines the minimum match score for an iris comparison to be considered a match during an enrollment operation, generating an exception.

**Default Value:**

> `62`

### gbds.biometric.iris.identify.threshold

This parameter defines the minimum match score for an iris comparison to be considered a match during a search operation.

**Default Value:**

> `62`

### gbds.latent.reverse-latent-match.enabled

This parameter defines whether unresolved latent enrollment and search are enabled. It is used for forensic applications.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.latent.fingerprint.identify.threshold

This parameter defines the minimum score to consider a latent fingerprint search a match.

**Default Value:**

> `12`

### gbds.latent.additional-search.enabled

This parameter defines whether additional searches are active for latent searches. Additional searches will perform an extra comparison for matching pairs within a defined threshold.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.latent.additional-search.fingerprint.execution-lower-bound

This parameter defines the minimum match score for which additional searches should be performed.

**Default Value:**

> `15`

### gbds.latent.additional-search.fingerprint.execution-upper-bound

This parameter defines the maximum score for which additional searches should be performed.

**Default Value:**

> `120`

### gbds.latent.primary-classification.enabled

This parameter defines whether primary classifications should be used for latent searches.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.latent.primary-classification.same-class.fingerprint.threshold

This parameter defines the minimum threshold to compare same-class fingerprints and consider a match during latent searches.

**Default Value:**

> `15`

### gbds.latent.primary-classification.different-class.fingerprint.threshold

This parameter defines the minimum threshold to consider a match between different finger classes during latent searches.

**Default Value:**

> `40`

### gbds.latent.primary-classification.unknown-class.should-use-different-class-threshold

This parameter defines whether the different-class match threshold should be used for latent searches when there is an unknown primary classification.

**Default Value:**

> `true`

**Possible Values:**

> * `true`
> * `false`

### gbds.latent.ul.fingerprint.identify.threshold

This parameter defines the default threshold for unresolved latent fingerprint search.

**Default Value:**

> `4`

### gbds.latent.ul.palmprint.identify.threshold

This parameter defines the default threshold for unresolved latent palmprint search.

**Default Value:**

> `4`

### gbds.latent.postmatching.enabled

This parameter defines whether the *postmatching* is active for reverse latent searches, regular latent searches and searches against unresolved latents already registered.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.rdb.driverClassName

This parameter defines the class name for the relational database that will be used to store unresolved latents. This value must be set in double quotes.

**Default Value:**

> `"com.mysql.jdbc.Driver"`

### gbds.rdb.url

This parameter defines the URL of the relational database to be accessed. This value must be set in double quotes.

**Default Value:**

> `"jdbc:mysql://<address>:<port>/gbds"`

### gbds.rdb.username

This parameter defines the user to be used in the relational database. This value must be set in double quotes.

**Default Value:**

> `"root"`

### gbds.rdb.password

This value defines the password to be used to access the relational database. This value must be set in double quotes.

### gbds.rdb.dialect

This parameter defines the dialect to be used in the relational database. This value must be enclosed in double quotes.

**Default Value:**

> `"org.hibernate.dialect.MySQLDialect"`

### gbds.rdb.showSql

This parameter defines whether SQL statements should be included in the application logs.

**Default Value:**

> `true`

**Possible Values:**

> * `true`
> * `false`

### gbds.rdb.maxPoolSize

This parameter defines the maximum number of connections that a pool will maintain.

**Default Value:**

> `100`

### gbds.rdb.minPoolSize

This parameter defines the minimum number of connections that a pool will maintain.

**Default Value:**

> `1`

### gbds.rdb.initialPoolSize

This parameter defines the number of connections a pool will attempt to acquire at startup. This value must be between gbds.rdb.minPoolSize and gbds.rdb.maxPoolSize.

**Default Value:**

> `2`

### gbds.rdb.maxStatments

This parameter defines the size of c3p0's global PreparedStatement cache. If both gbds.rdb.maxStatments and gbds.rdb.maxStatementsPerConnection are zero, the *statement caching* will not be enabled. If gbds.rdb.maxStatments is zero, but gbds.rdb.maxStatementsPerConnection is nonzero, the *statement caching* will be enabled, but no global limit will be enforced, only the per-connection maximum.

This parameter controls the total number of *statements* cached for all connections. If greater than zero, it should be a significantly large number, since each pooled connection requires its own distinct set of *statements* in cache. As a guideline, consider how many distinct PreparedStatements are frequently used in your application, then multiply that number by gbds.rdb.maxPoolSize to arrive at an appropriate value.

**Default Value:**

> `0`

### gbds.rdb.maxIdleTime

This parameter defines, in seconds, how long a connection may be pooled but unused before being discarded. Zero means idle connections never expire.

**Default Value:**

> `1800`

### gbds.rdb.maxConnectionAge

This parameter defines, in seconds, the lifetime of a connection. A connection older than gbds.rdb.maxConnectionAge will be destroyed and removed from the pool. This differs from gbds.rdb.maxIdleTime because it refers to absolute age. Even a connection that hasn't been very idle will be removed from the pool if it exceeds gbds.rdb.maxConnectionAge. Zero means no absolute maximum age is applied.

**Default Value:**

> `1800`

### gbds.rdb.statementCacheNumDeferredCloseThreads

If configured with a value greater than 0, the *statement cache* will track when connections are in use and only destroy the *statements* when their parent Connections are not in use. Although closing a *statement* while the parent connection is in use is formally within specifications, some databases and/or JDBC drivers, most notably Oracle, do not handle the case well and hang, leading to deadlocks. Setting this parameter to a positive value should eliminate the problem. This parameter should only be set if you observe c3p0 attempts to close() the *statements* cached ones hang (typically, you will see APPARENT DEADLOCKS in your logs). If set, this parameter should almost always be set to 1.

**Default Value:**

> `1`

### gbds.rdb.acquireIncrement

Determines how many connections at a time c3p0 will try to acquire when the pool is exhausted.

**Default Value:**

> `10`

### gbds.rdb.testConnectionOnCheckout

If *true*, an operation will be performed on each connection checkout to check whether the connection is valid. Testing connections on checkout is the simplest and most reliable form of connection testing, but for better performance consider testing connections periodically using gbds.rdb.idleConnectionTestPeriod.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.rdb.testConnectionOnCheckin

If *true*, an operation will be performed asynchronously on each connection checkin to verify whether the connection is valid. Use in combination with gbds.rdb.idleConnectionTestPeriod for an always-asynchronous and quite reliable connection test.

**Default Value:**

> `true`

**Possible Values:**

> * `true`
> * `false`

### gbds.rdb.acquireRetryAttempts

Defines how many times c3p0 will attempt to acquire a new connection from the database before giving up. If this value is less than or equal to zero, c3p0 will keep trying to obtain a connection indefinitely.

**Default Value:**

> `10`

### gbds.rdb.idleConnectionTestPeriod

If this number is greater than 0, c3p0 will test all idle, unchecked connections in the pool every number of seconds defined by this parameter.

**Default Value:**

> `30`

### gbds.biometric.newborn-palmprint.enabled

This parameter is used to determine whether newborn palmprint is the prioritized search object.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.biometric.newborn-palmprint.exception.enabled

This parameter defines whether newborn palmprint should be considered when generating enrollment exceptions.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.biometric.newborn-palmprint.identify.threshold

This parameter defines the minimum match score for a newborn palmprint comparison to be considered a match during the search operation.

**Default Value:**

> `50`

### gbds.cluster.recovery.qtd.scanners

Number of scanners for cluster recovery.

**Default Value::**

> `5`

### gbds.cluster.recovery.qtd.getters

Number of getters for cluster recovery. This parameter is no longer used in version 3.2x or above.

**Default Value::**

> `2`

### gbds.cluster.recovery.shuffler.block.window\.size

Number of shuffler block window size (shuffler buffer size) for cluster recovery.

**Default Value::**

> `100`

### gbds.router.virtual-nodes.number

This parameter defines the number of virtual nodes.

**Default Value::**

> `100`

### gbds.biometric.best-of-biometrics.enabled

This parameter enables best-of-biometrics. When enabled, a person's biometric set is the consolidation of the best biometrics obtained from all the person's transactions over time.

{% hint style="warning" %}
This flag **MUST** have the same value in the GBDS and GBDS API configurations.
{% endhint %}

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.biometric.remove-inactive-people-from-enroll-result

This parameter defines whether inactive profiles should be removed from enroll results.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.transparency.search.identify.result.notify.enabled

This parameter enables the email notification service, which sends notifications of search results with persons of interest.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.searches.verify.saveOnRdb.enabled

Defines whether the verify operation will be saved in the `gbds.transaction` RDB table.

**Default Value:**

> `true`

**Possible Values:**

> * `true`
> * `false`

{% hint style="danger" %}
This value must be the same in the `application.conf` and in the `gbdsapi.properties`
{% endhint %}

### gbds.searches.identify.saveOnRdb.enabled

Defines whether the identify operation will be saved in the `gbds.transaction` RDB table.

**Default Value:**

> `true`

**Possible Values:**

> * `true`
> * `false`

{% hint style="danger" %}
This value must be the same in the `application.conf` and in the `gbdsapi.properties`
{% endhint %}

### gbds.monitor.port

Defines the port on which the GBDS Monitor will run.

**Default Value:**

> `9100`

### gbds.memory-monitor

Adds JVM memory usage to logs every 10 seconds.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbds.watchdog.interval

Defines, in minutes, the time interval for watchdog logs.

**Default Value:**

> `1`

**Maximum Value:**

> `60`

### gbds.watchdog.log.mode

Defines the watchdog log mode.

**Default Value:**

> `TGUID_MATCHER_MAP`

**Possible Values:**

> * `TGUID_MATCHER_MAP`
> * `MATCHER_TGUID_MAP`

### gbds.watchdog.log.level

Defines the watchdog log level.

**Default Value:**

> `DEBUG`

**Possible Values:**

> * `DEBUG`
> * `INFO`

### gbds.verifyPostMatch.enabled

Turns post-match verification on or off in enrollment transactions with exceptions.

**Default Value:**

> `true`

**Possible Values:**

> * `true`
> * `false`

### gbds.search.verify.adjust-resolution

When this setting is enabled, API verifications and updates and the post-match verification in GBDS will adjust the resolution by performing a match verification, lowering the score on fingers and palms.

**Default Value:**

> `true`

**Possible Values:**

> * `true`
> * `false`

### gbscluster.update.consider.fingerprints

This parameter defines whether fingerprints should be considered when generating update exceptions.

**Default Value:**

> `true`

**Possible values:**

> * `true`
> * `false`

### gbscluster.update.consider.faces

This parameter defines whether face images should be considered when generating update exceptions.

**Default Value:**

> `false`

**Possible values:**

> * `true`
> * `false`

### gbscluster.update.consider.faces.beforeFingerprints

This parameter defines whether faces should be analyzed before fingerprints when generating update exceptions. If `false`, face analysis is done after fingerprint analysis.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

### gbscluster.update.faces.verify.matchthreshold

This parameter defines the threshold to be used during facial biometric comparisons in search operations. Setting a high value for this parameter may possibly result in an increase in false negatives.

**Default Value:**

> `60`

### gbscluster.update.minimum.fingers

This parameter defines the minimum number of finger matches required for an **update** operation to be accepted.

**Default Value:**

> `4`

## Template Serializer Configuration

This section describes configuration parameters related to the template serializer. These configuration parameters are designed to allow the use of the *GBDS Batch Extractor*.

{% hint style="info" %}
See the *GBDS Batch Extractor* manual for additional information on its use.
{% endhint %}

Whenever GBDS performs a *cold boot*, it will attempt to recover templates from a default column family. If the template does not exist in that column, GBDS will attempt to recover it from the fallback column family.

The serializer configuration parameters are:

### Default Column Family

These parameters are divided by biometric modalities. Templates in this column family are not encoded and the format used is *byteArray*.

```properties
gbds.hbase.templates.fingerprint.cf.name
gbds.hbase.templates.palmprint.cf.name
gbds.hbase.templates.face.cf.name
gbds.hbase.templates.iris.cf.name
gbds.hbase.templates.newborn-palmprint.cf.name
```

The default value for these parameters is `tpt`.

### Fallback Column Family

These parameters refer to the column families previously used to store biometric templates. They are separated by biometric modality.

```properties
gbds.hbase.templates.fallback.fingerprint.cf.name
gbds.hbase.templates.fallback.palmprint.cf.name
gbds.hbase.templates.fallback.face.cf.name
gbds.hbase.templates.fallback.iris.cf.name
gbds.hbase.templates.fallback.newborn-palmprint.cf.name
```

The default values represent the column families used before the change of these parameters, and are, respectively: `fingerprints`, `palmprints`, `faces` and `iris`.

### Fallback encoding in *base64*

The fallback column family supports encoding. The following parameters define whether the column family is base64 encoded. *base64*:

```properties
gbds.hbase.templates.fallback.fingerprint.cf.is-base64-encoded
gbds.hbase.templates.fallback.palmprint.cf.is-base64-encoded
gbds.hbase.templates.fallback.face.cf.is-base64-encoded
gbds.hbase.templates.fallback.iris.cf.is-base64-encoded
gbds.hbase.templates.fallback.newborn-palmprint.cf.is-base64-encoded
```

The default value for these parameters is `true`.

### gbds.template.memory.format

Defines how GBDS will store templates in memory and in the matchers.

The options are:

* `DESERIALIZED_FULL`: Default option. Templates are stored deserialized with minutiae and segments.
* `SERIALIZED_MINUTIAE_SEGMENTS`: Templates are stored deserialized with minutiae and segments.
* `SERIALIZED_MINUTIAE`: Templates are stored serialized with minutiae only. Segments are re-extracted from the template for each search performed. This option increases 1:N search time.
* `OPTIMIZED`: Uses a new optimized template format to reduce performance degradation over time in searches.

### Memory pre-allocation

Defines the amount of pre-allocated memory for each modality.

```properties
gbds.fingerprint.memory-storage.pre-aloc
gbds.palmprint.memory-storage.pre-aloc
gbds.newborn-palmprint.memory-storage.pre-aloc
gbds.ul-fingerprint.memory-storage.pre-aloc
gbds.ul-palmprint.memory-storage.pre-aloc
```

The default value for each configuration is `0`. The system understands Kilobytes (`k`, `kb`), Megabytes (`m`, `mb`) and Gigabytes (`g`, `gb`), case-insensitively. The value is divided equally among all the node's matchers.

{% hint style="info" %}
Face and iris cannot be pre-allocated.
{% endhint %}

### Match Microservices

This section presents the configuration parameters related to match microservices.

The microservices configuration is unique for each cluster node.

#### gbds.match.service.enabled

Defines whether the match microservice is enabled.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

#### gbds.match.service.initialPort

Defines the starting port to launch match services on the node.

**Default Value:**

> `32000`

#### gbds.match.service.logLevel

Defines the log level of the match service in GBDS. The different log levels are:

* `NONE`: Does not produce logs about the service
* `INFO`: Logs scripts and request URLs
* `TIME`: Logs scripts, request URLs and execution time
* `DEBUG`: Logs all service information

**Default Value:**

> `NONE`

**Possible Values**

> `INFO`

> `TIME`

> `DEBUG`

#### gbds.match.service.timeout

Defines the maximum timeout for requests to the match microservice, in milliseconds.

**Default Value:**

> `10000`

#### gbds.match.service.templateSend.parallelByModality

Enables parallel processing by biometric modality in GBDS.

**Default Value:**

> `true`

**Possible Values:**

> * `true`
> * `false`

#### gbds.match.service.linkLibSegfault

This parameter enables segmentation fault tracing in the match microservice.

**Default Value:**

> `false`

**Possible Values:**

> * `true`
> * `false`

#### gbds.match.service.maxTries

When a match microservice has a connection error, it tries 3 times before failing the transaction, waiting 2s between attempts.

**Default Value:**

> `3`

#### gbds.match.service.maxConnectionErrors

When a match microservice has 5 consecutive transactions with connection errors, GBDS stops to prevent failures in all transactions from that point.

**Default Value:**

> `5`

#### gbds.match.service.checkTimeoutSecs

Timeout (in seconds) to check if the match microservice has been created.

**Default Value:**

> `10`
