India's Shikhar Dhawan smashed his sixth hundred and added 188 in an opening partnership with KL Rahul before Sri Lanka's spinners fought back to halt the touring side's progress in the third and final test on Saturday.
India reached the close of play on 329 for six, after losing no wickets in the first session, with Wriddhiman Saha unbeaten on 13 and Hardik Pandya not out on one at stumps.
After winning the toss and opting to bat, India captain Virat Kohli could not have asked for a better start as his side began their bid to complete a series whitewash over the hosts.
Following wins inside four days in Galle and Colombo, the world's top-ranked side have opened an unassailable 2-0 lead and the injury-hit hosts face another stiff task against Kohli's men in the finale.
On a surface ideal for batting, India's openers picked up boundaries at will and made Sri Lanka pay for their profligacy with Dhawan given a reprieve on one, his edge flying through the slip cordon off left-arm seamer Vishwa Fernando.
The left-handed batsman went on to hit 17 fours in his 123-ball knock before he was out for 119, hitting a sweep shot off left-arm spinner Malinda Pushpakumara straight to Sri Lanka captain Dinesh Chandimal at square leg.
Pushpakumara had also provided Sri Lanka a breakthrough in his first over when he dismissed Rahul for 85. The 30-year-old, playing only his second test, later bowled an out-of-sorts Ajinkya Rahane for 17, to end the day with figures of 3-40.
A century once again eluded Rahul, who was dropped twice during his innings, as he was caught at mid-on trying to hit a lofted shot. It was his seventh consecutive score of 50 or more.
Left-arm wrist-spinner Lakshan Sandakan then got Cheteshwar Pujara (eight) to edge one to slip as Sri Lanka continued to fight back.
The 26-year-old, replacing the injured Rangana Herath, also removed the dangerous Kohli with the right-handed batsman out for 42 after getting an edge to slip.
Ravichandran Ashwin (31) was the only wicket to fall to the faster bowlers when he edged Fernando to wicketkeeper Niroshan Dickwella after the hosts had taken the second new ball.
Left-arm wrist spinner Kuldeep Yadav was the only change for the touring side, called up as a replacement for suspended left-arm spinner Ravindra Jadeja.
The hosts have been hurt by injuries throughout the series and will be missing both spin spearhead Herath and paceman Nuwan Pradeep. Middle-order batsman Dhananjaya de Silva was dropped after scores of nought and 17 in Colombo.