Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/test/java/rmi/activation/Activatable/shutdownGracefully/ShutdownGracefully.java
38829 views
1
/*
2
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*/
23
24
/* @test
25
* @bug 4183169
26
* @summary Minor problem with the way ReliableLog handles IOExceptions.
27
*
28
* @author Laird Dornin; code borrowed from Ann Wollrath
29
*
30
* @library ../../../testlibrary
31
* @build TestLibrary RMID
32
* TestSecurityManager RegisteringActivatable ShutdownGracefully_Stub
33
* @run main/othervm/policy=security.policy/timeout=700 ShutdownGracefully
34
*/
35
36
import java.rmi.activation.*;
37
import java.rmi.*;
38
import java.util.Properties;
39
40
/**
41
* The test creates an rmid with a special security manager. After
42
* rmid makes two registrations (which is greater than rmid's
43
* snapshotInterval) the security manager stops allowing rmid to write
44
* to update and snapshot log files in rmid's log directory. The Test
45
* registers an Activatable object twice with different group ids.
46
* The second registration will cause rmid to have to write to a
47
* LogFile (it causes a snapshot) and the security manager will not
48
* allow the file write to happen. The test makes sure that rmid
49
* shuts down in a graceful manner without any explicit request to do
50
* so. The test will not exit for 400 seconds if rmid does not exit
51
* (after that time, the test will fail).
52
*/
53
public class ShutdownGracefully
54
extends Activatable implements Runnable, RegisteringActivatable
55
{
56
private static RegisteringActivatable registering = null;
57
58
private final static long SHUTDOWN_TIMEOUT = 400 * 1000;
59
60
public static void main(String args[]) {
61
62
RMID rmid = null;
63
64
System.err.println("\nRegression test for bug/rfe 4183169\n");
65
66
try {
67
TestLibrary.suggestSecurityManager(
68
"java.rmi.RMISecurityManager");
69
70
// start an rmid.
71
RMID.removeLog();
72
rmid = RMID.createRMID();
73
74
// rmid needs to run with a security manager that
75
// simulates a log problem; rmid should also snapshot
76
// quickly.
77
rmid.addOptions(new String[] {
78
"-Djava.security.manager=TestSecurityManager",
79
"-Dsun.rmi.activation.snapshotInterval=1"});
80
81
// rmid.addArguments(new String[] {
82
// "-C-Djava.rmi.server.logCalls=true"});
83
84
rmid.start();
85
86
// Ensure that activation groups run with the correct
87
// security manager.
88
//
89
Properties p = new Properties();
90
p.put("java.security.policy",
91
TestParams.defaultGroupPolicy);
92
p.put("java.security.manager",
93
"java.lang.SecurityManager");
94
95
System.err.println("activation group will be created " +
96
"in a new VM");
97
ActivationGroupDesc groupDesc =
98
new ActivationGroupDesc(p, null);
99
ActivationSystem system = ActivationGroup.getSystem();
100
ActivationGroupID groupID = system.registerGroup(groupDesc);
101
102
System.err.println("registering activatable");
103
ActivationDesc desc = new ActivationDesc
104
(groupID, "ShutdownGracefully", null, null);
105
registering = (RegisteringActivatable)
106
Activatable.register(desc);
107
108
System.err.println("activate and deactivate object " +
109
"via method call");
110
registering.shutdown();
111
112
/*
113
* the security manager rmid is running with will stop
114
* rmid from writing to its log files; in 1.2.x this would
115
* have caused rmid to have thrown a runtime exception and
116
* continue running in an unstable state. With the fix
117
* for 4183169, rmid should shutdown gracefully instead.
118
*/
119
120
/*
121
* register another activatable with a new group id; rmid
122
* should not recover from this... I use two
123
* registrations to more closely simulate the environment
124
* in which the bug was found. In java versions with out
125
* the appropriate bug fix, rmid would hide a
126
* NullPointerException in this circumstance.
127
*/
128
p.put("dummyname", "dummyvalue");
129
groupDesc = new ActivationGroupDesc(p, null);
130
ActivationGroupID secondGroupID =
131
system.registerGroup(groupDesc);
132
desc = new ActivationDesc(secondGroupID,
133
"ShutdownGracefully", null, null);
134
135
try {
136
registering = (RegisteringActivatable)
137
Activatable.register(desc);
138
139
System.err.println("second activate and deactivate " +
140
"object via method call");
141
} catch (ActivationException e) {
142
System.err.println("received exception from registration " +
143
"call that should have failed...");
144
}
145
146
/*
147
* no longer needed because the security manager
148
* throws an exception during snapshot
149
*/
150
/*
151
try {
152
registering.shutdown();
153
154
System.err.println("received exception from remote " +
155
"call that should have failed...");
156
} catch (RemoteException e) {
157
}
158
*/
159
160
} catch (Exception e) {
161
TestLibrary.bomb("\nfailure: unexpected exception ", e);
162
} finally {
163
try {
164
Thread.sleep(4000);
165
} catch (InterruptedException e) {
166
}
167
168
registering = null;
169
170
// Need to make sure that rmid goes away by itself
171
JavaVM rmidProcess = rmid;
172
if (rmidProcess != null) {
173
try {
174
Runnable waitThread =
175
new ShutdownDetectThread(rmidProcess);
176
177
synchronized (waitThread) {
178
(new Thread(waitThread)).start();
179
waitThread.wait(SHUTDOWN_TIMEOUT);
180
System.err.println("rmid has shutdown");
181
182
if (!rmidDone) {
183
// ensure that this rmid does not infect
184
// other tests.
185
rmidProcess.destroy();
186
TestLibrary.bomb("rmid did not shutdown " +
187
"gracefully in time");
188
}
189
}
190
} catch (Exception e) {
191
TestLibrary.bomb("exception waiting for rmid " +
192
"to shut down");
193
}
194
}
195
// else rmid should be down
196
}
197
198
System.err.println
199
("\nsuccess: ShutdownGracefully test passed ");
200
}
201
202
private static boolean rmidDone = false;
203
204
/**
205
* class that waits for rmid to exit
206
*/
207
private static class ShutdownDetectThread implements Runnable {
208
private JavaVM rmidProcess = null;
209
210
ShutdownDetectThread(JavaVM rmidProcess) {
211
this.rmidProcess = rmidProcess;
212
}
213
public void run() {
214
System.err.println("waiting for rmid to shutdown");
215
216
try {
217
rmidProcess.waitFor();
218
} catch (InterruptedException e) {
219
// should not happen
220
}
221
222
synchronized (this) {
223
// notify parent thread when rmid has exited
224
this.notify();
225
rmidDone = true;
226
}
227
228
RMID.removeLog();
229
}
230
}
231
232
/**
233
* implementation of RegisteringActivatable
234
*/
235
public ShutdownGracefully
236
(ActivationID id, MarshalledObject mo) throws RemoteException
237
{
238
// register/export anonymously
239
super(id, 0);
240
}
241
242
/**
243
* Spawns a thread to deactivate the object.
244
*/
245
public void shutdown() throws Exception {
246
(new Thread(this, "ShutdownGracefully")).start();
247
}
248
249
/**
250
* Thread to deactivate object. First attempts to make object
251
* inactive (via the inactive method). If that fails (the
252
* object may still have pending/executing calls), then
253
* unexport the object forcibly.
254
*/
255
public void run() {
256
try {
257
Thread.sleep(50 * 1000);
258
} catch (InterruptedException e) {
259
}
260
ActivationLibrary.deactivate(this, getID());
261
}
262
}
263
264