|
18 | 18 | package org.apache.hadoop.hdfs.server.federation.router; |
19 | 19 |
|
20 | 20 | import static org.junit.Assert.assertEquals; |
| 21 | +import static org.junit.Assert.assertNotEquals; |
21 | 22 | import static org.junit.Assert.assertNull; |
22 | 23 |
|
23 | 24 | import java.io.IOException; |
|
37 | 38 | import org.apache.hadoop.hdfs.protocol.ClientProtocol; |
38 | 39 | import org.apache.hadoop.hdfs.protocol.DSQuotaExceededException; |
39 | 40 | import org.apache.hadoop.hdfs.protocol.NSQuotaExceededException; |
40 | | -import org.apache.hadoop.hdfs.server.federation.RouterConfigBuilder; |
41 | 41 | import org.apache.hadoop.hdfs.server.federation.MiniRouterDFSCluster.NamenodeContext; |
42 | 42 | import org.apache.hadoop.hdfs.server.federation.MiniRouterDFSCluster.RouterContext; |
| 43 | +import org.apache.hadoop.hdfs.server.federation.RouterConfigBuilder; |
43 | 44 | import org.apache.hadoop.hdfs.server.federation.StateStoreDFSCluster; |
44 | 45 | import org.apache.hadoop.hdfs.server.federation.resolver.MountTableManager; |
45 | 46 | import org.apache.hadoop.hdfs.server.federation.resolver.MountTableResolver; |
|
49 | 50 | import org.apache.hadoop.hdfs.server.federation.store.protocol.GetMountTableEntriesResponse; |
50 | 51 | import org.apache.hadoop.hdfs.server.federation.store.protocol.RemoveMountTableEntryRequest; |
51 | 52 | import org.apache.hadoop.hdfs.server.federation.store.protocol.RemoveMountTableEntryResponse; |
| 53 | +import org.apache.hadoop.hdfs.server.federation.store.protocol.UpdateMountTableEntryRequest; |
52 | 54 | import org.apache.hadoop.hdfs.server.federation.store.records.MountTable; |
53 | 55 | import org.apache.hadoop.test.GenericTestUtils; |
| 56 | +import org.apache.hadoop.util.Time; |
54 | 57 | import org.junit.After; |
55 | 58 | import org.junit.Before; |
56 | 59 | import org.junit.Test; |
@@ -452,4 +455,42 @@ private List<MountTable> getMountTable(String path) throws IOException { |
452 | 455 |
|
453 | 456 | return removeResponse.getEntries(); |
454 | 457 | } |
| 458 | + |
| 459 | + @Test |
| 460 | + public void testQuotaSynchronization() throws IOException { |
| 461 | + long updateNsQuota = 3; |
| 462 | + long updateSsQuota = 4; |
| 463 | + MountTable mountTable = MountTable.newInstance("/quotaSync", |
| 464 | + Collections.singletonMap("ns0", "/"), Time.now(), Time.now()); |
| 465 | + mountTable.setQuota(new RouterQuotaUsage.Builder().quota(1) |
| 466 | + .spaceQuota(2).build()); |
| 467 | + // Add new mount table |
| 468 | + addMountTable(mountTable); |
| 469 | + |
| 470 | + // ensure the quota is not set as updated value |
| 471 | + QuotaUsage realQuota = nnContext1.getFileSystem() |
| 472 | + .getQuotaUsage(new Path("/")); |
| 473 | + assertNotEquals(updateNsQuota, realQuota.getQuota()); |
| 474 | + assertNotEquals(updateSsQuota, realQuota.getSpaceQuota()); |
| 475 | + |
| 476 | + // Call periodicInvoke to ensure quota updated in quota manager |
| 477 | + // and state store. |
| 478 | + RouterQuotaUpdateService updateService = routerContext.getRouter() |
| 479 | + .getQuotaCacheUpdateService(); |
| 480 | + updateService.periodicInvoke(); |
| 481 | + |
| 482 | + mountTable.setQuota(new RouterQuotaUsage.Builder().quota(updateNsQuota) |
| 483 | + .spaceQuota(updateSsQuota).build()); |
| 484 | + UpdateMountTableEntryRequest updateRequest = UpdateMountTableEntryRequest |
| 485 | + .newInstance(mountTable); |
| 486 | + RouterClient client = routerContext.getAdminClient(); |
| 487 | + MountTableManager mountTableManager = client.getMountTableManager(); |
| 488 | + mountTableManager.updateMountTableEntry(updateRequest); |
| 489 | + |
| 490 | + // verify if the quota is updated in real path |
| 491 | + realQuota = nnContext1.getFileSystem().getQuotaUsage( |
| 492 | + new Path("/")); |
| 493 | + assertEquals(updateNsQuota, realQuota.getQuota()); |
| 494 | + assertEquals(updateSsQuota, realQuota.getSpaceQuota()); |
| 495 | + } |
455 | 496 | } |
0 commit comments