code: func (nDB *NetworkDB) CreateEntry(tname, nid, key string, value []byte) error {
  	nDB.Lock()
  	oldEntry, err := nDB.getEntry(tname, nid, key)
  	if err == nil || (oldEntry != nil && !oldEntry.deleting) {
  		nDB.Unlock()
  		return fmt.Errorf("cannot create entry in table %s with network id %s and key %s, already exists", tname, nid, key)
  	}
  
  	entry := &entry{
  		ltime: nDB.tableClock.Increment(),
  		node:  nDB.config.NodeID,
  		value: value,
  	}
  
  	nDB.createOrUpdateEntry(nid, tname, key, entry)
  	nDB.Unlock()
  
  	if err := nDB.sendTableEvent(TableEventTypeCreate, nid, tname, key, entry); err != nil {
  		return fmt.Errorf("cannot send create event for table %s, %v", tname, err)
  	}
  
  	return nil
  }
docs: // CreateEntry creates a table entry in NetworkDB for given (network,
  // table, key) tuple and if the NetworkDB is part of the cluster
  // propagates this event to the cluster. It is an error to create an
  // entry for the same tuple for which there is already an existing
  // entry unless the current entry is deleting state.