aboutsummaryrefslogtreecommitdiffstats
path: root/messagebus/src/main/java/com/yahoo/messagebus/network/Network.java
blob: 168d776104c8239deccfa1ee6db368ae523bd1fd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.messagebus.network;

import com.yahoo.jrt.slobrok.api.IMirror;
import com.yahoo.messagebus.Message;
import com.yahoo.messagebus.routing.RoutingNode;

import java.util.List;

/**
 * This interface separates the low-level network implementation from the rest of messagebus. The methods defined in
 * this interface are intended to be invoked by MessageBus and not by the application.
 *
 * @author havardpe
 */
public interface Network {

    /**
     * Waits for at most the given number of seconds for all dependencies to become ready.
     *
     * @param seconds the timeout
     * @return true if ready
     */
    boolean waitUntilReady(double seconds);

    /**
     * Attach the network layer to the given owner.
     *
     * @param owner owner of the network
     */
    void attach(NetworkOwner owner);

    /**
     * Register a session name with the network layer. This will make the session visible to other nodes.
     *
     * @param session the session name
     */
    void registerSession(String session);

    /**
     * Unregister a session name with the network layer. This will make the session unavailable for other nodes.
     *
     * @param session session name
     */
    void unregisterSession(String session);

    /**
     * Resolves the service address of the recipient referenced by the given routing node. If a recipient can not be
     * resolved, this method tags the node with an error. If this method succeeds, you need to invoke {@link
     * #freeServiceAddress(RoutingNode)} once you are done with the service address.
     *
     * @param recipient the node whose service address to allocate
     * @return true if a service address was allocated
     */
    boolean allocServiceAddress(RoutingNode recipient);

    /**
     * Frees the service address from the given routing node. This allows the network layer to track and close
     * connections as required.
     *
     * @param recipient the node whose service address to free
     */
    void freeServiceAddress(RoutingNode recipient);

    /**
     * Send a message to the given recipients. A {@link RoutingNode} contains all the necessary context for sending.
     *
     * @param msg        the message to send
     * @param recipients a list of routing leaf nodes resolved for the message
     */
    void send(Message msg, List<RoutingNode> recipients);

    /**
     * Synchronize with internal threads. This method will handshake with all internal threads. This has the implicit
     * effect of waiting for all active callbacks. Note that this method should never be invoked from a callback since
     * that would make the thread wait for itself... forever. This method is typically used to untangle during session
     * shutdown.
     */
    void sync();

    /** Shuts down the network. This is a blocking call that waits for all scheduled tasks to complete. */
    void shutdown();

    /**
     * Returns a string that represents the connection specs of this network.
     * It is in not a complete address since it know nothing of the sessions that run on it.
     */
    String getConnectionSpec();

    /** Returns a reference to a name server mirror. */
    IMirror getMirror();

}