88import com .github .rishabh9 .kumoru .snapshots .parser .MetadataAsyncXmlParser ;
99import com .github .rishabh9 .kumoru .snapshots .parser .SnapshotMetadata ;
1010import io .vertx .core .AbstractVerticle ;
11+ import io .vertx .core .CompositeFuture ;
12+ import io .vertx .core .Future ;
1113import io .vertx .core .Promise ;
1214import io .vertx .core .buffer .Buffer ;
1315import io .vertx .core .eventbus .DeliveryOptions ;
2224import java .util .List ;
2325import java .util .Optional ;
2426import java .util .concurrent .TimeUnit ;
27+ import java .util .stream .Collectors ;
2528import javax .xml .stream .XMLStreamException ;
2629import lombok .extern .log4j .Log4j2 ;
2730
@@ -38,10 +41,10 @@ public void start(final Promise<Void> startPromise) {
3841 log .debug ("Starting snapshot updater" );
3942 webClient = KumoruCommon .createWebClient (vertx );
4043 vertx .eventBus ().registerDefaultCodec (UpdateMessage .class , new UpdateMessageCodec ());
41- final int interval = 12 ;
44+ final int interval = 60 ;
4245 timerId =
4346 vertx .setPeriodic (
44- TimeUnit .HOURS .toMillis (interval ),
47+ TimeUnit .SECONDS .toMillis (interval ),
4548 id -> {
4649 final ZonedDateTime now = ZonedDateTime .now ();
4750 log .debug ("Snapshot update checker started..." );
@@ -110,7 +113,15 @@ private void nextMirror(final Iterator<String> iterator, final String fileOrDire
110113 final String metadataXmlFileSystemPath = fileOrDirectory + METADATA_XML ;
111114 if (isSnapshotUpdated (downloadedFile , metadataXmlFileSystemPath )) {
112115 log .debug ("New snapshot available from {}" , uri );
113- updateSnapshot (metadataXmlFileSystemPath , snapshotPath , mirror , result .body ());
116+ deleteOldSnapshots (fileOrDirectory )
117+ .onComplete (
118+ asyncResult ->
119+ // Update after attempting to delete is complete
120+ updateSnapshot (
121+ metadataXmlFileSystemPath ,
122+ snapshotPath ,
123+ mirror ,
124+ result .body ()));
114125 }
115126 } else {
116127 log .debug ("Unable to retrieve metadata from {}" , uri , asyncWebResult .cause ());
@@ -120,6 +131,49 @@ private void nextMirror(final Iterator<String> iterator, final String fileOrDire
120131 }
121132 }
122133
134+ private Future <Void > deleteOldSnapshots (final String directory ) {
135+ log .debug ("Deleting old snapshots from {}" , directory );
136+ final Promise <Void > promise = Promise .promise ();
137+ vertx
138+ .fileSystem ()
139+ .readDir (
140+ directory ,
141+ readResult -> {
142+ if (readResult .succeeded ()) {
143+ CompositeFuture .all (
144+ readResult .result ().stream ().map (this ::delete ).collect (Collectors .toList ()))
145+ .onSuccess (success -> promise .complete ())
146+ .onFailure (
147+ failure -> {
148+ log .error ("Error deleting all files" , failure .getCause ());
149+ promise .fail (failure .getCause ());
150+ });
151+ } else {
152+ log .error ("Error listing files" , readResult .cause ());
153+ promise .fail (readResult .cause ());
154+ }
155+ });
156+ return promise .future ();
157+ }
158+
159+ private Future <Void > delete (final String fileOrDirectory ) {
160+ log .debug ("Deleting {}" , fileOrDirectory );
161+ final Promise <Void > promise = Promise .promise ();
162+ vertx
163+ .fileSystem ()
164+ .deleteRecursive (
165+ fileOrDirectory ,
166+ true ,
167+ deleteResult -> {
168+ if (deleteResult .failed ()) {
169+ log .error ("Unable to delete {}" , fileOrDirectory , deleteResult .cause ());
170+ promise .fail (deleteResult .cause ());
171+ }
172+ promise .complete ();
173+ });
174+ return promise .future ();
175+ }
176+
123177 private void updateSnapshot (
124178 final String metadataXmlFileSystemPath ,
125179 final String snapshotPath ,
0 commit comments