@@ -56,15 +56,6 @@ public class ArchiveManifest implements Callable<Boolean> {
5656
5757 private static final int CPUS = Runtime .getRuntime ().availableProcessors ();
5858
59- private static final ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor (
60- CPUS , 16 * CPUS , 1 , TimeUnit .MINUTES ,
61- new ArrayBlockingQueue <>(CPUS , true ), Executors .defaultThreadFactory (),
62- new ThreadPoolExecutor .CallerRunsPolicy ());
63-
64- static {
65- EXECUTOR .allowCoreThreadTimeOut (true );
66- }
67-
6859 public ArchiveManifest (String src , String name , int maxManifestSize , int maxBatchSize ) {
6960 this .name = name ;
7061 this .srcDbPath = Paths .get (src , name );
@@ -96,20 +87,27 @@ public static org.iq80.leveldb.Options newDefaultLevelDbOptions() {
9687 }
9788
9889 public static void main (String [] args ) {
90+ int code = run (args );
91+ logger .info ("exit code {}." , code );
92+ System .out .printf ("exit code %d.\n " , code );
93+ System .exit (code );
94+ }
95+
96+ public static int run (String [] args ) {
9997 Args parameters = new Args ();
10098 JCommander jc = JCommander .newBuilder ()
10199 .addObject (parameters )
102100 .build ();
103101 jc .parse (args );
104102 if (parameters .help ) {
105103 jc .usage ();
106- return ;
104+ return 0 ;
107105 }
108106
109107 File dbDirectory = new File (parameters .databaseDirectory );
110108 if (!dbDirectory .exists ()) {
111109 logger .info ("Directory {} does not exist." , parameters .databaseDirectory );
112- return ;
110+ return 404 ;
113111 }
114112
115113 List <File > files = Arrays .stream (Objects .requireNonNull (dbDirectory .listFiles ()))
@@ -118,12 +116,19 @@ public static void main(String[] args) {
118116
119117 if (files .isEmpty ()) {
120118 logger .info ("Directory {} does not contain any database." , parameters .databaseDirectory );
121- return ;
119+ return 0 ;
122120 }
123121 final long time = System .currentTimeMillis ();
124122 final List <Future <Boolean >> res = new ArrayList <>();
123+ final ThreadPoolExecutor executor = new ThreadPoolExecutor (
124+ CPUS , 16 * CPUS , 1 , TimeUnit .MINUTES ,
125+ new ArrayBlockingQueue <>(CPUS , true ), Executors .defaultThreadFactory (),
126+ new ThreadPoolExecutor .CallerRunsPolicy ());
127+
128+ executor .allowCoreThreadTimeOut (true );
129+
125130 files .forEach (f -> res .add (
126- EXECUTOR .submit (new ArchiveManifest (parameters .databaseDirectory , f .getName (),
131+ executor .submit (new ArchiveManifest (parameters .databaseDirectory , f .getName (),
127132 parameters .maxManifestSize , parameters .maxBatchSize ))));
128133 int fails = res .size ();
129134
@@ -140,15 +145,15 @@ public static void main(String[] args) {
140145 }
141146 }
142147
143- EXECUTOR .shutdown ();
148+ executor .shutdown ();
144149 logger .info ("DatabaseDirectory:{}, maxManifestSize:{}, maxBatchSize:{},"
145150 + "database reopen use {} seconds total." ,
146151 parameters .databaseDirectory , parameters .maxManifestSize , parameters .maxBatchSize ,
147152 (System .currentTimeMillis () - time ) / 1000 );
148153 if (fails > 0 ) {
149154 logger .error ("Failed!!!!!!!!!!!!!!!!!!!!!!!! size:{}" , fails );
150155 }
151- System . exit ( fails ) ;
156+ return fails ;
152157 }
153158
154159 public void open () throws IOException {
0 commit comments