File: ReplicatedMapEntry.java

package info (click to toggle)
tomcat10 10.1.52-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 47,900 kB
  • sloc: java: 375,756; xml: 59,410; jsp: 4,741; sh: 1,381; perl: 324; makefile: 25; ansic: 14
file content (144 lines) | stat: -rw-r--r-- 4,092 bytes parent folder | download | duplicates (11)
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.catalina.tribes.tipis;

import java.io.IOException;
import java.io.Serializable;

/**
 * For smarter replication, an object can implement this interface to replicate diffs<br>
 * The replication logic will call the methods in the following order:<br>
 * <code>
 * 1. if ( entry.isDirty() ) <br>
 *      try {
 * 2.     entry.lock();<br>
 * 3.     byte[] diff = entry.getDiff();<br>
 * 4.     entry.reset();<br>
 *      } finally {<br>
 * 5.     entry.unlock();<br>
 *      }<br>
 *    }<br>
 * </code> <br>
 * <br>
 * When the data is deserialized the logic is called in the following order<br>
 * <code>
 * 1. ReplicatedMapEntry entry = (ReplicatedMapEntry)objectIn.readObject();<br>
 * 2. if ( isBackup(entry)||isPrimary(entry) ) entry.setOwner(owner); <br>
 * </code>
 */
public interface ReplicatedMapEntry extends Serializable {

    /**
     * Has the object changed since last replication and is not in a locked state
     *
     * @return boolean
     */
    boolean isDirty();

    /**
     * If this returns true, the map will extract the diff using getDiff() Otherwise it will serialize the entire
     * object.
     *
     * @return boolean
     */
    boolean isDiffable();

    /**
     * Returns a diff and sets the dirty map to false
     *
     * @return Serialized diff data
     *
     * @throws IOException IO error serializing
     */
    byte[] getDiff() throws IOException;


    /**
     * Applies a diff to an existing object.
     *
     * @param diff   Serialized diff data
     * @param offset Array offset
     * @param length Array length
     *
     * @throws IOException            IO error deserializing
     * @throws ClassNotFoundException Serialization error
     */
    void applyDiff(byte[] diff, int offset, int length) throws IOException, ClassNotFoundException;

    /**
     * Resets the current diff state and resets the dirty flag
     */
    void resetDiff();

    /**
     * Lock during serialization
     */
    void lock();

    /**
     * Unlock after serialization
     */
    void unlock();

    /**
     * This method is called after the object has been created on a remote map. On this method, the object can
     * initialize itself for any data that wasn't
     *
     * @param owner Object
     */
    void setOwner(Object owner);

    /**
     * For accuracy checking, a serialized attribute can contain a version number This number increases as modifications
     * are made to the data. The replicated map can use this to ensure accuracy on a periodic basis
     *
     * @return long - the version number or -1 if the data is not versioned
     */
    long getVersion();

    /**
     * Forces a certain version to a replicated map entry<br>
     *
     * @param version long
     */
    void setVersion(long version);

    /**
     * @return the last replicate time.
     */
    long getLastTimeReplicated();

    /**
     * Set the last replicate time.
     *
     * @param lastTimeReplicated New timestamp
     */
    void setLastTimeReplicated(long lastTimeReplicated);

    /**
     * If this returns true, to replicate that an object has been accessed
     *
     * @return boolean
     */
    boolean isAccessReplicate();

    /**
     * Access to an existing object.
     */
    void accessEntry();

}