@@ -116,8 +116,8 @@ type VllmSimulator struct {
116116 pod string
117117 // tokenizer is currently used in kv-cache and in /tokenize
118118 tokenizer tokenization.Tokenizer
119- // dataset is used for managing dataset files
120- dataset * dataset.Dataset
119+ // dataset is used for token generation in responses
120+ dataset dataset.Dataset
121121}
122122
123123// New creates a new VllmSimulator instance with the given logger
@@ -216,18 +216,9 @@ func (s *VllmSimulator) startSim(ctx context.Context) error {
216216 go s .kvcacheHelper .Run (ctx )
217217 }
218218
219- if s .config .Dataset .Path == "" && s .config .Dataset .Url == "" && s .config .Dataset .SavePath == "" {
220- s .dataset = nil
221- s .logger .Info ("No dataset provided, will generate random responses" )
222- } else {
223- dataset := & dataset.Dataset {
224- Logger : s .logger ,
225- }
226- err = dataset .Init (s .config .Dataset .Path , s .config .Dataset .Url , s .config .Dataset .SavePath )
227- if err != nil {
228- return err
229- }
230- s .dataset = dataset
219+ err = s .initDataset ()
220+ if err != nil {
221+ return fmt .Errorf ("dataset initialization error: %w" , err )
231222 }
232223
233224 // run request processing workers
@@ -239,13 +230,98 @@ func (s *VllmSimulator) startSim(ctx context.Context) error {
239230
240231 listener , err := s .newListener ()
241232 if err != nil {
242- return err
233+ s .logger .Error (err , "Failed to create listener" )
234+ return fmt .Errorf ("listener creation error: %w" , err )
243235 }
244236
245237 // start the http server with context support
246238 return s .startServer (ctx , listener )
247239}
248240
241+ func (s * VllmSimulator ) initDataset () error {
242+ randDataset := & dataset.BaseDataset {
243+ Logger : s .logger ,
244+ }
245+
246+ if s .config .Dataset .Path == "" && s .config .Dataset .Url == "" && s .config .Dataset .SavePath == "" {
247+ s .logger .Info ("No dataset provided, will generate random responses" )
248+ s .dataset = randDataset
249+ } else {
250+ s .logger .Info ("Custom dataset configuration detected" )
251+ s .dataset = & dataset.CustomDataset {
252+ BaseDataset : * randDataset ,
253+ }
254+ }
255+
256+ if err := s .dataset .Init (s .config .Dataset .Path , s .config .Dataset .Url , s .config .Dataset .SavePath ); err != nil {
257+ return fmt .Errorf ("dataset initialization error: %w" , err )
258+ }
259+ return nil
260+ }
261+
262+ func (s * VllmSimulator ) newListener () (net.Listener , error ) {
263+ s .logger .Info ("Server starting" , "port" , s .config .Port )
264+ listener , err := net .Listen ("tcp4" , fmt .Sprintf (":%d" , s .config .Port ))
265+ if err != nil {
266+ return nil , err
267+ }
268+ return listener , nil
269+ }
270+
271+ // startServer starts http server on port defined in command line
272+ func (s * VllmSimulator ) startServer (ctx context.Context , listener net.Listener ) error {
273+ r := fasthttprouter .New ()
274+
275+ // support completion APIs
276+ r .POST ("/v1/chat/completions" , s .HandleChatCompletions )
277+ r .POST ("/v1/completions" , s .HandleTextCompletions )
278+ // supports /models API
279+ r .GET ("/v1/models" , s .HandleModels )
280+ // support load/unload of lora adapter
281+ r .POST ("/v1/load_lora_adapter" , s .HandleLoadLora )
282+ r .POST ("/v1/unload_lora_adapter" , s .HandleUnloadLora )
283+ // supports /metrics prometheus API
284+ r .GET ("/metrics" , fasthttpadaptor .NewFastHTTPHandler (promhttp .HandlerFor (s .registry , promhttp.HandlerOpts {})))
285+ // supports standard Kubernetes health and readiness checks
286+ r .GET ("/health" , s .HandleHealth )
287+ r .GET ("/ready" , s .HandleReady )
288+ r .POST ("/tokenize" , s .HandleTokenize )
289+
290+ server := fasthttp.Server {
291+ ErrorHandler : s .HandleError ,
292+ Handler : r .Handler ,
293+ Logger : s ,
294+ }
295+
296+ // Start server in a goroutine
297+ serverErr := make (chan error , 1 )
298+ go func () {
299+ s .logger .Info ("HTTP server starting" )
300+ serverErr <- server .Serve (listener )
301+ }()
302+
303+ // Wait for either context cancellation or server error
304+ select {
305+ case <- ctx .Done ():
306+ s .logger .Info ("Shutdown signal received, shutting down HTTP server gracefully" )
307+
308+ // Gracefully shutdown the server
309+ if err := server .Shutdown (); err != nil {
310+ s .logger .Error (err , "Error during server shutdown" )
311+ return err
312+ }
313+
314+ s .logger .Info ("HTTP server stopped" )
315+ return nil
316+
317+ case err := <- serverErr :
318+ if err != nil {
319+ s .logger .Error (err , "HTTP server failed" )
320+ }
321+ return err
322+ }
323+ }
324+
249325// Print prints to a log, implementation of fasthttp.Logger
250326func (s * VllmSimulator ) Printf (format string , args ... interface {}) {
251327 s .logger .Info ("Server error" , "msg" , fmt .Sprintf (format , args ... ))
0 commit comments