protected byte[] serializeTopicStatus(TopicStatus status) {
        if (status == null) {
            // This should send a tombstone record that will represent delete
            return null;
        }
        Struct struct = new Struct(TOPIC_STATUS_VALUE_SCHEMA_V0);
        struct.put(TOPIC_NAME_KEY, status.topic());
        struct.put(TOPIC_CONNECTOR_KEY, status.connector());
        struct.put(TOPIC_TASK_KEY, status.task());
        struct.put(TOPIC_DISCOVER_TIMESTAMP_KEY, status.discoverTimestamp());
        return converter.fromConnectData(
                statusTopic,
                TOPIC_STATUS_SCHEMA_V0,
                Collections.singletonMap(TOPIC_STATE_KEY, struct));
    }
StatusBackingStore implementation which uses a compacted topic for storage
of connector and task status information. When a state change is observed,
the new state is written to the compacted topic. The new state will not be
visible until it has been read back from the topic.
<p>
In spite of their names, the {@link #putSafe} methods cannot guarantee the safety
of the write (since Kafka itself cannot provide such guarantees currently),
but it can avoid specific unsafe conditions. In particular, {@link #putSafe}
allows writes in the following conditions:
<ol>
  <li>It is (probably) safe to overwrite the state if there is no previous
  value.
  <li>It is (probably) safe to overwrite the state if the previous value was
  set by a worker with the same workerId.
  <li>It is (probably) safe to overwrite the previous state if the current
  generation is higher than the previous .
</ol>
Basically all these conditions do is reduce the window for conflicts. They
obviously cannot take into account in-flight requests.
connect/runtime/src/main/java/org/apache/kafka/connect/storage/KafkaStatusBackingStore.java