India set Sri Lanka a daunting 410-run victory target and dented the tourists' top order to maintain their iron grip on the third and final Test on Tuesday, December 5.
Having secured a handy 163-run first-innings lead, India declared on 246/5 about 45 minutes after tea and Sri Lanka were reeling on 31/3 when bad light stopped play with the tourists still needing 379 runs to level the series.
Dhananjaya de Silva was batting on 13 with first-innings centurion Angelo Mathews yet to open his account at the other end.
Mohammad Shami dismissed opener Sadeera Samarawickrama for five with a vicious bouncer before Ravindra Jadeja dealt two late blows, dismissing Dimuth Karunaratne caught behind for 13 and bowling nightwatchman Suranga Lakmal for a duck.
Earlier, Dinesh Chandimal made a career-best 164 to help Sri Lanka post 373 all out, their highest total in the series.
Lakmal denied India a strong start to their second innings, dismissing Murali Vijay for nine.
The paceman was subsequently seen vomiting and temporarily left the field as the Delhi smog continued to affect the match.
Ajinkya Rahane has been the lone batsman in India's top six without a fifty in the series and was sent in ahead of Cheteshwar Pujara in a bid to help him rediscover his form ahead of the tour of South Africa.
The move, however, did not work.
The right-hander survived two reviews and scored only 10 runs before trying to hit his way out of trouble and holing out in the deep off Dilruwan Perera.
Shikhar Dhawan initially looked subdued but the left-hander soon accelerated, stepping out to hit Lakshan Sandakan over his head for a huge six.
The left-arm wrist-spinner had the last laugh, though, as he lured Dhawan into charging out to play a similar shot only to be stumped for 67.
Pujara (49) fell short of his fifty but Virat Kohli (50) and Rohit Sharma (50 not out) batted with characteristic ease against the jaded Sri Lankans to keep India in complete control of the match.