blob: 39736d7a0e9396c22c9036b4eca4fc79263cd1d4 [file] [log] [blame]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001= Gerrit Inspector
Marcin Cieślaked612fb2012-04-17 16:24:34 +00002
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08003== NAME
Marcin Cieślaked612fb2012-04-17 16:24:34 +00004Gerrit Inspector - Interactive Jython environment for Gerrit
5
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08006== SYNOPSIS
Michael Ochmanna8434612016-07-08 10:58:27 +02007[verse]
Yuxuan 'fishy' Wangd85b6872013-11-15 11:47:46 -08008--
Michael Ochmanna8434612016-07-08 10:58:27 +02009_java_ -jar gerrit.war _daemon_
10 -d <SITE_PATH>
11 [--enable-httpd | --disable-httpd]
12 [--enable-sshd | --disable-sshd]
13 [--console-log]
Han-Wen Nienhuys348a6032019-09-24 19:44:57 +020014 [--replica]
Michael Ochmanna8434612016-07-08 10:58:27 +020015 -s
Yuxuan 'fishy' Wangd85b6872013-11-15 11:47:46 -080016--
Marcin Cieślaked612fb2012-04-17 16:24:34 +000017
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080018== DESCRIPTION
Marcin Cieślaked612fb2012-04-17 16:24:34 +000019Runs the Gerrit network daemon on the local system as described
20in the link:pgm-daemon.html[Daemon documentation], additionally
21starting an interactive Jython shell for inspection
22and troubleshooting of live data of the Gerrit instance.
23
24CAUTION: Gerrit Inspector works directly on instances of Java Virtual
25Machine objects and it is possible to read and write instance
26members as well as invoke Java functions. Access is granted
27also to 'private' and 'protected' members. Therefore it is possible
28to introduce changes to the internal state of the system in
29an inconsistent way. Care must be taken not to break the running system
30and/or destroy the data.
31
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080032== INSTALLATION
Marcin Cieślaked612fb2012-04-17 16:24:34 +000033
34Gerrit Inspector requires Jython library ('jython.jar') to be installed
35in the '$site_path/lib' directory. Jython, a Python interpreter for
36the Java Virtual Machine, can be obtained from the http://www.jython.org/
37website. Only 'jython.jar' file is needed, installation of Jython libraries
38is optional. Gerrit Inspector has been tested with Jython 2.5.2 but
39might work an earlier version.
40
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080041== STARTUP
Marcin Cieślaked612fb2012-04-17 16:24:34 +000042
43During startup Jython examines Java libraries found on the classpath.
44While libraries are inspected a large amount of messages is displayed on the console:
45
46----
47*sys-package-mgr*: processing new jar, '/home/user/.gerritcodereview/tmp/gerrit_4890671371398741854_app/sshd-core-0.5.1-r1095809.jar'
48----
49
50After this a system-wide embedded initialization script is started. This script
51is contained in the gerrit's WAR archive. This script produces output similar to
52the following on the console:
53
54----
55"Shell" is "com.google.gerrit.pgm.shell.JythonShell@61644f2d"
56"m" is "com.google.gerrit.lifecycle.LifecycleManager@6f03b248"
Marcin Cieślaked612fb2012-04-17 16:24:34 +000057
58Welcome to the Gerrit Inspector
59Enter help() to see the above again, EOF to quit and stop Gerrit
60----
61
62Then an optional user startup script is processed. It should be
63located in the gerrit user home directory as '.gerritcodereview/Startup.py'.
64
65This script can access all variables defined in the system (such
66as the ones displayed by the initialization script as shown above).
67Variables and functions defined by the startup scripts are available for
68the interactive interpreter.
69
70When interactive interpreter exits (by issuing EOF on the command line),
71a whole Gerrit instance is shut down gracefully.
72
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080073== USING THE INTERPRETER
Marcin Cieślaked612fb2012-04-17 16:24:34 +000074
75Gerrit Inspector launches Jython interpreter in the context of the Gerrit
76Java Virtual Machine. All core facilities of the Jython (and Python)
77language are available to the user.
78
79Additional facilities can be provided, for example a 'Lib' directory from the
80Jython distribution can be installed under '$site_path/lib/Lib' to provide
81access to many standard Python modules. Jython can also use additional Java
82classes and libraries and most of the Python modules and scripts.
83
84The Inspector has by default access to classes and object instances available
85in the Java Virtual Machine. Objects are introspected and *private* and *protected*
86members are also available.
87
88For more information on using Jython, especially with regards to its limitations
89in interfacing to the Java Virtual Machine, please refer to the
90http://www.jython.org/[Jython documentation].
91
David Pursehouse659860f2013-12-16 14:50:04 +090092After successful initialization it is possible to examine components of
Marcin Cieślaked612fb2012-04-17 16:24:34 +000093Java packages, classes and live instances.
94
95----
96>>> import com.google.inject
97>>> dir(com.google.inject)
98['AbstractModule', 'Binder', 'Binding', 'BindingAnnotation', 'ConfigurationException', 'CreationException', 'Exposed', 'Guice', 'ImplementedBy', 'Inject', 'Injector', 'Key', 'MembersInjector', 'Module', 'OutOfScopeException', 'PrivateBinder', 'PrivateModule', 'ProvidedBy', 'Provider', 'Provides', 'ProvisionException', 'Scope', 'ScopeAnnotation', 'Scopes', 'Singleton', 'Stage', 'TypeLiteral', '__name__', 'assistedinject', 'binder', 'internal', 'matcher', 'name', 'servlet', 'spi', 'util']
99>>> type(com.google.inject)
100<type 'javapackage'>
101>>> dir(com.google.inject.Guice)
102['__class__', '__copy__', '__deepcopy__', '__delattr__', '__doc__',
103'__eq__', '__getattribute__', '__hash__', '__init__', '__ne__',
104'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
105'__str__', '__unicode__', 'class', 'clone', 'createInjector',
106'equals', 'finalize', 'getClass', 'hashCode', 'notify', 'notifyAll',
107'registerNatives', 'toString', 'wait']
108----
109
Marcin Cieślaked612fb2012-04-17 16:24:34 +0000110A built-in *help()* function provides values of global variables
111defined in the interpreter:
112
113----
114>>> help()
Marcin Cieślaked612fb2012-04-17 16:24:34 +0000115"m" is "com.google.gerrit.lifecycle.LifecycleManager@6f03b248"
Marcin Cieślaked612fb2012-04-17 16:24:34 +0000116"Shell" is "com.google.gerrit.pgm.shell.JythonShell@61644f2d"
David Ostrovsky947a80f2013-11-06 22:13:11 +0100117"d" is "com.google.gerrit.pgm.Daemon@28a3f689"
Marcin Cieślaked612fb2012-04-17 16:24:34 +0000118
119Welcome to the Gerrit Inspector
120Enter help() to see the above again, EOF to quit and stop Gerrit
121----
122
123Java and Python exceptions are intercepted by the Inspector:
124----
125>>> import java.lang.RuntimeException
126>>> raise java.lang.RuntimeException("Exiting")
127Traceback (most recent call last):
128 File "<stdin>", line 1, in <module>
129 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
130 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
131 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
132 at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
133 at org.python.core.PyReflectedConstructor.constructProxy(PyReflectedConstructor.java:210)
134
135java.lang.RuntimeException: java.lang.RuntimeException: Exiting
136>>>
137----
138
139To exit the interpreter, use EOF character (Ctrl-D on Unix systems, Ctrl-Z on Windows).
140
141It is also possible to shut down the JVM by using *System.exit()*
142
143----
144>>> import java.lang.System
145>>> java.lang.System.exit(1)
146----
147
148And Gerrit should shut down all its subsystems and exit:
149
150----
151[2012-04-17 15:31:08,458] INFO com.google.gerrit.pgm.Daemon : caught shutdown, cleaning up
152----
153
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800154== TROUBLESHOOTING
Marcin Cieślaked612fb2012-04-17 16:24:34 +0000155
156Gerrit Inspector is logging to the Gerrit error log.
157
158A successful startup is indicated in the logfile:
159
160----
161 [2012-04-17 13:43:44,888] INFO com.google.gerrit.pgm.shell.JythonShell : Jython shell instance created.
162----
163
164If 'jython.jar' library is not available, Gerrit refuses to start when given *-s* option:
165
166----
167[2012-04-17 13:57:29,611] ERROR com.google.gerrit.pgm.Daemon : Unable to start daemon
168com.google.inject.ProvisionException: Guice provision errors:
169
1701) Error injecting constructor, java.lang.UnsupportedOperationException: Cannot create Jython shell: Class org.python.util.InteractiveConsole not found
171 (You might need to install jython.jar in the lib directory)
172 at com.google.gerrit.pgm.shell.JythonShell.<init>(JythonShell.java:47)
173 while locating com.google.gerrit.pgm.shell.JythonShell
174 while locating com.google.gerrit.pgm.shell.InteractiveShell
175----
176
177Errors during processing of the startup script, 'Startup.py', are logged
178to the error log:
179
180----
181[2012-04-17 14:20:30,558] INFO com.google.gerrit.pgm.shell.JythonShell : Jython shell instance created.
David Pursehouse1ff91c02015-05-19 15:05:26 +0900182[2012-04-17 14:20:38,005] ERROR com.google.gerrit.pgm.shell.JythonShell : Exception occurred while loading file Startup.py :
Marcin Cieślaked612fb2012-04-17 16:24:34 +0000183java.lang.reflect.InvocationTargetException
184 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
185 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
186 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
187 at java.lang.reflect.Method.invoke(Method.java:616)
188 at com.google.gerrit.pgm.shell.JythonShell.runMethod0(JythonShell.java:112)
189 at com.google.gerrit.pgm.shell.JythonShell.execFile(JythonShell.java:194)
190 at com.google.gerrit.pgm.shell.JythonShell.reload(JythonShell.java:178)
191 at com.google.gerrit.pgm.shell.JythonShell.run(JythonShell.java:152)
192 at com.google.gerrit.pgm.Daemon.run(Daemon.java:190)
193 at com.google.gerrit.pgm.util.AbstractProgram.main(AbstractProgram.java:67)
194 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
195 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
196 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
197 at java.lang.reflect.Method.invoke(Method.java:616)
198 at com.google.gerrit.launcher.GerritLauncher.invokeProgram(GerritLauncher.java:167)
199 at com.google.gerrit.launcher.GerritLauncher.mainImpl(GerritLauncher.java:91)
200 at com.google.gerrit.launcher.GerritLauncher.main(GerritLauncher.java:49)
201 at Main.main(Main.java:25)
202Caused by: Traceback (most recent call last):
203 File "/home/user/.gerritcodereview/Startup.py", line 1, in <module>
204 Test
205NameError: name 'Test' is not defined
206----
207
208Those errors are non-fatal. System and user scripts can be loaded again
209by issuing the following command in the Gerrit Inspector console:
210
211----
212Shell.reload()
213----
214
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800215== LOGGING
Marcin Cieślaked612fb2012-04-17 16:24:34 +0000216Error and warning messages from the server are automatically written
217to the log file under '$site_path/logs/error_log'.
218
219Output and error messages (including Java and Python exceptions)
220resulting from interactive work are logged to the console.
221
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800222== KNOWN ISSUES
Marcin Cieślaked612fb2012-04-17 16:24:34 +0000223The Inspector does not yet recognize Google Guice bindings.
224
Michael Ochmann8129ece2016-07-08 11:25:25 +0200225[IMPORTANT]
226Using the Inspector may void your warranty.
Marcin Cieślaked612fb2012-04-17 16:24:34 +0000227
228GERRIT
229------
230Part of link:index.html[Gerrit Code Review]
Yuxuan 'fishy' Wang99cb68d2013-10-31 17:26:00 -0700231
232SEARCHBOX
233---------