35
35
import org .apache .logging .log4j .LogManager ;
36
36
import org .apache .logging .log4j .Logger ;
37
37
import org .opensearch .action .ActionListener ;
38
+ import org .opensearch .action .ActionResponse ;
38
39
import org .opensearch .cluster .ClusterChangedEvent ;
39
40
import org .opensearch .cluster .ClusterStateListener ;
40
41
import org .opensearch .cluster .RestoreInProgress ;
44
45
import org .opensearch .snapshots .RestoreInfo ;
45
46
import org .opensearch .snapshots .RestoreService ;
46
47
48
+ import java .util .function .Function ;
49
+
47
50
import static org .opensearch .snapshots .RestoreService .restoreInProgress ;
48
51
49
52
/**
50
53
* Transport listener for cluster state updates
51
54
*
52
55
* @opensearch.internal
53
56
*/
54
- public class RestoreClusterStateListener implements ClusterStateListener {
57
+ public class RestoreClusterStateListener < T extends ActionResponse > implements ClusterStateListener {
55
58
56
59
private static final Logger logger = LogManager .getLogger (RestoreClusterStateListener .class );
57
60
58
61
private final ClusterService clusterService ;
59
62
private final String uuid ;
60
- private final ActionListener <RestoreSnapshotResponse > listener ;
63
+ private final String restoreIdentifier ;
64
+ private final ActionListener <T > listener ;
65
+ private final Function <RestoreInfo , T > actionResponseFactory ;
61
66
62
67
private RestoreClusterStateListener (
63
68
ClusterService clusterService ,
64
69
RestoreService .RestoreCompletionResponse response ,
65
- ActionListener <RestoreSnapshotResponse > listener
70
+ ActionListener <T > listener ,
71
+ Function <RestoreInfo , T > actionResponseFactory
66
72
) {
67
73
this .clusterService = clusterService ;
68
74
this .uuid = response .getUuid ();
75
+ this .restoreIdentifier = response .getSnapshot () != null ? response .getSnapshot ().getSnapshotId ().getName () : "remote_store" ;
69
76
this .listener = listener ;
77
+ this .actionResponseFactory = actionResponseFactory ;
70
78
}
71
79
72
80
@ Override
@@ -78,35 +86,36 @@ public void clusterChanged(ClusterChangedEvent changedEvent) {
78
86
// on the current cluster-manager and as such it might miss some intermediary cluster states due to batching.
79
87
// Clean up listener in that case and acknowledge completion of restore operation to client.
80
88
clusterService .removeListener (this );
81
- listener .onResponse (new RestoreSnapshotResponse (( RestoreInfo ) null ));
89
+ listener .onResponse (actionResponseFactory . apply ( null ));
82
90
} else if (newEntry == null ) {
83
91
clusterService .removeListener (this );
84
92
ImmutableOpenMap <ShardId , RestoreInProgress .ShardRestoreStatus > shards = prevEntry .shards ();
85
- assert prevEntry .state ().completed () : "expected completed snapshot state but was " + prevEntry .state ();
93
+ assert prevEntry .state ().completed () : "expected completed snapshot/remote store restore state but was " + prevEntry .state ();
86
94
assert RestoreService .completed (shards ) : "expected all restore entries to be completed" ;
87
95
RestoreInfo ri = new RestoreInfo (
88
- prevEntry . snapshot (). getSnapshotId (). getName () ,
96
+ restoreIdentifier ,
89
97
prevEntry .indices (),
90
98
shards .size (),
91
99
shards .size () - RestoreService .failedShards (shards )
92
100
);
93
- RestoreSnapshotResponse response = new RestoreSnapshotResponse (ri );
94
- logger .debug ("restore of [{}] completed" , prevEntry . snapshot (). getSnapshotId () );
101
+ T response = actionResponseFactory . apply (ri );
102
+ logger .debug ("restore of [{}] completed" , restoreIdentifier );
95
103
listener .onResponse (response );
96
104
} else {
97
- // restore not completed yet, wait for next cluster state update
105
+ logger . debug ( " restore not completed yet, wait for next cluster state update" );
98
106
}
99
107
}
100
108
101
109
/**
102
110
* Creates a cluster state listener and registers it with the cluster service. The listener passed as a
103
111
* parameter will be called when the restore is complete.
104
112
*/
105
- public static void createAndRegisterListener (
113
+ public static < T extends ActionResponse > void createAndRegisterListener (
106
114
ClusterService clusterService ,
107
115
RestoreService .RestoreCompletionResponse response ,
108
- ActionListener <RestoreSnapshotResponse > listener
116
+ ActionListener <T > listener ,
117
+ Function <RestoreInfo , T > actionResponseFactory
109
118
) {
110
- clusterService .addListener (new RestoreClusterStateListener (clusterService , response , listener ));
119
+ clusterService .addListener (new RestoreClusterStateListener < T > (clusterService , response , listener , actionResponseFactory ));
111
120
}
112
121
}
0 commit comments