Improve segmented journal actor metrics
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / DefaultShardDataTreeChangeListenerPublisher.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.cluster.datastore;
9
10 import java.util.List;
11 import java.util.Optional;
12 import java.util.function.Consumer;
13 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener;
14 import org.opendaylight.mdsal.dom.spi.store.AbstractDOMStoreTreeChangePublisher;
15 import org.opendaylight.yangtools.concepts.Registration;
16 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
17 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
20
21 /**
22  * Default implementation of ShardDataTreeChangeListenerPublisher that directly generates and publishes
23  * notifications for DataTreeChangeListeners. This class is NOT thread-safe.
24  *
25  * @author Thomas Pantelis
26  */
27 final class DefaultShardDataTreeChangeListenerPublisher extends AbstractDOMStoreTreeChangePublisher
28         implements ShardDataTreeChangeListenerPublisher {
29     private static final Logger LOG = LoggerFactory.getLogger(DefaultShardDataTreeChangeListenerPublisher.class);
30     private String logContext;
31
32     DefaultShardDataTreeChangeListenerPublisher(final String logContext) {
33         this.logContext = logContext;
34     }
35
36     @Override
37     public void publishChanges(final DataTreeCandidate candidate) {
38         if (LOG.isTraceEnabled()) {
39             LOG.trace("{}: publishChanges: {}", logContext, candidate);
40         } else {
41             LOG.debug("{}: publishChanges: rootPath: {}", logContext, candidate.getRootPath());
42         }
43
44         processCandidateTree(candidate);
45     }
46
47     @Override
48     protected void notifyListener(final Reg registration, final List<DataTreeCandidate> changes) {
49         final var listener = registration.listener();
50         LOG.debug("{}: notifyListener: listener: {}", logContext, listener);
51         listener.onDataTreeChanged(changes);
52     }
53
54     @Override
55     protected void registrationRemoved(final Reg registration) {
56         LOG.debug("Registration {} removed", registration);
57     }
58
59     @Override
60     public void registerTreeChangeListener(final YangInstanceIdentifier treeId,
61             final DOMDataTreeChangeListener listener, final Optional<DataTreeCandidate> initialState,
62             final Consumer<Registration> onRegistration) {
63         registerTreeChangeListener(treeId, listener, onRegistration);
64
65         if (initialState.isPresent()) {
66             notifySingleListener(treeId, listener, initialState.orElseThrow(), logContext);
67         } else {
68             listener.onInitialData();
69         }
70     }
71
72     void registerTreeChangeListener(final YangInstanceIdentifier treeId, final DOMDataTreeChangeListener listener,
73             final Consumer<Registration> onRegistration) {
74         LOG.debug("{}: registerTreeChangeListener: path: {}, listener: {}", logContext, treeId, listener);
75         onRegistration.accept(super.registerTreeChangeListener(treeId, listener));
76     }
77
78     static void notifySingleListener(final YangInstanceIdentifier treeId, final DOMDataTreeChangeListener listener,
79             final DataTreeCandidate state, final String logContext) {
80         LOG.debug("{}: notifySingleListener: path: {}, listener: {}", logContext, treeId, listener);
81         DefaultShardDataTreeChangeListenerPublisher publisher =
82                 new DefaultShardDataTreeChangeListenerPublisher(logContext);
83         publisher.logContext = logContext;
84         publisher.registerTreeChangeListener(treeId, listener);
85
86         if (!publisher.processCandidateTree(state)) {
87             listener.onInitialData();
88         }
89     }
90 }