3434import org .elasticsearch .index .shard .IndexShard ;
3535import org .elasticsearch .index .shard .IndexShardTestCase ;
3636import org .elasticsearch .index .translog .Translog ;
37+ import org .elasticsearch .indices .IndicesService ;
3738import org .elasticsearch .plugins .Plugin ;
3839import org .elasticsearch .test .ESSingleNodeTestCase ;
3940import org .elasticsearch .test .InternalSettingsPlugin ;
4748import java .util .concurrent .atomic .AtomicReference ;
4849
4950import static org .elasticsearch .test .InternalSettingsPlugin .TRANSLOG_RETENTION_CHECK_INTERVAL_SETTING ;
51+ import static org .elasticsearch .test .hamcrest .ElasticsearchAssertions .assertAcked ;
5052import static org .hamcrest .core .IsEqual .equalTo ;
5153
5254/** Unit test(s) for IndexService */
@@ -109,22 +111,49 @@ protected String getThreadPool() {
109111 latch2 .get ().countDown ();
110112 assertEquals (2 , count .get ());
111113
112-
113114 task = new IndexService .BaseAsyncTask (indexService , TimeValue .timeValueMillis (1000000 )) {
114115 @ Override
115116 protected void runInternal () {
116117
117118 }
118119 };
119120 assertTrue (task .mustReschedule ());
121+
122+ // now close the index
123+ final Index index = indexService .index ();
124+ assertAcked (client ().admin ().indices ().prepareClose (index .getName ()));
125+ awaitBusy (() -> getInstanceFromNode (IndicesService .class ).hasIndex (index ));
126+
127+ final IndexService closedIndexService = getInstanceFromNode (IndicesService .class ).indexServiceSafe (index );
128+ assertNotSame (indexService , closedIndexService );
129+ assertFalse (task .mustReschedule ());
130+ assertFalse (task .isClosed ());
131+ assertEquals (1000000 , task .getInterval ().millis ());
132+
133+ // now reopen the index
134+ assertAcked (client ().admin ().indices ().prepareOpen (index .getName ()));
135+ awaitBusy (() -> getInstanceFromNode (IndicesService .class ).hasIndex (index ));
136+ indexService = getInstanceFromNode (IndicesService .class ).indexServiceSafe (index );
137+ assertNotSame (closedIndexService , indexService );
138+
139+ task = new IndexService .BaseAsyncTask (indexService , TimeValue .timeValueMillis (100000 )) {
140+ @ Override
141+ protected void runInternal () {
142+
143+ }
144+ };
145+ assertTrue (task .mustReschedule ());
146+ assertFalse (task .isClosed ());
147+ assertTrue (task .isScheduled ());
148+
120149 indexService .close ("simon says" , false );
121150 assertFalse ("no shards left" , task .mustReschedule ());
122151 assertTrue (task .isScheduled ());
123152 task .close ();
124153 assertFalse (task .isScheduled ());
125154 }
126155
127- public void testRefreshTaskIsUpdated () throws IOException {
156+ public void testRefreshTaskIsUpdated () throws Exception {
128157 IndexService indexService = createIndex ("test" , Settings .EMPTY );
129158 IndexService .AsyncRefreshTask refreshTask = indexService .getRefreshTask ();
130159 assertEquals (1000 , refreshTask .getInterval ().millis ());
@@ -167,12 +196,35 @@ public void testRefreshTaskIsUpdated() throws IOException {
167196 assertTrue (refreshTask .isScheduled ());
168197 assertFalse (refreshTask .isClosed ());
169198 assertEquals (200 , refreshTask .getInterval ().millis ());
199+
200+ // now close the index
201+ final Index index = indexService .index ();
202+ assertAcked (client ().admin ().indices ().prepareClose (index .getName ()));
203+ awaitBusy (() -> getInstanceFromNode (IndicesService .class ).hasIndex (index ));
204+
205+ final IndexService closedIndexService = getInstanceFromNode (IndicesService .class ).indexServiceSafe (index );
206+ assertNotSame (indexService , closedIndexService );
207+ assertNotSame (refreshTask , closedIndexService .getRefreshTask ());
208+ assertFalse (closedIndexService .getRefreshTask ().mustReschedule ());
209+ assertFalse (closedIndexService .getRefreshTask ().isClosed ());
210+ assertEquals (200 , closedIndexService .getRefreshTask ().getInterval ().millis ());
211+
212+ // now reopen the index
213+ assertAcked (client ().admin ().indices ().prepareOpen (index .getName ()));
214+ awaitBusy (() -> getInstanceFromNode (IndicesService .class ).hasIndex (index ));
215+ indexService = getInstanceFromNode (IndicesService .class ).indexServiceSafe (index );
216+ assertNotSame (closedIndexService , indexService );
217+ refreshTask = indexService .getRefreshTask ();
218+ assertTrue (indexService .getRefreshTask ().mustReschedule ());
219+ assertTrue (refreshTask .isScheduled ());
220+ assertFalse (refreshTask .isClosed ());
221+
170222 indexService .close ("simon says" , false );
171223 assertFalse (refreshTask .isScheduled ());
172224 assertTrue (refreshTask .isClosed ());
173225 }
174226
175- public void testFsyncTaskIsRunning () throws IOException {
227+ public void testFsyncTaskIsRunning () throws Exception {
176228 Settings settings = Settings .builder ()
177229 .put (IndexSettings .INDEX_TRANSLOG_DURABILITY_SETTING .getKey (), Translog .Durability .ASYNC ).build ();
178230 IndexService indexService = createIndex ("test" , settings );
@@ -182,6 +234,28 @@ public void testFsyncTaskIsRunning() throws IOException {
182234 assertTrue (fsyncTask .mustReschedule ());
183235 assertTrue (fsyncTask .isScheduled ());
184236
237+ // now close the index
238+ final Index index = indexService .index ();
239+ assertAcked (client ().admin ().indices ().prepareClose (index .getName ()));
240+ awaitBusy (() -> getInstanceFromNode (IndicesService .class ).hasIndex (index ));
241+
242+ final IndexService closedIndexService = getInstanceFromNode (IndicesService .class ).indexServiceSafe (index );
243+ assertNotSame (indexService , closedIndexService );
244+ assertNotSame (fsyncTask , closedIndexService .getFsyncTask ());
245+ assertFalse (closedIndexService .getFsyncTask ().mustReschedule ());
246+ assertFalse (closedIndexService .getFsyncTask ().isClosed ());
247+ assertEquals (5000 , closedIndexService .getFsyncTask ().getInterval ().millis ());
248+
249+ // now reopen the index
250+ assertAcked (client ().admin ().indices ().prepareOpen (index .getName ()));
251+ awaitBusy (() -> getInstanceFromNode (IndicesService .class ).hasIndex (index ));
252+ indexService = getInstanceFromNode (IndicesService .class ).indexServiceSafe (index );
253+ assertNotSame (closedIndexService , indexService );
254+ fsyncTask = indexService .getFsyncTask ();
255+ assertTrue (indexService .getRefreshTask ().mustReschedule ());
256+ assertTrue (fsyncTask .isScheduled ());
257+ assertFalse (fsyncTask .isClosed ());
258+
185259 indexService .close ("simon says" , false );
186260 assertFalse (fsyncTask .isScheduled ());
187261 assertTrue (fsyncTask .isClosed ());
0 commit comments