@@ -1874,4 +1874,65 @@ public void testFilesLimit() {
1874
1874
assertEquals (time4 , context .getAmple ().readTablet (e1 ).getTime ());
1875
1875
1876
1876
}
1877
+
1878
+ @ Test
1879
+ public void testRequireAbsentLoaded () {
1880
+ var context = cluster .getServerContext ();
1881
+
1882
+ var stf1 = StoredTabletFile
1883
+ .of (new Path ("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/F0000070.rf" ));
1884
+ var stf2 = StoredTabletFile
1885
+ .of (new Path ("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/F0000071.rf" ));
1886
+ var stf3 = StoredTabletFile
1887
+ .of (new Path ("hdfs://localhost:8020/accumulo/tables/2a/default_tablet/F0000072.rf" ));
1888
+ var dfv = new DataFileValue (100 , 100 );
1889
+
1890
+ FateId fateId1 = FateId .from (FateInstanceType .USER , UUID .randomUUID ());
1891
+
1892
+ try (var ctmi = new ConditionalTabletsMutatorImpl (context )) {
1893
+ ctmi .mutateTablet (e1 ).requireAbsentOperation ()
1894
+ .requireAbsentLoaded (Set .of (stf1 .getTabletFile (), stf2 .getTabletFile ()))
1895
+ .putBulkFile (stf1 .getTabletFile (), fateId1 ).putBulkFile (stf2 .getTabletFile (), fateId1 )
1896
+ .putFile (stf1 , dfv ).putFile (stf2 , dfv ).submit (tm -> false );
1897
+ assertEquals (Status .ACCEPTED , ctmi .process ().get (e1 ).getStatus ());
1898
+ }
1899
+ assertEquals (Set .of (stf1 , stf2 ), context .getAmple ().readTablet (e1 ).getFiles ());
1900
+ assertEquals (Map .of (stf1 , fateId1 , stf2 , fateId1 ),
1901
+ context .getAmple ().readTablet (e1 ).getLoaded ());
1902
+
1903
+ FateId fateId2 = FateId .from (FateInstanceType .USER , UUID .randomUUID ());
1904
+
1905
+ try (var ctmi = new ConditionalTabletsMutatorImpl (context )) {
1906
+ ctmi .mutateTablet (e1 ).requireAbsentOperation ()
1907
+ .requireAbsentLoaded (Set .of (stf3 .getTabletFile ()))
1908
+ .putBulkFile (stf3 .getTabletFile (), fateId2 ).putFile (stf3 , dfv ).submit (tm -> false );
1909
+ assertEquals (Status .ACCEPTED , ctmi .process ().get (e1 ).getStatus ());
1910
+ }
1911
+ assertEquals (Set .of (stf1 , stf2 , stf3 ), context .getAmple ().readTablet (e1 ).getFiles ());
1912
+ assertEquals (Map .of (stf1 , fateId1 , stf2 , fateId1 , stf3 , fateId2 ),
1913
+ context .getAmple ().readTablet (e1 ).getLoaded ());
1914
+
1915
+ // should fail because the loaded markers are present
1916
+ try (var ctmi = new ConditionalTabletsMutatorImpl (context )) {
1917
+ ctmi .mutateTablet (e1 ).requireAbsentOperation ()
1918
+ .requireAbsentLoaded (Set .of (stf1 .getTabletFile (), stf2 .getTabletFile ()))
1919
+ .putBulkFile (stf1 .getTabletFile (), fateId1 ).putBulkFile (stf2 .getTabletFile (), fateId1 )
1920
+ .putFile (stf1 , dfv ).putFile (stf2 , dfv ).putFlushId (99 ).submit (tm -> false );
1921
+ assertEquals (Status .REJECTED , ctmi .process ().get (e1 ).getStatus ());
1922
+ }
1923
+
1924
+ // should fail because the loaded markers are present
1925
+ try (var ctmi = new ConditionalTabletsMutatorImpl (context )) {
1926
+ ctmi .mutateTablet (e1 ).requireAbsentOperation ()
1927
+ .requireAbsentLoaded (Set .of (stf3 .getTabletFile ()))
1928
+ .putBulkFile (stf3 .getTabletFile (), fateId2 ).putFile (stf3 , dfv ).putFlushId (99 )
1929
+ .submit (tm -> false );
1930
+ assertEquals (Status .REJECTED , ctmi .process ().get (e1 ).getStatus ());
1931
+ }
1932
+
1933
+ assertEquals (Set .of (stf1 , stf2 , stf3 ), context .getAmple ().readTablet (e1 ).getFiles ());
1934
+ assertEquals (Map .of (stf1 , fateId1 , stf2 , fateId1 , stf3 , fateId2 ),
1935
+ context .getAmple ().readTablet (e1 ).getLoaded ());
1936
+ assertTrue (context .getAmple ().readTablet (e1 ).getFlushId ().isEmpty ());
1937
+ }
1877
1938
}
0 commit comments